Смекни!
smekni.com

Разработка сервисных программ для обслуживания администрации деканата учебной части вуза коменданта (стр. 2 из 5)

Существуют и другие проблемы, связанные со структурами в стиле С. В С структуры не могут быть напечатаны как единое целое, только по одному элементу с соответствующим форматированием каждого. Для печати элементов структуры в каком-либо подходящем формате должна быть написана функция. Глава 8, «Перегрузка операций» покажет, как перегрузить операцию «, чтобы предоставить возможность простой печати объектов типа структура (C++ расширяет понятие структуры) или типа класс. В С структуры нельзя сравнивать в целом; их нужно сравнивать элемент за элементом. Глава 8 покажет, как перегрузить операции проверки равенства и отношения, чтобы можно было в Си++ сравнивать объекты типов структура и класс.

В следующем разделе мы вновь использует нашу структуру Time, но уже как класс, и продемонстрируем некоторые преимущества создания таких так называемых абстрактных типов данных, как классы. Мы увидим, что классы и структуры в C++ можно использовать почти одинаково. Различие между ними состоит в доступности по умолчанию элементов каждого из этих типов. Это будет более детально объяснено позже.

2.1 Работа со строками в С++

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

Строка в С++ - это массив символов, оканчивающийся нулевым символом ('\0').

Таким образом, можно определить строки двумя способами: как массив символов или как указатель на первый символ строки, например:

char str1[10] = «string1»; // объявление строки с помощью массива символов

Итак, теперь подробнее. Вы уже знаете, что массив – это набор однородных значений. Так вот строка есть не что иное, как набор символов, и, соответственно, для хранения строк можно использовать символьные массивы. Например, строка «QWERTY» _олее тип char[7], а пустая строка «» имеет тип char[1]. Почему char[1]? Именно потому, что любая строка завершается так называемым нулевым символом, то есть символом, код которого в ASCII-таблице равен 0 (этот символ также является escape-символом и его символьный эквивалент представляется как '\0'). Благодаря этому свойству Вы всегда можете определить конец строки, если у Вас строка занимает меньшее количество символов, чем то количество, которое было указано в квадратных скобках при оъявлении массива, т.е. определить фактическую длину строки, хранящейся в массиве.

Одна из замечательных особенностей при работе со строками – это возможность упрощенной начальной инициализации. Например,

Объявление 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] != ‘&bsol;0’; i++) str2[i] = str1[i];// копируем ноль-символ в str2.Str2 [i] = '&bsol;0';cout << str2 << '&bsol;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<<”&bsol;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. Это библиотека обработки строк, которая обеспечивает много полезных функций для работы со строковыми данными, например, сравнение строк, поиск в строках символов и других подстрок, разметку строк (разделение строк на логические куски) и определение длины строки.