Тема 9. Символы. Строки

До этого рассматривались задачи и операции над числами с типом int или float. Теперь же будем работать с символами. Символы могут по разному объявляться в С++, но основной их тип – char.

К примеру, запись:

char c;

означает, что мы создали переменную с, которая является символом. Для хранения символа отводится память в 1 байт – то есть 8 бит. Это значит, что всего может быть 256 символов данного типа (с 00000000 до 11111111 – это 8 бит). Все 256 символов представляют собой специальную таблицу ASCII (American Standard of Coding for Information Interchange). В ней представлены основные символы, которые могут и не могут быть введены с клавиатуры (латинские и русские маленькие и большие буквы, цифры, математические знаки, пунктуационные и т.д.), а также специальные знаки, необходимые для работы операционной системы (но мы их не видим).

На самом деле тип char не хранит в себе символ, он хранит в себе код ASCII, соответствующий этому символу. Этот код стандартен и не меняется для любого символа. К примеру, символ ' ' (пробел) имеет код 32, символ '0' – 48, а символ 'я' – 255. Подробно об этих кодах смотрите ниже

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

char c = ‘L’; // теперь переменная с хранит код буквы L, но нам видна именно буква, не код

Символ объявляется в одинарных кавычках. Символы, как и числа, могут сравниваться, но сравниваем мы не сами символы, а их коды. Пример:

char c1 = ‘ ’, c2 = ‘0’, c3 = ‘D’, c4 = ‘ф’, c5 = ‘Ф’; // объявим пять символов

c1 < c2; // это истина, т.к. пробел меньше, чем 0, потому что код пробела 32, а код 0 – 48.

c3 > c2; // это истина, т.к код D больше кода 0

c4 == c5; // это ложь, т.к. код ф не равен коду Ф

с5 <= c4; // это истина, т.к. код ф больше либо равен коду Ф

с1 < c2 < c3 < c5 < c4; // верно, т.к. код ф самый большой, а код пробела самый маленький

К символам можно применять специальные логические функции (те, которые дают в качестве результата 1 (истина) или 0 (ложь)). Вот список основных (пусть есть какой-то символ с):

isalnum(c) – дает 1, если с – цифра или латинская большая или маленькая буква, иначе будет 0;

isalpha(c) – дает 1, если с – латинская большая или маленькая буква, иначе будет 0;

isdigit(c) – дает 1, если с – цифра, иначе будет 0;

islower(c) – дает 1, если с – латинская маленькая буква, иначе будет 0;

isupper(c) – дает 1, если с – латинская большая буква, иначе будет 0;

isspace(c) – дает 1, если с – пробел, иначе будет 0;

ispunct(c) – дает 1, если с – любой пунктуационный знак, иначе будет 0;

tolower(c) – меняет с на маленькую латинскую букву, если с – большая, если же с – маленькая, ничего не происходит;

toupper(c) – меняет с на большую латинскую букву, если с – маленькая, если же с – большая, ничего не происходит.

Строки

Строка – это набор символов, или, другими словам, массив символов. Тогда можно создать строку следующим образом:

char c[20]; // создаем массив символов из 20 элементов, т.е. строку из 20 символов

С этим массивом можно обращаться, как с обычным. К примеру,

char c[5] = “Дуб”; // здесь с[0] = ‘Д’, c[1] = ‘у’, c[2] = ‘б’, остальные элементы равны 0.

Строка пишется в двойных кавычках (“”). Даже если в строке один символ. То есть, 'F' и “F” – не одно и то же: в первом случае F – это символ и занимает 1 байт, во втором случае F – строка, она занимает 2 байта, так как в ней, фактически, 2 символа. Об этом ниже.

Есть одно очень важное отличие от обычных массивов. Для правильной работы со строками типа char, программа должна в конце строки ставить «терминатор» строки, т.е. символ, который говорит, что строка кончилась. Мы этот символ не видим, но всегда должны его учитывать (его код в таблице ASCII равен 0). Имеет он следующий вид: '\0' (обратный слэш 0). В размере массива он занимает место последнего элемента (1 байт), то есть размер строки не является фактическим размером массива для хранения этой строки, только размер строки + 1. Пример,

char c[5] = “Лось”; // эта запись правильна, так как c[0] = 'Л', c[1] = 'о', c[2] = 'с', c[3] = 'ь', //c[4] = '\0'

char c[3] = “Cat”; // эта запись неправильна, так как c[0] = 'C', c[1] = 'a', c[2] = 't', c[3] //должно быть '\0', чтоб закончить строку, но такого элемента с таким индексом нет, так //как закончился размер массива, поэтому будет ошибка.

