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);