§ 8. Сімвальныя велічыні

Для захоўвання значэння аднаго сімвала ў мове С++ выкарыстоўваецца тып char. Велічыня дадзенага тыпу займае ў памяці камп’ютара 1 байт. Значэннем велічыні можа быць любы сімвал кодавай табліцы ASCII [1]якая прыведзена ў  дадатку да главы 1 (гл. Дадатак да главы 1).

У табліцы кожны знак мае свой нумар. Сімвалы з нумарамі 0—32 з’яўляюцца службовымі, і не ўсе з іх маюць візуальнае адлюстраванне. Напрыклад, сімвал з нумарам 9 — сімвал, які адпавядае націсканню клавішы Tab, сімвал з нумарам 13 адпавядае націсканню клавішы Enter. Сімвал з нумарам 32 адпавядае прабелу, ён таксама не бачны на экране.

Пераменнай тыпу char можна прысвоіць значэнне сімвала, пры гэтым сам сімвал ставіцца ў адзінарнае двукоссе. Таксама пераменнай тыпу char можна прысвоіць лікавае значэнне. Гэта значэнне — код сімвала ў табліцы. Калі прысвоіць пераменнай тыпу int значэнне пераменнай тыпу char, то будзе прысвоены кодавы нумар. Сімвалы можна ўводзіць і выводзіць гэтак жа, як лікі  (прыклад 8.1).

Сімвалы можна параўноўваць, пры гэтым будуць параўноўвацца іх коды. Гэта азначае, што большы той сімвал, у якога код большы (прыклад 8.2).

Пры рабоце з кансоллю карэктна апрацоўваюцца толькі сімвалы з першай часткі кодавай табліцы, г. зн. сімвалы з кодавымі нумарамі ад 0 да 127. У другой частцы кодавай табліцы знаходзяцца рускія літары, якія, як вы ўжо бачылі раней, выводзяцца некарэктна. Каманда setlocale дазваляе вырашыць праблему з карэктным вывадам рускіх літар, але не з уводам.

Прыклад 8.3. Вывесці на экран кодавую табліцу ASCII (пачынаючы з сімвала з кодам 32).

Этапы выканання задання

I. Вынік не залежыць ад зыходных даных.

II. Вынік: табліца сімвалаў.

III. Алгарытм рашэння задачы.

1. У цыкле ад 32 да 255 перабіраем значэнне кода сімвала.
2. 
Выводзім код сімвала і сімвал. Для вываду сімвала пераменную тыпу int ператвараем у пераменную тыпу char.
3. Каб сімвалы размяшчаліся адзін пад адным, задаём шырыню вобласці вываду. Праз кожныя 8 сімвалаў пераходзім на новы радок.

IV. Выкарыстоўваецца лакальная пераменнаятыпу int у цыкле і c char.

З выніку работы праграмы прыкладу 8.3 бачна, што рускія літары ўсё ж прысутнічаюць у кодавай табліцы. Ведаючы коды гэтых сімвалаў, можна арганізаваць увод і вывад рускіх літар, напісаўшы адпаведныя функцыі пераўтварэння. Аднак гэта не вельмі зручна.

Для магчымасці ўводу і вываду рускіх літар можна выкарыстаць каманды з бібліятэкі windows.h. Уводам сімвалаў кіруе каманда SetConsoleCP(1251), а каманда SetConsoleOutputCP(1251) кіруе вывадам (прыклад 8.4). Гэтыя каманды дазваляюць выкарыстоўваць на кансолі кодавую табліцу Windows 1251 (стандартная 8-бітная кадзіроўка для рускамоўных версій Microsoft Windows) замест вызначанай па змоўчанні табліцы ASCII. Табліца Windows 1251 выкарыстоўваецца і ў рэдактары кода сістэмы праграміравання Code::Bloks  (прыклад 8.5).

У C++ ёсць магчымасць выводзіць кіруючыя сімвалы. Яны пачынаюцца з сімвала «\» (адваротнага слэша, бэкслэша), за якім ідзе пэўная літара або лічба. Найбольш распаўсюджаныя — '\n' (перавод радка) і '\t' (табуляцыя) (прыклад 8.6). Іншыя сімвалы можна паглядзець у Дадатку да главы 1.

