Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика. Базовый курс. Ч.3. Основы алгоритмизации и про- граммирования в среде Visual C++ 2005.pdf
Скачиваний:
69
Добавлен:
05.02.2023
Размер:
3.81 Mб
Скачать

87

#include <windows.h> using namespace std; float t;

enum dni{Monday=1, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday} ;

dni operator++(dni &m) { return (m=dni(m+1));} int main()

{dni d; t=0;

char str[256];

AnsiToOem(" сумма часов раб.недели=", str); for (d=Monday; d<=Friday; d++)

{ if (d == Friday) t=t+8; else t=t+8.25; } ; cout << str <<t<<"\n";

return(0); }

13. ОБРАБОТКА СИМВОЛЬНЫХ СТРОК

13.1. Символьные переменные

Напомним, что для описания символьных переменных служит тип char, соответственно массив символов должен при описании рядом с именем иметь в квадратных скобках указание на размер.

Но для начала рассмотрим работу просто с отдельными символами. Значение символьной переменной может быть задано как с помощью команды присваивания (обратите внимание, что отдельный символ заключается в апострофы), так и с помощью команды ввода cin.

Поскольку мы уже освоили работу с функциями и указателями, то для организации вывода русских сообщений можем разработать отдельную функцию символьного ссылочного типа

char* Rus(const char* str) { AnsiToOem(str,str_rus); return str_rus;}

У этой функции на входе задается символьная константаstr (тот самый русский текст), которая внутри преобразуется с помощью той самой функцииAnsiToOem и преобразованный текст помещается в str_rus. Благодаря этому, выводить русский текст в основной программе можно просто вызовом этой функции(см. пример 13.1)

88

Пример 13.1. Среди последовательно вводимыхN символов подсчитать число восклицательных знаков.

// подсчет числа символов ! #include <iostream> #include <windows.h>

using namespace std;

char* Rus(const char* str); char str_rus[256];

int main()

{char c,c1; int sum=0,i,n;

c1='!'; cout<<Rus(" \n введи значение N \n"); cin>>n;

for (i=1; i<=n; i++)

{cout<<Rus(" \n введи очередной символ "); cin>>c; if (c==c1) sum++; }

cout<<Rus(" количество знаков ")<<c1;

cout<<Rus(" равно ")<<sum<<"\n"; return (0); }

char* Rus(const char* str)

{AnsiToOem(str,str_rus); return str_rus;}

Символы в С++ также имеют коды. Для получения цифрового кода символа достаточно применить операцию перевода в целые: (int) c, где с – символьная переменная. Для получения по коду самого символа достаточно применить операцию по переводу -це лых в символьные (char) k, где k – целое число (код символа).

В рассмотренном ниже примере будем также использовать датчик случайных чисел, который мы уже использовали в разделе8. Напомним, что на языке++ Сон реализуется функцией rand()%RAND_MAX – дает случайное целое число из интервала от

0 до положительного целого RAND_MAX-1 (в качестве RAND_MAX можно указать сразу конкретное число). Кроме того, для запуска этого датчика случайных чисел(чтобы получать новый набор случайных чисел при каждом новом запуске программы), используют функцию srand(time(0)), т.е. для старта генератора случайных чисел будет использоваться системное время компьютера. Причем это время следует преобразовать в беззнаковое целое(unsigned int). Кроме того, требуется подключить заголовочный файл <stdlib.h>, содержащий эти функции. Для получения системного времени нужно подключить заголовочный файл <time.h>

89

Наиболее употребительные символы имеют коды в интервале от 33 до 122, поэтому в программе предусмотрено дополнительно ограничение на получение случайных чисел из интервала 33от до 123.

Здесь мы также впервые использует командуgoto метка. Метка в С++ задается как и любой идентификатор(название метки начинается с буквы) и не требует описания(в отличие от Паскаля). Признаком метки является двоеточие сразу после нее.

