Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБОРАТОРНАЯ РАБОТА № 1. Составные типы данных.doc
Скачиваний:
91
Добавлен:
17.05.2013
Размер:
128.51 Кб
Скачать

5 Требования к отчету

Отчет по лабораторной работе должен содержать:

  1. Цель лабораторной работы.

  2. Краткую теорию (ответы на контрольные вопросы).

  3. Листинги разработанных программ с комментариями.

  4. Результаты выполнения разработанных программ.

  5. Выводы по работе.

Приложение

Обработка символьных данных

Строки обеспечивают удобный способ хранения текстовой информации. Лучший способ присвоения строки символьного массива – использование строки в кавычках, называемой строковой константой. Необходимо удостоверится, что размера массива хватает вместить все символы строки, включая и нуль. Инициализация символьного массива с присвоением символьной константы – это самый надежный способ, когда компьютер сам подсчитывает количество элементов. В языке “C++” существуют два способа записи строк в массиве: первый – инициализация массива строковой константой, второй – считывание в массив результатов ввода с клавиатуры или из файла. Объект cin представляет стандартный ввод как поток байтов.

Использование функций getline() и get()

Класс iostream, которому принадлежит объект cin, содержит некоторые строчно-ориентированные функции-элементы. Функция getline(), например, читает целую строку, используя переданный с помощью клавиши ENTER символ новой строки, чтобы пометить конец ввода. Для обращения к этому методу используется следующий вызов функции: cin.getline (). Функция требует передачи двух параметров. Первый - имя массива, пред­назначенного для сохранения введенной строки, а второй ограничивает количество символов, которые нужно считать. Если этот предел составляет, скажем, 20, функция чита­ет не больше чем 19 символов, оставляя участок памяти, чтобы автоматически добавить нулевой символ в конец. Функция-элемент getline() прекращает чтение входных дан­ных, когда достигает числового предела или когда читает символ новой строки, в зави­симости от того, какое из двух событий происходит первым.

Предположим, что нужно использовать функцию getline(), чтобы считать название в 20-элементный массив name. Необходимо выполнить следующий запрос:

cin.getline (name,20);

Этот запрос считывает строку целиком в массив name при условии, что строка со­стоит из 19 или меньшего количества символов.

Пример. Чтение более одного слова с помощью функции getline

#include <iostream>

int main()

{

const int ArSize = 20;

char name [ArSize];

char dessert [ArSize];

cout << "Enter your name:\n";

cin.getline(name, ArSize); // чтение до символа новой строки

cout << "Enter your favorite dessert:\n";

cin.getline (dessert, ArSize);

cout << "I have some delicious " << dessert;

cout << " for you, " << name << ".\n";

return 0;

}

На помощь здесь приходит еще одна разновидность функции get(). В результате вызова функции cin.get() (без па­раметров) происходит считывание только одного следующего символа, даже если это символ новой строки. Этим можно воспользоваться, чтобы избавиться от символа но­вой строки и приготовиться к приему следующей строки ввода. Поэтому приведенная ниже последовательность операторов даст нам желаемый результат:

cin.get (name, ArSize); // читает первую строку

cin.get (); // читает символ новой строки

cin.get (dessert, Arsize); // читает вторую строку

Есть еще один способ использования get() - конкатенировать, или объединить две приведенные выше функции следующим образом:

cin.get (namе, ArSize).get(); // объединение функций-элементов

Это возможно благодаря тому, что выражение cin.get(name,ArSize) возвращает объект cin, который затем используется как объект, вызывающий функцию get(). Аналогично, выражение

cin.getline(name1, ArSize).getline(name2, ArSize);

считывает две последовательные входные строки в массивы name1 и name2, что эквива­лентно выполнению двух отдельных вызовов функции cin.getline().

Пример. Чтение более чем одного слова с помощью объединения функций: get() & get()

#include <iostream>

int main()

{

const int ArSize = 20;

char name[ArSize];

char dessert[ArSize];

cout << "Enter your name:\n";

cin.get(name, ArSize).get(); //чтение строки, символа новой строки

cout << "Enter your favorite dessert:\n";

cin.get (dessert, ArSize).get();

cout << "I have some delicious " << dessert;

cout << " for you, " << name << ".\n";

return 0;

}

Функцию getline() использовать несколько легче, но get() упрощает исправ­ление ошибок. Для чтения строки ввода можно пользоваться любой из этих функций, но следует учитывать различия в их поведении.

Смешанный ввод строк и чисел

Смешанный ввод строк и чисел с помощью ориентированных на строки функций может вызывать затруднения.

Пример. чередование ввода чисел и строк

#include <iostream>

int main ()

{

cout << "What year was your house built?\n";

int year;

cin >> year;

cout << "What is its street address?\n";

char address[80];

cin.getline(address, 80);

cout << "Year built: " << year << "\n";

cout << "Address: " << address << "\n";

cout << "Done!\n";

return 0;

}

При работе с данной программой пользователь никогда не получит возможности ввести адрес. Проблема состоит в том, что объект cin, считав значение года, оставляет символ новой строки, сгенерированный с помощью клавиши ENTER, во входной оче­реди. Затем функция cin.getline() воспринимает символ новой строки так, как будто это пустая строка, и присваивает нулевую строку элементу массива address. Чтобы испра­вить ошибку, следует считать и отбросить символ новой строки перед чтением адреса. Это можно сделать несколькими способами, включая использование функции get() без параметров или с параметром типа char, как описано в предшествующем примере. Можно вызвать функцию отдельно:

cin >> year;

cin.get(); // или cin.get(ch);

Можно также конкатенировать функции, воспользовавшись тем, что выражение cin >> year возвращает объект cin:

(cin >> year).get(); // или (cin >> year).get(ch);