Символьные массивы в языке С++. Работа со строками. Лекция 6

Содержание

Слайд 2

Цели и задачи лекции

Цель леции – изучить использование массивов в языке программирования

Цели и задачи лекции Цель леции – изучить использование массивов в языке программирования С++
С++

Слайд 3

Теоретическая часть

В языке программирования С заложены средства для задания последовательностей упорядоченных данных.

Теоретическая часть В языке программирования С заложены средства для задания последовательностей упорядоченных
Такие последовательности называются массивами. В массивах должны быть упорядочены данные одного и того же типа. В данной лабораторной работе будут рассматриваться массивы символов, которые определятся типом char. Одномерный массив наиболее часто применяется в виде строки символов.

Слайд 4

Теоретическая часть

Строка – это одномерный массив символов, заканчивающийся нулевым символом [1; 2].

Теоретическая часть Строка – это одномерный массив символов, заканчивающийся нулевым символом [1;
В языке С признаком окончания строки служит символ '\0'. При объявлении массива символов, предназначенного для хранения строки, необходимо отвести одно место для нуля, т.е. для символа окончания строки '\0'.

Слайд 5

Теоретическая часть

Например, если дана строка qwerty, в которой 6 символов, каждый из

Теоретическая часть Например, если дана строка qwerty, в которой 6 символов, каждый
которых занимает в памяти 1 байт, то при инициализации такой строки необходимо отвести 1 байт для нулевого символа. Поэтому следует сделать объявление строки для семи символов:
char str[7] = "qwerty";

Слайд 6

Теоретическая часть

Альтернативным объявлением может служить безразмерная инициализация:
Char str[ ] = "qwerty";
При этом

Теоретическая часть Альтернативным объявлением может служить безразмерная инициализация: Char str[ ] =
в случае определения длины строки результатом будет число 6. Размер строки не изменится, если в ней указать символ окончания строки:
char str[ ] = "qwerty\0";

Слайд 7

Теоретическая часть

Аналогично числовым массивам в языке С могут использоваться массивы строк, т.е.

Теоретическая часть Аналогично числовым массивам в языке С могут использоваться массивы строк,
набор одномерных массивов символов. Например, сервер базы данных сверяет команды пользователей с массивом допустимых команд. В качестве массива строк для этого случая будет служить двухмерный символьный массив. Размер левого измерения определяет количество строк, а правого – максимальную длину каждой строки.

Слайд 8

Теоретическая часть

Например:
char str[30][80];
Число 30 – это количество строк массива, а число 80

Теоретическая часть Например: char str[30][80]; Число 30 – это количество строк массива,
– максимальная длина каждой строки с учетом нулевого символа завершения строки.
Чтобы обратиться к отдельной строке двухмерного символьного массива, достаточно указать только левый индекс объявленного массива.

Слайд 9

Теоретическая часть

Многомерные символьные массивы образуются, как и числовые массивы:
char str[n][m]...[N];
В объявлении массива

Теоретическая часть Многомерные символьные массивы образуются, как и числовые массивы: char str[n][m]...[N];
n – первая размерность, m – вторая размерность, ..., N – N -я (последняя) размерность. Значения размерностей – целые неотрицательные числа.

Слайд 10

Одномерные символьные массивы – строки

Одномерный массив – это список связанных однотипных переменных.
Общая

Одномерные символьные массивы – строки Одномерный массив – это список связанных однотипных
форма записи одномерного массива:
тип имя_массива[размер];
В приведенной записи элемент тип объявляет базовый тип массива. Количество элементов, которые будут храниться в массиве с именем имя_массива, определяется элементом размер.

Слайд 11

Одномерные символьные массивы – строки

В языке С индексация массива (символьного или числового)

Одномерные символьные массивы – строки В языке С индексация массива (символьного или
начинается с нуля.
Доступ к отдельному элементу массива осуществляется с помощью индекса. Индекс описывает позицию элемента внутри массива.
Все массивы занимают смежные ячейки памяти, т.е. элементы массива в памяти расположены последовательно друг за другом.

Слайд 12

Одномерные символьные массивы – строки

Ячейка памяти с наименьшим адресом относится к первому

Одномерные символьные массивы – строки Ячейка памяти с наименьшим адресом относится к
элементу массива, а с наибольшим – к последнему.
Для массива символов при инициализации массива необходимо резервировать место для символа окончания строки, т.е. для символа '\0'.
Строковая константа – это набор символов, заключенных в двойные апострофы, например, "hello".

Слайд 13

Одномерные символьные массивы – строки

В конец символьной строки не требуется обязательно добавлять

Одномерные символьные массивы – строки В конец символьной строки не требуется обязательно
нуль, компилятор языка С делает это автоматически. При инициализации символьной строки как одномерного массива необходимо предусмотреть место для нулевого символа, например:
char str[7] = "hello";

Слайд 14

Одномерные символьные массивы – строки

Каждая строка содержит на один символ больше, чем

Одномерные символьные массивы – строки Каждая строка содержит на один символ больше,
задано явно: все строки оканчиваются нулевым символом, имеющим значение 0.
Для одномерных массивов общий размер массива в байтах вычисляется по формуле:
всего байт = размер типа в байтах * количество элементов

Слайд 15

Двухмерные символьные массивы

Двухмерный массив представляет собой список одномерных массивов.
Общая форма записи двухмерного

Двухмерные символьные массивы Двухмерный массив представляет собой список одномерных массивов. Общая форма
массива:
тип имя_массива[размер1] [размер2];
В приведенной записи размер1 означает число строк двухмерного массива, а размер2 – количество столбцов.

Слайд 16

Двухмерные символьные массивы

При этом размерность размер2 определяет максимальную длину для заданного массива.

Двухмерные символьные массивы При этом размерность размер2 определяет максимальную длину для заданного
Обычно размер2 задают с некоторым запасом.
В двухмерном массиве позиция любого элемента определяется двумя индексами. Индексы каждого из размеров массива начинаются с нуля.

Слайд 17

Двухмерные символьные массивы

Место хранения для всех элементов массива определяется во время компиляции.

Двухмерные символьные массивы Место хранения для всех элементов массива определяется во время
Память, выделенная для хранения массива, используется в течение всего времени существования массива.
Для двухмерных массивов заданного типа общий размер массива в байтах вычисляется по формуле:
всего байт = количество строк * количество столбцов * размер в байтах

Слайд 18

Двухмерные символьные массивы

Инициализация двухмерного символьного массива может быть определена либо посимвольно, либо

Двухмерные символьные массивы Инициализация двухмерного символьного массива может быть определена либо посимвольно,
построчно, например
char str[3][80] = {
{'1','2','3','4','5'},
{'x','y','z'},
{'A','B','C','D'}
};

Слайд 19

Двухмерные символьные массивы

char str2[3][80] = {
"0123456789",
"x_y_z",
"A B C D" };
Число 80 взято

Двухмерные символьные массивы char str2[3][80] = { "0123456789", "x_y_z", "A B C
с запасом для возможной длины строки. Число 3 – это количество строк двухмерного массива.

Слайд 20

Двухмерные символьные массивы

В обоих случаях могут быть добавлены символы окончания строки (

Двухмерные символьные массивы В обоих случаях могут быть добавлены символы окончания строки
'\0' ). Символ '\0' не выводится на экран дисплея и не передается в файл, например, в текстовый файл. В то же время необходимо помнить, что каждая строка заканчивается нулевым символом.

Слайд 21

Многомерные символьные массивы

Общая форма записи многомерного массива:
тип имя_массива[размер1] [размер2]... [размерN];
Индексация каждого размера

Многомерные символьные массивы Общая форма записи многомерного массива: тип имя_массива[размер1] [размер2]... [размерN];
начинается с нуля. Элементы многомерного массива располагаются в памяти в порядке возрастания самого правого индекса. Поэтому правый индекс будет изменяться быстрее, чем левый (левые). При этом в конце каждой строки подразумевается нулевой символ.

Слайд 22

Многомерные символьные массивы

При обращении к многомерным массивам компьютер много времени затрачивает на

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

Слайд 23

Многомерные символьные массивы

Для многомерных массивов общий размер многомерного массива в байтах вычисляется

Многомерные символьные массивы Для многомерных массивов общий размер многомерного массива в байтах
по формуле:
всего байт = размер1 * размер2* ... *размерN * размер типа в байтах
Очевидно, многомерные массивы способны занять большой объем памяти, а программа, которая их использует, может очень быстро столкнуться с проблемой нехватки памяти.

Слайд 24

Многомерные символьные массивы

Для определения размера типа в байтах применяется функция sizeof(), которая

Многомерные символьные массивы Для определения размера типа в байтах применяется функция sizeof(),
возвращает целое число. Например, sizeof(char).
При инициализации многомерных массивов необходимо указать все данные (размерности) за исключением крайней слева размерности. Это нужно для того, чтобы компилятор смог определить длину подмассивов, составляющих массив, и смог выделить необходимую память.

Слайд 25

Практическая часть

Пример 1. Напишите программу определения длины заданных строк и их распечатки,

Практическая часть Пример 1. Напишите программу определения длины заданных строк и их
а также определения размера строк в байтах.
Для решения поставленной задачи применим библиотечную функцию strlen() и оператор sizeof.
Программный код решения примера:
#include
#include
#include

Слайд 26

Практическая часть

int main (void) {
char str[] = {'A','B','C','D','\0'};
char str2[] = "hello, world\0";
printf("\n\t

Практическая часть int main (void) { char str[] = {'A','B','C','D','\0'}; char str2[]
The lines are:\n\n\t ");
puts(str);
printf("\t "); // Для отступа от края дисплея
puts(str2);

Слайд 27

Практическая часть

printf("\n\t The length of the 1st line (%s) is: %i\n", str,

Практическая часть printf("\n\t The length of the 1st line (%s) is: %i\n",
strlen(str));
printf("\t The size of the memory of the 1st line (%s) is: %i\n", str, sizeof str);
printf("\n\t The length of 2-nd line (%s) is: %i\n", str2, strlen(str2));
printf("\t Memory size 2-nd line (%s) is: %i\n", str2, sizeof str2);

Слайд 28

Практическая часть

printf("\n Press any key: ");
_getch();
return 0;
}
В программе функция strlen() возвращает длину

Практическая часть printf("\n Press any key: "); _getch(); return 0; } В
строки, причем строка должна заканчиваться символом строки. Символ конца строки не учитывается.

Слайд 29

Практическая часть

Для работы с функцией strlen() необходимо подключить заголовок . Оператор sizeof

Практическая часть Для работы с функцией strlen() необходимо подключить заголовок . Оператор
во время компиляции программы получает размер типа или значения. Для определения размера типа оператор используется со скобками, например, sizeof(char), а для определения размера конкретного значения оператор может использоваться без скобок.

Слайд 30

Практическая часть

В программе использована функция puts(), которая записывает строку, адресуемую, например, параметром

Практическая часть В программе использована функция puts(), которая записывает строку, адресуемую, например,
str, в стандартное выходное устройство – дисплей. Символ конца строки преобразуется в разделитель строк.
Результат выполнения программы показан на рисунке.

Слайд 31

Практическая часть

Практическая часть

Слайд 32

Практическая часть

Пример 2. Напишите программу копирования одной заданной строки в другую.
Для решения

Практическая часть Пример 2. Напишите программу копирования одной заданной строки в другую.
используем библиотечную функцию strcpy(), для которой подключим заголовок .

Слайд 33

Практическая часть

Программный код решения примера:
#include
#include
#include
int main (void) {
char str1[]

Практическая часть Программный код решения примера: #include #include #include int main (void)
= "123456789";
char str2[] = "qwerty";

Слайд 34

Практическая часть

printf("\n\t The length of the line \"%s\" is: %d\n", str1, strlen(str1));
strcpy(str1,

Практическая часть printf("\n\t The length of the line \"%s\" is: %d\n", str1,
str2);
printf("\t After copying: ");
puts(str1);
printf("\n\t The length of the line \"%s\" is: %d\n", str1, strlen(str1));

Слайд 35

Практическая часть

printf("\n Press any key: ");
_getch();
return 0;
}
Результат выполнения программы показан на рисунке.

Практическая часть printf("\n Press any key: "); _getch(); return 0; } Результат

Слайд 36

Практическая часть

Практическая часть

Слайд 37

Практическая часть

Пример 3. Напишите программу преобразования десятичной системы счисления в двоичную. Исходное

Практическая часть Пример 3. Напишите программу преобразования десятичной системы счисления в двоичную.
десятичное число считайте целым без знака.
Программный код решения примера:
#include
#include

Слайд 38

Практическая часть

int main (void) {
const char D[] = {
'0', '1', '2', '3',

Практическая часть int main (void) { const char D[] = { '0',
'4', '5', '6', '7', '8', '9'};
int newNumber[80];
long int inputNumber;
int i = 0, base = 2;
printf("\n\t Enter a positive integer: ");
scanf_s("%ld", &inputNumber);

Слайд 39

Практическая часть

// Прямой процесс преобразования десятичного числа в двоичное
do {
newNumber[i] = inputNumber

Практическая часть // Прямой процесс преобразования десятичного числа в двоичное do {
% base;
++i;
inputNumber /= base;
} while ( inputNumber != 0 );

Слайд 40

Практическая часть

//Запись преобразованного числа в обратном порядке
printf("\n\t Result after conversion: ");
for (--i;

Практическая часть //Запись преобразованного числа в обратном порядке printf("\n\t Result after conversion:
i >= 0; --i)
printf("%d", newNumber[i]);
printf("\n\n Press any key: ");
_getch();
return 0;
}

Слайд 41

Практическая часть

В программе использован квалификатор (спецификатор) типа const, который указывает компилятору, что

Практическая часть В программе использован квалификатор (спецификатор) типа const, который указывает компилятору,
символьный массив не может изменяться в программе.
Результат выполнения программы показан на рисунке.

Слайд 42

Практическая часть

Практическая часть

Слайд 43

Практическая часть

Пример 4. С помощью функции strcat() присоедините одну строку к другой

Практическая часть Пример 4. С помощью функции strcat() присоедините одну строку к
с пробелом и без.
Пусть имеются строки str1 и str2. Функция strcat() присоединяет к строке str1 копию строки str2 и завершает строку str1 нулевым символом. Процесс присоединения называется конкатенацией.

Слайд 44

Практическая часть

Программный код решения примера:
#include
#include
#include
#define N 79
int main (void)

Практическая часть Программный код решения примера: #include #include #include #define N 79
{
char str1[N+1], str2[N+1];

Слайд 45

Практическая часть

printf("\n\t Print 1 string of characters: ");
gets_s(str1, N); // для

Практическая часть printf("\n\t Print 1 string of characters: "); gets_s(str1, N); //
MS Visual Studio
printf("\t Print 2 string of characters: "); gets_s(str2, N); // для MS Visual Studio
strcat_s(str1, N, str2); // для MS Visual Studio
printf("\n\t Result after concatenation: %s\n", str1);

Слайд 46

Практическая часть


printf("\n Press any key: ");
_getch();
return 0; }
Возможный результат выполнения программы

Практическая часть printf("\n Press any key: "); _getch(); return 0; } Возможный
показан на рисунке.

Слайд 47

Практическая часть

Практическая часть
Имя файла: Символьные-массивы-в-языке-С++.-Работа-со-строками.-Лекция-6.pptx
Количество просмотров: 78
Количество скачиваний: 0