Строковые переменные.

При написании программ для какого-нибудь электронного устройства часто возникает необходимость записать в память какой-то текст для дальнейшей его обработки, например, для вывода информации на дисплей. Текстовую информацию в C++ и других языках программирования называют строками. Работа со строками в C++ требует от программиста большой аккуратности и внимательности.

По своей сути строка это всего лишь массив символьного типа (char или unsigned char). Поэтому, чтобы создать переменную, в которой будет храниться строка, нужно создать массив символьного типа. Количество элементов в массиве должно быть на 1 больше, чем максимальное количество символов в строке т.к. все строки в С++ должны заканчиваться нулевым символом – это признак конца строки.  Например, если мы хотим использовать строку “Hello World!!!” (в ней 14 символов, пробел – тоже символ), нужно объявить массив из не менее, чем 15 элементов. :

char s[15]; - создаем строковую переменную s (массив из 15 элементов типа char). В ней мы можем хранить строки длиной не более 14 символов.

или

char s[15] = “Hello World!!!”; – создаем строковую переменную s и присваиваем ей строку «Hello World!!!».

Работать со строками можно точно так же, как и с обычным массивом. Например можно вывести на экран отдельные символы, обратившись к конкретному элементы массива, например:

char s[15] = “Hello World!!!”;

cout<<s[0]<<” ”<<s[6]<<” “<<s[11]; - выводим на экран через пробел нулевой (самый первый) символ «H» (напомню, что отсчет ведется с 0), шестой символ «W» и 11-й символ «!».

Можно вывести и всю строку целиком:

cout<<s;

Мы можем принудительно укоротить строку, поставив в нужном месте признак конца строки:

char s[15] = “Hello World!!!”;

s[5]=0;

cout<<s;

 

Теперь на экран выведется только часть строки, поскольку признак конца строки установлен вместо 5-го символа (пробела):

 

 

Строки можно вводить и с клавиатуры:

char s[30];

cout <<”Введите свое имя: ”;

cin>>s;

cout<<”Здравствуйте, ”<<s;

ВНИМАНИЕ! В этом примере максимальная длина строки составляет 29 символов (плюс 1 символ – признак конца строки). Однако, если вы введете с клавиатуры более длинную строку, например 50 символов, то программа НЕ сообщит об ошибке. Оператор cin просто запишет 51 символ в массив s. Другими словами, наша строка выйдет за приделы массива. К чему это приведет? В НЕКОТОРЫХ случаях программа будет работать корректно. Однако вполне вероятно, что работа программы или даже всей операционной системы будет нарушена!!! Все зависит от того, куда были записаны «лишние». Если в этом месте в памяти компьютера содержались команды процессора, то программа может начать выполнять команды, которых в ней изначально не было. Поэтому внимательно следите, чтобы фактическое количество символов в строке не превышало размер отведенного для нее места (размер массива).

Для работы со строками есть ряд полезных функций, которые содержаться в модуле «string.h». Его нужно подключить в начале программы записав include<string.h>. В частности в нем есть функции:

strlen() – вычисляет фактическая длина строки.

strcat() – объединяет две строки.

strcpy() – копирует символы из одной строки в другую.

Напишем программу, которая по очереди запросит Фамилию, Имя и Отчество, объединит их в одну строку, затем программа вычислит длину строки и «зашифрует» ваши данные.

 

Скачайте эту программу, поместите скачанный файл STR.CPP в папку C:\TCPP\BIN\.

Запустите DOSBox (Как настроить эту программу можно посмотреть ЗДЕСЬ).

Нажмите клавишу F3. Выберите файл STR.CPP и нажмите клавишу Enter.

tc_060

На экране появится текст программы:

tc_061

Рассмотрим эту программу подробнее:

include<iostream.h>

#include<conio.h>

#include<string.h>  - подключаем модуль string.h, чтобы использовать некоторые функции для работы со строками.