То есть, при создании массива с определенным количеством символов, необходимо понимать, что самих видимых символов должно быть, как минимум, меньше размера массива на 1, т.к. последний элемент всегда '\0'

Запись 'Крот' неверна, так как одинарные кавычки только для единичных символов, не для строки.

Edit1->Text – это строка, которая тоже может хранить в себе символы и быть массивом. Но, в отличии от остальных массивов, ее индексы начинаются НЕ с 0, А с 1. Иначе будет ошибка. К примеру, у нас в Edit1 на форме программы написано Привет. Тогда,

Edit1->Text[1] = ‘П’, Edit1->Text[2] = ‘р’, Edit1->Text[3] = ‘и’, Edit1->Text[4] = ‘в’, Edit1->Text[5] = ‘е’, Edit1->Text[6] = ‘т’.

Есть специальная функция для нахождения длины строки Edit (ведь мы сами решаем, сколько символов туда вписать). Эта функция имеет вид:

Edit1->Text.Length()

Результатом этой функции будет число, соответствующее количеству знаков в Edit1. Между Text и Length стоит точка.

Чтобы ввести массив символом посимвольно через Edit1, пишется следующее:

int N = Edit1->Text.Length(); // узнаем, сколько всего символов в Edit

for (int i=0; i<N; i++)

{c[i] = Edit1->Text[i+1];}// присваиваем первому элементу массива с первый элемент //строки Edit. В Edit1 пишется i+1 вместо i, потому что индекс массива с начинается с 0, а //индекс Edit на единицу больше – с 1.

Выводится массив так:

for (int i=0; i<N; i++)

{Edit1->Text=Edit1->Text+c[i];} // пишется так, чтобы подразумевалось, что новое //значение Edit будет равно старому + символ массива с. То есть, чтобы при считке //каждого элемента массива, предыдущие элементы не убирались, а сохранялись в Edit

Примеры задач

Задача 1. Ввести последовательность символов из 20 или меньше элементов. Найти количество звездочек ('*').

void __fastcall TForm1::Button1Click(TObject *Sender)

{

char c[20]; // создаем символьный массив из 20 штук

int kol=0; // переменная под кол-во

int N=Edit1->Text.Length(); // сколько символов в Edit

if (N>20) N=20; // если же в Edit больше 20 символов, то все остальный в программе не //будут учитываться, они отрасываются

for (int i=0; i<N; i++)

{c[i]=Edit1->Text[i+1]; // вводим массив из Edit

if (c[i]=='*')

{kol++;} // если элемент – звездочка, прибавляем к кол-ву единицу

}

Edit2->Text=IntToStr(kol); // выводим кол-во

}

Задача 2. Ввести последовательность символов из 20 или меньше элементов. Заменить все 'a' на '!'.

void __fastcall TForm1::Button1Click(TObject *Sender)

{

char c[20];

int N=Edit1->Text.Length();

if (N>20) N=20;

for (int i=0; i<N; i++)

{c[i]=Edit1->Text[i+1];

if (c[i]=='a')

{c[i]='!';} // если символ а, то меняем его на!

}

for (int i=0; i<N; i++)

Edit2->Text=Edit2->Text+c[i]; // выводим полученный массив в Edit2

}

Задача 3. Ввести последовательность символов из 20 или меньше элементов. Вывести сообщение, если в строке присутствует хотя бы одна большая латинская буква.

void __fastcall TForm1::Button1Click(TObject *Sender)

{

char c[20];

int N=Edit1->Text.Length();

if (N>20) N=20;

for (int i=0; i<N; i++)

{c[i]=Edit1->Text[i+1];

if (isupper(c[i]))//используем функцию, которая говорит, является ли элемент этой буквой

{ShowMessage(“В строке есть большая латинская буква”);

return;} // используем тут return, чтобы досрочно остановить программу, это нужно чтобы, если нашлась такая буква, цикл не искал дальше и не выводил еще сообщений, если найдет. Поэтому, как только буква найдена, выдаем сообщение и заканчиваем программу.

}

ShowMessage(“Нет больших букв”); // если же цикл не нашел буквы, то выдаем сообщение

}

Д/з

1. Ввести последовательность символов из 15 или меньше элементов. Найти количество двоеточий.

2. Ввести последовательность символов из 18 или меньше элементов. Заменить все цифры на '='.

3. Ввести последовательность символов из 11 или меньше элементов. Найти количество пунктуационных знаков.

4*. Ввести последовательность символов из 10 или меньше элементов. Определить, присутствует ли в строке хотя бы один математический оператор и вывести сообщение об этом.

5. (дополнительно и отдельно на 12) Ввести последовательность символов из 30 или меньше элементов. Поменять первые буквы всех слов на большие. Учесть, что первый символ (если буква) – это начало слова.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: