Структуры и алгоритмы обработки данных Часть 4 Структуры данных
4. Структурное программирование 4. 5. Базовые структуры данных: структуры Программа = Структуры данных + Алгоритмы l l СТРУКТУРА ДАННЫХ – способ представления данных в программе для компьютера ПРОГРАММА - описание структур данных и алгоритма решения задачи на языке программирования, автоматически переводимое на язык машинных команд конкретной ЭВМ помощи транслятора (интерпретатора). Задача: Спроектировать структуру данных для представления в памяти компьютера информации о членах коллектива колледжа.
4. Структурное программирование 4. 5. Базовые структуры данных: структуры l НАЧНЕМ С ДАННЫХ О ЧЛЕНЕ КОЛЛЕКТИВА КОЛЛЕДЖА. ПОСТАВЛЕНА ЗАДАЧА ХРАНИТЬ И ОБРАБАТЫВАТЬ СЛЕДУЮЩУЮ ИНФОРМАЦИЮ О НЕМ: l Идентификационный номер (студенческого билета или удостоверения) Фамилия Имя Отчество Дата рождения Домашний адрес Дата зачисления (на работу или учебу) Должность Является ли членом профсоюза l l l l
4. Структурное программирование 4. 5. Базовые структуры данных: структуры l ВЫБЕРЕМ ТИПЫ ДАННЫХ И ИМЕНА ПЕРЕМЕННЫХ ДЛЯ ХРАНЕНИЯ ИНФОРМАЦИИ О КАЖДОМ ЧЕЛОВЕКЕ: l Идентификационный номер – int id Фамилия – char surname [80] Имя – char firstname [40] Отчество – char patronymic [60] Дата рождения – unsigned short birthyear, birthmonth, birthday Адрес – char address [80] Дата зачисления – unsigned short enteryear, entermonth, enterday Должность – char position [30] Является ли членом профсоюза – bool tradeunion l l l l
4. Структурное программирование 4. 5. Базовые структуры данных: структуры Структура – упорядоченное множество данных различного типа, которые называются полями или членами структуры. l Доступ к полю структуры осуществляется по имени структуры и имени поля. l Поля структуры могут иметь любой тип (кроме void). l Структура может содержать только такие поля, длина которых известна компилятору в момент определения структуры. l Структурным типом данных или просто структурой называется тип, описывающий структуру. Синтаксис объявления структурного типа: struct Имя_структуры { Тип_ поля_1 Имя_поля 1; Тип_ поля_2 Имя_поля 2; … }; l
4. Структурное программирование 4. 5. Базовые структуры данных: структуры Примеры объявления структурных типов : struct Date { unsigned short year; unsigned short month; unsigned short day; }; struct Cmplx { double re; double im; }; struct Name { char surname [80]; char firstname [40]; char patronymic [60]; }; Обратите внимание: описание структуры заканчивается точкой с запятой
4. Структурное программирование 4. 5. Базовые структуры данных: структуры Размещение в памяти структурных типов : struct Date { unsigned short year; unsigned short month; unsigned short day; }; struct Cmplx { double re; double im; }; Внимание! Компилятор не гарантирует размещение элементов структуры в смежных ячейках памяти!
4. Структурное программирование 4. 5. Базовые структуры данных: структуры Объявление переменных структурного типа Имя_переменной; Имя_типа Имя_переменной = {список значений}; Примеры объявления переменных структурных типов, Cmplx c 1, c 2, c 3; Date birth, enter, expel, graduate, death ; struct { double re; double im; } c 1, c 2, c 3; // Совмещение объявлений типа и переменных // в анонимной структуре
4. Структурное программирование 4. 5. Базовые структуры данных: структуры Примеры объявления переменных структурных типов с инициализацией Cmplx c 1 = {0, 0}; Date birth = {1991, 10, 7}, enter = {2009, 9 , 1}, graduate = {2014, 6, 30}; struct // Совмещение объявлений типа и переменных { double re; double im; } c 1={0, 0}, c 2={1, 0}, c 3={1, 0};
4. Структурное программирование 4. 5. Базовые структуры данных: структуры Доступ к элементам структуры: оператор. (точка) Имя_переменной. Имя_поля birth. year = 2002; birth. month=12; c 1. re = 12. 5; c 1. im = -24; c 2. re = c 1. re*c 1. re + c 1. im*c 1. im; Присваивание переменных – структур одного типа : c 1=c 2; expel. year=enter. year;
4. Структурное программирование 4. 5. Базовые структуры данных: структуры Структуры могут: l объединять данные (поля) различных типов; l быть вложенными друг в друга struct Date { unsigned short year; unsigned short month; unsigned short day; }; struct Name { char surname [80]; char firstname [40]; char patronymic [60]; }; struct Member { int id; Name ownname; Date birth; char address [80]; Date enter; char position [30]; bool tradeunion; }; //"student", "teacher", “master" …
4. Структурное программирование 4. 5. Базовые структуры данных: структуры Рассмотрим работу с вложенными структурами struct Member { int id; Name ownname; Date birth; char address [80]; Date enter; char position [30]; bool tradeunion; }; Member stud 1 = {298678, “Криставчук”, “Михаил”, “Валерьевич”, 1996, 10, 7, “Минск, ул. Серова 23, кв. 1”, 2013, 9, 1, “student”, false}; Member prep 4 = {129639, {“Попкец”, “Павел”, “Петрович”}, {1980, 6, 1}, “Минск, ул. Казинца 75, кв. 12”, {2003, 3, 18}, “teacher”, true}; Member temp = stud 1; stud 1. id = 123456789; stud 1. ownname. surname = “Попкец”; stud 1. ownname. surname = prep 4. ownname. surname; prep 4=temp;
4. Структурное программирование 4. 5. Базовые структуры данных: структуры А как представить в памяти информацию обо всех членах коллектива, например, колледжа? Student stud 1, stud 2, stud 3, stud 4, stud 5, … stud 788, stud 789, stud 790;
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки l l l Массив – нумерованная последовательность данных одного типа, которые хранятся в непрерывной области памяти друг за другом. Члены последовательности данных называются элементами массива. Доступ к элементу массива производится путем указания имени массива и номера элемента. Нумерация элементов может выполняться одной или несколькими последовательностями целых чисел – индексными последовательностями. Если нумерация выполняется одной последовательностью говорят, что массив является одномерным, в противном случае – многомерным. Нумерация элементов массива всегда начинается с 0, а номер каждого следующего члена больше номера предыдущего на 1.
4. Структурное программирование 4. 5. Базовые структуры данных: структуры Размещение в памяти массивов: int b [10] 0 b 1 2 3 4 5 0, 0 x 0, 1 0, 2 0, 3 6 7 8 9 short x [2][4] 1, 0 1, 1 1, 2 1, 3 Внимание! Компилятор гарантирует размещение элементов массива в смежных ячейках памяти!
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Массив определяется: l именем (идентификатором); l количеством размерностей - числом номеров, необходимых для указания местонахождения элемента массива; l размером (диапазоном изменения индексов) по каждой размерности. Конфигурация массива фиксирована. l Все элементы массива принадлежат к одному и тому же типу данных. l Элементами массива могут быть как простые переменные любых типов, так и переменные составных типов (массивов, структур, строк и т. д. ). l В качестве индексов в С++ могут использоваться константы и переменные любых целых типов.
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Синтаксис описания одномерного массива Имя_типа_элемента Имя_массива [Размер]; Имя_типа_элемента Имя_массива [Размер] = {список значений}; Примеры описаний массивов float b[20] ; const int n=4; int a[n] = {5, 6, 7, 8}; 4 байта 5 6 7 8 a[1] a[2] a[3] a … a[0] …
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Примеры описаний массивов float x[20] = {0} ; Если список инициализации содержит меньше элементов, чем массив, оставшиеся элементы инициализируются значением 0. Если список содержит больше элементов, чем массив, компилятор генерирует сообщение об ошибке. double y [ ] = {5. 5, 6. 8, 8. 8, 9. 5, 10. 3} Если значения элементов перечисляются явно, размер массива можно не указывать (компилятор определит его по количеству элементов) 8 байтов 5. 5 6. 8 8. 8 9. 5 10. 3 y[1] y[2] y[3] y[4] y … y[0] …
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Операция индексирования Имя_массива [Индекс]; Индекс – целочисленное выражение, значение которого изменяется между 0 и (Размер-1). Для переменной – индекса лучше выбирать тип целый со знаком, так контроль выхода значений индекса за допустимый диапазон не ведется. const int n=4; int a[n] = {5, 6, 7, 8}; int i = 3; a[1] = a[2]+a[i]-6; 5 9 7 8 a[1] a[2] a[3] a … a[0] …
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Задача. Написать программу, осуществляющую ввод, сложение, вычитание, скалярное умножение двух n-мерных векторов и вывод результатов. Структура данных для представления n-мерного вектора: одномерный массив размера n типа double. Расчетные формулы:
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Решение задачи: int main() { const int n=4; double a[n]={0}, b[n]={0}, res[n]={0}; Если список инициализации содержит меньше значений, чем число элементов массива, оставшиеся элементы будут инициализированы 0 cout << "Enter. . . " << endl; for (int i=0; i<=n; i++) { cout << endl << "a" << i +1<< ": "; cin >> a[i]; cout << "b" << i +1<< ": "; cin >> b[i]; }
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Решение задачи: for (int i=0; i<n; i++) res[i]=a[i]+b[i]; //Sum cout << endl << "a + b = ( "; for (int i=0; i<n; i++) cout << res[i] << " "; cout << ")"; for (int i=0; i<n; i++) res[i]=a[i]-b[i]; //Difference cout << endl << "a - b = ( "; for (int i=0; i<n; i++) cout << res[i] << " "; cout << ")"; double r=0; for (int i=0; i<n; i++) r+=a[i]*b[i]; //Product cout << endl << "a * b = " << r; _getch(); return 0; };
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Задача (Решето Эратосфена). Найти простые числа, меньшие наперед заданного n. Идея алгоритма Эратосфена: из списка всех чисел от 2 до n последовательно вычеркивать числа, кратные уже известным простым числам. Основная структура данных программы: одномерный массив размера 2. . n типа boolean. Индексы массива соответствуют анализируемым числам. Элемент массива имеет значение true, если индекс этого элемента простое число.
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Алгоритм на псевдокоде Данные. Максимальное анализируемое число n Массив, хранящий информацию, простым ли является значение индекса каждого элемента: bool erato [n] Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до n 3. 1. Если erato [ i ] == true , 3. 1. 1. Заменить на false значения элементов массива erato с индексами от i до n, кратными i 4. Вывести значения индексов элементов массива erato , принимающих значение true
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Оптимизируем и уточняем алгоритм на псевдокоде Данные. Максимальное анализируемое число n Массив, хранящий информацию, простым ли является значение индекса каждого элемента: bool erato [n] Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true , 3. 1. 1. Заменить на false значения элементов массива erato с индексами от i до n, равными i * j, где j изменяется от i до n 4. Вывести значения индексов элементов массива erato , принимающих значение true
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Уточняем алгоритм на псевдокоде Данные. Максимальное анализируемое число n Массив, хранящий информацию, простым ли является значение индекса каждого элемента: bool erato [n+1] Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=2 j= erato[i] = true 1 1 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=2 j=2 erato[i] = true erato[4] = false 1 1 0 11 1 11 0 1 1 1 11 1 11 2 3 4 52 6 37 4 8 1 9 5 10 6 11 7 12 8 13 9 14 15 10 11 12 1613 17 14
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=2 j=3 erato[i] = true erato[6] = false 1 1 0 1 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=2 j=4 erato[i] = true erato[8] = false 1 1 0 1 0 1 1 1 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=2 j=5 erato[i] == true erato[10] = false 1 1 0 1 0 1 1 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=2 j=6 erato[i] == true erato[12] = false 1 1 0 1 0 1 0 1 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=2 j=7 erato[i] == true erato[14] = false 1 1 0 1 0 1 0 1 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=2 j=8 erato[i] == true erato[16] = false 1 1 0 1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=2 j=9 erato[i] == true i*j>n 1 1 0 1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=3 j=3 erato[i] == true erato[9] = false 1 1 0 1 0 0 0 1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=3 j=4 erato[i] == true erato[12] = false Повторное присваивание выгоднее проверки! 1 1 0 1 0 0 0 1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=3 j=5 erato[i] == true erato[15] = false 1 1 0 1 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=3 j=6 erato[i] == true i*j>n 1 1 0 1 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=4 j= erato[i] == false 1 1 0 1 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i= j= 1 1 0 1 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Программа на С++ int main() // sieve of Eratosthenes { const unsigned int n = 1000; const unsigned int size = n+1; bool erato [size]={0}; for (int i = 2; i <= n; i++) erato [i] = 1; for (int i = 2; i <= static_cast <int> (sqrt(static_cast <float> (n))); i++) { if (erato[i]) for (int j = i; j <= n; j++) { if (i*j > n)break; erato [i*j]=false; } } for(int i=2; i <= n; i++) if (erato[i]) cout << i << endl; _getch(); return 0; }
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Строки символов в С++ l В С++ есть несколько способов представления строк символов: l l l в виде одномерного массива символов (строки, завершающиеся нулевым байтом); в виде объекта класса string; другие способы в зависимости от реализации. Строки, завершающиеся нулевым байтом l Описываются как одномерный массив, каждый элемент которого имеет тип char. l Символы строки последовательно располагаются в элементах массива, начиная с нулевого. l В элемент массива, следующий за последним символом автоматически записывается элемент с ASCII кодом 0: ‘ ’
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Описание строк, завершающихся нулевым байтом l Строка описывается как обычный массив символов char l Размер массива должен быть на 1 больше длины самой длинной строки, которую предполагается в этом массиве хранить char s[10] = “Hello”; H e l l 0 1 2 3 s Основные отличия строк от массивов: l l l 0 4 5 6 7 8 9 В процессе выполнения программы отслеживается текущая длина строки Строка в целом может быть проинициализирована значением строкового литерала (а не только поэлементно символьными значениями) При помещении идентификатора символьного массива в поток cout выводится не адрес массива, а его содержимое от 0 -го элемента до последнего перед завершающим символом
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Самые распространенные функции из <string. h> Имя Предназначение strcpy (s 1, s 2) Копирует строку s 2 в строку s 1 strcat (s 1, s 2) Приписывает строку s 2 в конец строки s 1 strlen (s 1) Вычисляет текущую длину строки s 1 strcmp (s 1, s 2) Возвращает 0, если строки совпадают, отрицательное значение, если s 1 < s 2 и положительное, если s 1 > s 2 strchr (s 1, ch) Возвращает указатель на позицию первого вхождения символа ch в строку s 1 strstr (s 1, s 2) Возвращает указатель на позицию первого вхождения строки s 2 в строку s 1
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Примеры char st [20] = “ Good Morning”; G o o d 0 1 2 Мусор M o 3 r n i n g 5 7 8 9 10 11 12 4 6 13 14 15 16 17 18 19 cout << st; // Good Morning strcpy(st, “Hello”); H e l l 0 2 3 4 1 o o r 5 6 7 n i n g 8 9 10 11 12 13 14 15 16 17 18 19 cout << st; // Hello strcpy(st, “”); e l l o o r 0 1 2 3 4 5 6 7
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Основные ограничения на действия со строками, завершающимися нулевым байтом l Строки, как и обычные массивы, нельзя присваивать другу, используя оператор присваивания (включая присвоение строкового литерала где-либо, кроме начальной инициализации). l К строкам, как к обычным массивам, нельзя применять операции сравнения l Для строк нет перегруженных операций (например, + для операции конкатенации) l Для выполнения операций копирования, конкатенации, сравнения строк и ряда других операций приходится использовать встроенные функции, описанные в заголовке <string. h>
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки int main() // Basic operations with strings { char st [20] = "**********"; // 19 '*‘ char st 1 [20]; for (int i=0; i <=19; i++) cout << st[i]; // ********** cout << endl<< st << " " << strlen (st) << endl; // ********** 19 strcpy(st, "Good Morning"); for (int i=0; i <=19; i++) cout << st[i]; // Good Morning ****** cout << endl<< st << " " << strlen (st) << endl; // Good Morning 12 strcpy(st, "Hello"); for (int i=0; i <=19; i++) cout << st[i]; // Hello orning ****** cout << endl<< st << " " << strlen (st) << endl; // Hello 5 cout << endl; strcpy(st 1, strchr(st, 'e')); cout << st 1 << endl; // ello bool i = strchr(st, 'e'); cout << i << endl; // 1 if (strchr(st, 'e')) cout << "char e found"; // char e found _getch(); return 0; }
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Ввод строк l При вводе строки с клавиатуры (помещение в поток cin) следует контролировать длину вводимой строки (чтобы она не превышала длину массива, где будет храниться строка char str [MAX]; cin >> setw (MAX) >> str; // Ввод до MAX-1 символов l При помещении строки в поток cin пробелы и символы новой строки конвертируются в завершающий нулевой байт cin >> setw (MAX) >> str; // Введем строку “Good Morning” cout << str; // Получим Good l Чтобы ввести строку, содержащую пробелы, необходимо вызвать встроенную функцию getline для потока cin: cin. getline(st, MAX); или char SEP=‘$’; cin. getline (st, MAX, SEP); // Задаем свой разделитель строк
4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки int main() // Counting number of characters into string { const int MAX = 80; // Maximum array dimension char buffer[MAX]=""; // Input buffer int count = 0; // Character counter while (true) { cout << "Enter a string of less than 80 characters: n"; cin. getline(buffer, MAX); if (! strcmp(buffer, "")) break; for(count=0; buffer[count] != '