на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Разработка сервисных программ для обслуживания администрации деканата, учебной части вуза, коменданта общежития, разных сфер быта
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



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.