unsigned char Encrypt(unsigned char c){ - создаем и описываем функцию Encrypt, которая будет шифровать символы в нашей строке. Входным параметром функции является переменная c типа unsigned char. Тип возвращаемого функцией значения так же unsigned char. Когда мы вызываем эту функцию, мы в качестве входного параметра указываем символ (точнее его номер в кодовой таблице). Далее эта функция преобразует номер этого символа, и возвращает другой символ (номер другого символа). Номера символов в кодовой таблице мы уже выводили, рассматривая урок, посвященный циклу FOR (Повторить этот урок можно ЗДЕСЬ).

  if ((c>=128)&(c<=159)) return 159-(c-128); - если буква – заглавная русская (номера заглавных русских букв от 128 до 159, т.е. переменная c больше либо равна 128 и меньше либо равна 159), то вычисляем номер другой заглавной буквы, которую мы подставим вместо исходной буквы. Суть шифрования следующая: Если это первая буква алфавита (А), то мы вместо нее ставим последнюю букву алфавита (Я). Если это вторая буква алфавита (Б), то вместо нее ставим предпоследнюю букву алфавита (Ю) и так далее. Например, если в качестве входного параметра мы задали букву «А» (ее номер 128), то в результате математической операции мы получим 159-(128-128)=159. Это номер буквы «Я». Если в качестве входного параметра взята буква «Э» (ее номер 157), то в результате математической операции получаем 159-(157-128)=130. Это номер буквы «В»

  else if ((c>=160)&(c<=175)) return 239-(c-160); - Иначе, если буква строчная (от «а» до «п»), проводим аналогичное математическое преобразование. Единственное отличие от алгоритма для заглавных букв в том, что строчный буквы в таблице символов расположены не единым блоком, а поделены на две части: буквы от «а» до «п» имеют номера от 160 до 175, а буквы от «р» до «я» имеют номера от 224 до 239. И для больших и для маленьких букв, буква «ё» не шифруется.

  else if ((c>=224)&(c<=239)) return 175-(c-224); - Иначе если буква строчная (от «р» до «я»), проводим математическое преобразование.

  else return c; - иначе (если не заглавные и не строчные русские буквы, вообще не русские буквы), возвращаем исходный символ, то есть не шифруем его.

} – конец функции Encrypt.

void main(){

 unsigned char lastName[30], firstName[30], middleName[30],FIO[100]=""; - создаем 4 строковые переменные. В переменной lastName будем хранить фамилию, в firstName – имя, в middleName - отчество, а в FIO – полное имя, то есть имя отчество и фамилию. Переменной FIO приравниваем начальное значение – пустую строку. Длина строки для фамилии, имени и отчества ограничена 30 символами, а для полного имени (FIO) – 100 символами.

 clrscr();

 cout<<"Введите вашу фамилию: "; - просьба ввести фамилию

 cin>>lastName; - вводим с клавиатуры фамилию. После нажатия клавиши Enter, введенная строка записывается в переменную lastName.

 cout<<"Введите ваше имя: "; - аналогично для имени и отчества.

 cin>>firstName;

 cout<<"Введите ваше отчество: ";

 cin>>middleName;

 strcat(FIO,firstName); - объединяем значения строковых переменных FIO и firstName, а результат записываем в переменную FIO. Поскольку в FIO изначально содержалась пустая строка, то после этой операции в ней будет содержаться только имя (значение переменной firstName).

 strcat(FIO," "); - объединяем значение строковой переменной FIO и строку “ “ (пробел). Другими словами, добавляем в конец строки, содержащейся в  FIO пробел.

 strcat(FIO,middleName); - добавляем к строке, содержащейся в FIO, строку, содержащую отчество.

 strcat(FIO," "); - добавляем еще один пробел.

 strcat(FIO,lastName); - добавляем к FIO фамилию.

 cout<<"\nДобрый день, "<<FIO<<"!\n"; - выводим приветствие – «Добрый день», затем строку, содержащуюся в FIO (Имя, отчество и фамилия).

 cout<<"Длина строки, содержащей ваше ФИО, составляет "<<strlen(FIO)<<" символов."; - выводим длину строки.

 cout<<"\nШифруем ваше ФИО: \n"; - выводим фразу о начале шифрования ФИО.

 for (int i=0; i<strlen(FIO);i++) – «проходим» по всей строке. Переменная i приобретает значения о 0 до длины строки минус 1. (Напоминаю, что если длина строки, например, 20 символов, то последний символ будет иметь индекс 19).

   FIO[i]=Encrypt(FIO[i]); - каждому символу строковой переменной FIO приравниваем значение функции Encrypt вызванной для данного символа. Шифруем каждый символ с помощью функции Encrypt.

 cout<<FIO; - выводим на экран зашифрованное ФИО.

  getch(); - ждем нажатия любой клавиши, чтобы выйти из программы.

} – конец функции main и всей программы.

Чтобы запустить программу, нажимаем комбинацию клавиш Alt+R, выбираем в появившемся меню пункт Run и нажимаем клавишу Enter. Ни в коем случае не нажимайте для запуска программы комбинацию клавиш Ctrl+F9 – это закроет DOSBox!

tc_062

Программа предлагает ввести фамилию, имя и отчество. Вводим эти данные с клавиатуры, каждый раз нажимая клавишу Enter:

tc_063

Далее программа выводит приветствие, длину строки, содержащей полное имя, затем шифрует ФИО и выводит на экран:

tc_064

При нажатии на любую клавишу программа закроется.

ЗАДАНИЕ: напишите программу, которая будет просить ввести какое либо слово. После ввода слова, программа будет выводить его задом наперед. Например, вы ввели «Привет!», а программа выведет на экран «!тевирП».

Ответ можно прислать на электронную почту education@etriz.ru. Туда же можно писать свои вопросы, если что-то не до конца понятно. (Не забудьте указать Фамилию и Имя).