Пример 13.2. Составить программу«клавиатурный тренажер» (случайным образом выводится символ, который следует нажать на клавиатуре).

// клавиатурный тренажер (распознание символа по коду) #include <iostream>

#include <stdlib.h> #include <windows.h> #include <time.h> using namespace std;

char* Rus (const char* str); char str_rus[256];

int kod,n, r_max, r_min; char c,d; int main ()

{srand( (unsigned)time(0) ); One:

r_min=33; r_max=123; kod=(double)rand()/(RAND_MAX+1)*(r_max-r_min)+r_min; c=(char)kod; cout<<Rus(" нажми ")<<c<<"\n";

cin>>d;

if ((int)d==kod) cout<<Rus(" правильно \n "); else cout<<Rus(" нет \n");

goto One; return (0);}

char* Rus (const char* str) { AnsiToOem(str, str_rus); return str_rus;}

Данная программа будет работать непрерывно(«зациклили» оператором перехода goto One). Чтобы прервать ее работу достаточно нажать Ctrl-C.

Замечание. Коды символов кириллицы задаются в С++ отрицательными числами!

Для демонстрации кодов русских букв рекомендуем набрать следующую программку (см. пример 13.3).

90

13.2.Символьные строки (как массивы символов)

Ксожалению, в С++ отсутствует тип «строка» (хотя для создания строк здесь имеются более мощные средства). Мы сначала будем рассматривать строки как массивы символов.

Пример 13.3. Распечатать коды русских букв(предварительно записав их в виде массива символов).

//вывод кодов русских букв

#include <iostream> #include <iomanip> #include <windows.h> using namespace std;

char* Rus (const char* str); char str_rus[256],salf[65],sal; int main()

{ int i; char rusalf[65]=

"АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщъЫыьЭэ ЮюЯя";

cout<< Rus(" \n КОДЫ РУССКИХ БУКВ ")<<"\n"; AnsiToOem(rusalf, salf);

for (i=0; i<=64; i++)

//для вывода ровными столбиками по 8 применяется if { sal=salf[i];

cout<<setw(5)<<sal<<setw(3)<<(int)rusalf[i]; if (i%8 == 7)cout<<"\n";}

return (0);}

char* Rus (const char* str) { AnsiToOem(str, str_rus); return str_rus;}

При запуске программки получим (рис. 8.30):

Рис. 8.30. Результат работы программы примера 13.3

91

В рассмотренном примере строка текста (в виде массива символов) заполнялась внутри программки путем присваивания. Значительно важнее было бы научиться вводить значение строки извне с помощью той же командыcin. К сожалению, если при вводе в

строке будет пробел, то cin воспримет его как конец строки и остановит запись в буфер. Кроме того, если пользователь введет больше символов, чем описано, то оператор cin отбросит последние символы. Для преодоления этого организуют так называемый метод cin.get(). В нем указывается строка для ввода и ее максимальная длина. В данном случае указываем79, хотя строка описана на 80 символов потому, что символы на самом деле нумеруются с 0 и последний символ массива всегда «\0» (null).

Пример 13.4. Введенную строку текста разбить на отдельные слова, т.е. вывести каждое слово в отдельную строку.

// ввод строки текста и разбиение на слова

#include <iostream> #include <windows.h> #include <string> using namespace std;

char* Rus(const char* str); char str_rus[256];

int main()

{char s[80];int n,i;

cout <<Rus("\n введи строку текста \n"); cin.get(s,79);

n=strlen(s);cout<<Rus("\n текст разбит на слова:\n"); for (i=0; i<n; i++)

{ if (s[i] ==' ') cout<<"\n"; else cout<<s[i]; } cout<<"\n";

return (0); }

char* Rus(const char* str) {AnsiToOem(str, str_rus); return str_rus;}

Здесь мы использовали специальную функциюstrlen(s), которая позволяет получить реальную длину строкиs (сколько именно символов было введено).