p align="left">Одна из замечательных особенностей при работе со строками - это возможность упрощенной начальной инициализации. Например, Объявление char str[] = «ABCDE»; присваивает переменной-строке начальное значение «ABCDE». А точнее, создает массив из 6 символов: 'A','B','C','D','E' и символа '\0'. Как видите начальная инициализация символьного массива действительно отличается от инициализации какого-либо другого массива - можно просто присвоить необходимую строку имени массива с пустыми квадратными скобками. С++ сам подсчитает длину строки и выделит соответствующий объем памяти под массив для размещения в нем требуемой строки. Сразу необходимо отметить, что С++ сам автоматически сделает последний элемент массива нулевым символом (а Вы уже помните, что любая строка обязательно заканчивается нулевым символом), то есть, хотя в данном случае Вы массиву str присваиваете строку «ABCDE», длина которой составляет 5 символов, C++ выделяет память под 6 символов, записывает туда строку и затем в последний (пятый при счете от 0) записывает нулевой символ. Следует также отметить, что при начальной инициализации символьного массива (как и любого другого) можно указывать в квадратных скобках его размер с целью дальнейшего использования массива еще для каких-либо целей (например, для хранения другой какой-либо строки): Объявление char str[10] = «ABCDE»; создает массив из 10 символов и первые пять элементов этого массива принимают значения 'A','B','C','D' и 'E' соответственно, остальные символы будут ноль-символы. В данном случае в первые 5 элементов массива записывается строка «ABCDE», а всем остальным элементам присваиваются нули. Для начальной инициализации символьного массива можно использовать правила инициализации произвольного массива, то есть используя фигурные скобки, только в данном случае придется явно указывать нулевой символ, которым заканчивается строка. Давайте рассмотрим предшествующий пример с использованием общих правил начальной инициализации массива. Char str[]={`A','B','C','D','E','\0'}; Как видите ******** вариант начальной инициализации строкового массива значительно проще и удобнее, но еще раз отметим, что его можно использовать только для символьных массивов. Типичная ошибка программирования. Не выделяется достаточно места в массиве символов для хранения нулевого символа, завершающего строку. Типичная ошибка программирования. Создание или использование «строки», которая не содержит завершающего нулевого символа. Типичная ошибка программирования. Путают символьные и строковые константы. Символьная константа - это один символ, заключенный в апострофы, например: 'A' или '\n'. Строковая константа - это последовательность символов, заключенная в двойные кавычки. В числе символов строки могут находится любые символьные константы, например, «Visual C++\n» состоит из следующих символов: 'V', 'i', 's', 'u', 'a', 'l', ' ', 'C', '+', '+', '\n', '\0'. Таким образом, «A» - это строковая константа и состоит из двух символов: 'A' и '\0'. Соседние строковые константы транслятором «склеиваются», например: «АБВ» «ГДЕ» означает то же, что «АБВГДЕ». Рассмотрим небольшой пример: //Задана строка, скопировать ее в символьный массив. #include<iostream.h> void main() { char str1 [ ] = «1234567890», /* объявляем символьный массив str1 и инициализируем его */ str2[11]; // объявляем символьный массив без инициализации /* в цикле пока не встретится конец строки присваиваем текущему элементу массива str2 символ из массива str1 */ for(int I = 0; str1[i] != `\0'; i++) str2[i] = str1[i]; // копируем ноль-символ в str2. Str2 [i] = '\0'; cout << str2 << '\n'; // вывод строки на экран } Обратите внимание, выход из цикла происходит, когда str1[i] равно ноль-символу, т.е. ноль-символ не копируется в str2, следовательно это нужно сделать за циклом. Еще одна особенность работы с символьными массивами - если элементы произвольного массива можно вводить с клавиатура и выводить на экран только по одному элементу в цикле, то в символьный массив можно ввести сразу всю строку, используя оператор ввода cin >> Имя_массива; и, аналогичным образом, вывести сразу всю строку на экран, используя оператор вывода cout << Имя_массива; Следует сразу отметить, что при вводе с клавиатуры строки оператор cin автоматически добавляет в конец строки нулевой символ, так что Вы должны учитывать этот факт при указании количества элементов при объявлении массива. Например, #include <iostream.h> void main() { char str[31]; // объявление символьного массива cout<<”Enter a string (max 30 symbols):”; cin>>str; // ввод строки cout<<”\nYou enter string:”<<str; // вывод строки } Как видите в данном примере выделяется память под 31 символ, но пользователю в приглашении указывается, что он может ввести строку с размером максимум 30 символов, учитывая тот факт, что оператор cin добавит еще один нулевой символ в конец строки автоматически, и под него также необходимо предусмотреть выделение памяти. Далее после приглашения вводим сразу всю строку с клавиатуры в массив и затем с соответствующим сообщением выводим всю строку на экран монитора. Второй способ определения строки - это использование указателя на символ. Объявление char *b; задает переменную b, которая может содержать адрес некоторого объекта. Однако в данном случае компилятор не резервирует место для хранения символов и не инициализирует переменную b конкретным значением. Сделать это можно, например, присвоив b указатель на уже существующий символьный массив, или динамически выделить память под новый массив. Например, #include<iostream.h> void main() { char str[] = «Здравствуй, мир!»; // объявляем символьный массив char *b; // объявляем указатель на символ b = &str[12]; // теперь b указывает на 12-ый символ str *b = 'M'; // присваиваем первому элементу b символ 'М' cout << b; // выводим строку b на экран (Мир!) } 3. ОСОБЕННОСТИ РАБОТЫ В Visual C++ Visual C++-- это инструмент профессионального программирования в среде Windows. Основная сила пакета - исспользование библиотеки классов. Специальные программы -мастера пишут за пользователя значительную часть проекта - программы. Интегрированая среда Visual C++ дает возможность писать и выполнять сложные программы . Программа в этой среде -- это проект, который состоит из набора файлов, расположенных в рабочих областях. В среде можно также реализовать обычные ( без исспользования стандартных классов) программы на языке С++ . Для этого исспользуется консольный режим. 4 ПРОГРАММНАЯ РЕАЛИЗАЦИЯ 4.1 Описание алгоритма и структуры программы В данной программе были использованы структуры и строки, а также функции из библиотеки обработки строк. Также был использован алгоритм сортировки ( в данном случае сортировка по успеваемости). Программа создает два массива, где каждый элемент массива является структурой с информацией о студенте. В первом массиве, где каждый элемент является структурой с названием «predmety» содержится название предметов по которым студент получил оценки (названия предметов вводятся с клавиатуры). Каждый элемент массива содержит отдельную структуру типа «predmety» Во втором массиве содержится информация о студенте: фамилия, имя , отчество, год, месяц, день рождения, бюджет или контракт, номер телефона, адрес проживания, и массив чисел с оценками по предметам. Программа может выполнять 8 различных действий с данными. 4.2 Описание использованных программных средств Функции работы со строками из библиотеки обработки строкВ этом разделе мы познакомимся с некоторыми типичными функциями стандартной библиотеки string.h. Это библиотека обработки строк, которая обеспечивает много полезных функций для работы со строковыми данными, например, сравнение строк, поиск в строках символов и других подстрок, разметку строк (разделение строк на логические куски) и определение длины строки. 1. Функция int strlen (const char* s); - определяет длину строки s. Возвращает количество символов, предшествующих завершающему нулевому символу. Обратите внимание, завершающий ноль-символ в длину не включается. Например, 2. cout << strlen(«Hello!»); // на экране будет 6 3. 4. char *str = «one»; 5. cout << strlen(str); // на экране будет 3 6. Функция char *strcpy(char *s1, const char *s2); - копирует строку s2 в массив символов s1. Возвращает значение s1. Массив символов s1 должен быть достаточно большим, чтобы хранить строку и ее завершающий нулевой символ, который также копируется. Например, 7. char str[25]; // объявляем символьный массив из 25 элементов 8. char *ps = new char [25]; /* объявляем указатель на символ и 9. динамически выделяем память под 25 символов */ 10. 11. strcpy(str, «ABCDE»); // копируем в str строковыю константу «ABCDE» 12. cout << str; // выводим str на экран. На экране будет ABCDE 13. 14. strcpy(ps, «QWERTY»); // копируем в ps строковыю константу «QWERTY» 15. cout << ps; // выводим ps на экран. На экране будет QWERTY 16. 17. delete[] ps; // освобождаем память Обратите внимание, если Вы хотите, чтобы одна строка содержала другую, Вы должны скопировать ее содержимое, а не присвоить! Так, например, в данном случае инструкция ps = «QWERTY» была бы ошибочна. Компилятор, встречая такую инструкцию, создают строку «QWERTY», за которой следует нулевой символ и присваивает значение начального адреса этой строки (адреса символа Q) переменной ps. Таким образом, теряется исходное значение ps, а значит невозможно корректно освободить память под ps. 18. Функция int *strcmp(const char *s1, const char *s2); - сравнивает строки s1 и s2 (по ASCII-кодам). Функция возвращает значение 0, если строки s1 и s2 равны, значение меньше ноля, если строка s1 меньше s2, и значение больше ноля, если s1 больше s2. Обратите внимание, строки сравниваются не по длине, а посимвольно, по ASCII-кодам ( т.е. «g» больше «ff»). Например, 19. cout << strcmp(«compare», «string»); /* на экране будет -1, поскольку 20. «compare» меньше «string» */ 21. 22. cout << strcmp(«abcde», «abc»); /* на экране будет 1, поскольку 23. «abcde» больше «abc» */ 24. cout << strcmp(«one», «one»); /* на экране будет 0, поскольку 25. строки равны */ 26. Функция char *strcat(char *s1, const char *s2); - добавляет строку s2 к строке s1. Первый символ строки s2 записывается поверх ноль-символа строки s1. Возвращает s1. Под s1 должно быть выделено памяти не меньше чем (strlen(s1)+strlen(s2)+1). Например, 27. char st1[25] = «День»; cout << strcat(st1, « добрый!»); // на экране будет День добрый! 28. Функция char *strncpy(char *s1, const char *s2, int n); - копирует не _олее n символов строки s2 в массив символов s1. Возвращает s1. 29. Функция char *strncmp(char *s1, const char *s2, int n); - сравнивает до n символов строки s1 со строкой s2. Возвращает 0, меньше, чем 0 или больше, чем 0, если s1 соответственно равн, меньше или больше s2. 30. Функция char *strncat(char *s1, const char *s2, int n); - присоединяет первые n символов строки s2 в строку s1. Возвращает s1. 31. Функция char *strchr(const char *s, int c); - проверяет строку s на содержание символа хранящегося в c. Результатом функции является адрес первого вхождения символа c в строку s. Если символ не найден, возващается NULL. Например, 32. char str[20] = «ABCDEXYZ»; cout << strchr(str, 'X'); // на экране будет XYZ или char str[20] = «ABCDEXYZ»; if (strchr(str, 'q') == NULL) cout << «Нет такого символа!»; 33. Функция char *strstr(const char *s1, const char *s2); - проверяет строку s1 на содержание подстроки s2. Результатом функции является адрес первого вхождения подстроки s2 в строку s1. Если подстрока не найдена, возващается NULL. Например, 34. char str[20] = «ABCDEXYZ»; 35. char *ps = strstr(str, “DEX”);
Страницы: 1, 2, 3, 4
|