І '\n', і endl абодва пераводзяць курсор на натсупны радок. У чым паміж імі розніца? Пры выкарыстанні cout даныя для вываду могуць змяшчацца ў буфер даных [2], г. зн. cout можа не накіроўваць даныя адразу ж на вывад. Замест гэтага ён можа пакінуць іх пры сабе на некаторы час. Выкарыстанне endl гарантуе, што ўсе даныя з буфера будуць выведзены, перад тым як працягнуць. Выкарыстанне endl можа выклікаць зніжэнне прадукцыйнасці, асабліва калі запіс на ўстройства адбываецца павольна (напрыклад, запіс даных у файл).


[1] ASCII — от англ. American Standard Code for Information Interchange. С кодовыми таблицами вы познакомитесь позднее.

[2] Буфер данных — специальная область памяти, используемая для ввода/вывода, в котором накапливаются данные до тех пор, пока не будет нажата клавиша  Enter или буфер не заполнится полностью. После этого накопленный блок данных становится доступным программе.

Тып даных char з’яўляецца знакавым тыпам і можа захоўваць лікавыя значэнні ад –128 да 127. Для работы з сімваламі выкарыстоўваюць дыяпазон 0..127. Паколькі тып char захоўвае лік, то ў дачыненні да яго можа быць выкарыстаны мадыфікатар unsigned. У гэтым выпадку дыяпазон лікавых значэнняў ад 0 да 255.

Прыклад 8.1. Дзеянні з сімвальнымі велічынямі.

#include <iostream>

 

using namespace std;

 

int main()

{

  char a, b, c;

  cout << "vvedi simvol" << endl;

  cin >> a;

  b = '#';

  c = 65;

  cout << "simvoly: " << endl;

  cout << a << ' ' << b << ' ' << c;

  int x = a, y = b, z = c;

  cout << endl << "cody: " << endl;

  cout << x << ' ' << y << ' ' << z;

  return 0;

}

Тэсціраванне:

Прыклад 8.2. Параўнанне сімвалаў.

#include <iostream>

 

using namespace std;

 

int main()

{

  char a, b;

  cout << "vvedi 2 simvola" << endl;

  cin >> a >> b;

  if (> b)

    cout << a << " > " << b << endl;

  else

    cout << a << " < " << b << endl;

  return 0;

}

Тэсціраванне:

Прыклад 8.3.

V. Праграма:

#include <iostream>

#include <iomanip>

 

using namespace std;

 

int main()

{

  for (int i = 32; i < 256; i++){

    char c = i;

    cout.width(5);

    cout << i << " " << c;

    if (% 8 == 7)

      cout << endl;

  }

  return 0;

}

 VI. Тэсціраванне:

Прыклад 8.4. Вывад пяці рускіх літар, размешчаных у табліцы пасля ўведзенай літары.

Праграма:

#include <iostream>

#include <windows.h>

 

using namespace std;

 

int main()

{

  SetConsoleCP(1251);

  SetConsoleOutputCP(1251);

  char c;

  cout << "літара" << endl;

  cin >> c;

  cout << "5 літар пасля" << endl;

  for (char i = c + 1; i < c + 6; i++)

    cout << i << ' ';

  return 0;

}

Тэсціраванне:

Прыклад 8.5. Радок стану.

Прыклад 8.6. Выкарыстанне кіруючых сімвалаў (на прыкладзе праграмы з прыкладу 8.4).

Праграма:

#include <iostream>

#include <windows.h>

 

using namespace std;

 

int main()

{

  SetConsoleCP(1251);

  SetConsoleOutputCP(1251);

  char c;

  cout << "літара" << '\n';

  cin >> c;

  cout << "5 літар пасля" << '\n';

  for (char i = c + 1; i < c + 6; i++)

    cout << i << '\t';

  cout << '\n';

  return 0;

}

Тэсціраванне:

Звярніце ўвагу, што ў кодавай табліцы ASCII паміж літарамі «п» і «р» знаходзяцца сімвалы псеўдаграфікі, якіх няма ў кодавай табліцы Windows 1251.