Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Нейбауер А. - Моя первая программа на С C++ - 2002

.pdf
Скачиваний:
272
Добавлен:
13.08.2013
Размер:
5.88 Mб
Скачать

Рис. 4.17. Использование указателя ширины поля при выводе строки

перед ним появятся два дополнительных пробела.

Выбор правильных средств вывода информации

Когда вы планируете способ представления информации в вашей программе, обдумайте, какие именно функции наилучшим образом соответствуют вашим целям.

Чтобы вывести на экран обычный текст или символы, можно использовать функции puts() или putchar(). Так как эти функции не имеют никаких возможностей форматирования данных, они работают быстрее, и их коды занимают меньший объем на диске, чем коды функции printf(). Имея дело с функцией puts(), прежде всего проверьте, добавляет ли компилятор код «новая строка» автоматически. Если он не делает этого, а вы не проверите сразу, потом вам придется потратить довольно много времени на редактирование программы.

Рис. 4.18. Правила использования функции printf()

Кстати, при работе с функцией printf(), пропуск кода «новая строка» тоже является распространенной оплошностью среди начинающих программистов.

Функция printf() работает медленнее и требует большего объема памяти, но она идеально подходит в тех случаях, когда вам требуется выводить числовые данные, форматировать строки или комбинировать текст и числовые переменные в одной строке. Работая с функцией printf(), следует тщательно следить за тем, чтобы указатели формата соответствовали литералам, константам и переменным в списке данных. Рис.4.18 иллюстрирует наиболее важные моменты, необходимые, чтобы правильно написать инструкцию, использующую функцию printf().

Вывод в Си++

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

Ⱦɚɧɧɚɹ ɜɟɪɫɢɹ ɤɧɢɝɢ ɜɵɩɭɳɟɧɚ ɷɥɟɤɬɪɨɧɧɵɦ ɢɡɞɚɬɟɥɶɫɬɜɨɦ %RRNV VKRS Ɋɚɫɩɪɨɫɬɪɚɧɟɧɢɟ ɩɪɨɞɚɠɚ ɩɟɪɟɡɚɩɢɫɶ ɞɚɧɧɨɣ ɤɧɢɝɢ ɢɥɢ ɟɟ ɱɚɫɬɟɣ ɁȺɉɊȿɓȿɇɕ Ɉ ɜɫɟɯ ɧɚɪɭɲɟɧɢɹɯ ɩɪɨɫɶɛɚ ɫɨɨɛɳɚɬɶ ɩɨ ɚɞɪɟɫɭ piracy@books-shop.com

В Си++ существует стандартный поток вывода cout, позволяющий в сочетании с двумя символами «меньше»

(<<)

, которые называются оператором вставки,* отображать литералы или значения констант и переменных без использования указателей формата.

Если у вас есть компилятор Си++, посмотрите документацию к нему. Не исключено, что необходим специальный файл заголовков для того, чтобы иметь

* В оригинале insertion operator. Также часто используется термин «оператор вывода».

(Прим.перев.)

Рис. 4.19. Стандартный поток вывода cout

возможность использовать преимущества стандартного потока вывода cout и стандартного потока ввода cin (о нем вы прочтете в следующей главе). Для некоторых компиляторов, например, необходимо включить файл STREAM.H с помощью директивы #include в начале программы (директива #include и использование файлов заголовков рассматривались в главе 2).

Структура инструкции, использующей cout, показана на рис.4.19. После cout надо поставить два знака

<

. Они указывают cout отобразить помещенную после них информацию. Информация может быть представлена в виде литерала (тогда ее заключают в кавычки) либо имени константы или переменной.

Рассмотрим инструкцию

cout << "Привет, меня зовут Сэм. Мы

с вами уже встречались";

При ее выполнении произойдет вывод на дисплей строки, заключенной в кавычки. Инструкция int count;

count = 4509; cout << count

www.books-shop.com

Рис. 4.20. Вывод нескольких аргументов с помощью cout

отобразит значение переменной с именем count— число 4509.

Используя один стандартный поток вывода cout, можно отобразить несколько аргументов. Между собой аргументы разделяются операторами вставки, как это продемонстрировано на рис.4.20. Например, инструкция

int age; age = 43;

cout << "Вам исполнилось " << age << " года.";

отображает текст

Вам исполнилось 43 года.

Стандартный поток вывода cout отображает каждый пункт, указанный с помощью оператора вставки, в том порядке, в каком они записаны в инструкции.

Так же, как и функция printf(), cout не добавляет никаких команд новой строки после отображения данных. Чтобы перейти к новой строке, там, где вы хотите ее начать, надо добавить управляющий код \n, как это показано на рис.4.20.

Стандартный поток вывода cout не требует обязательного использования указателей формата, но позволяет их ввести. С помощью указателей формата можно определять ширину поля, количество пробелов и число знаков после точки в вещественных числах. Описание форматирования вывода при использовании cout не входит в задачу этой книги. Если у вас есть компилятор Си++, вы можете подробно прочитать об этом в его описании. Не забудьте

Замечания по Си++

Одна из особенностей языка Си++— так называемая перегрузка — делает необязательным использование указателей формата. В отличие от функции printf(), которая требует обязательного указания формата данных, cout при передаче параметров сам определяет формат на основании типа получаемых данных. Этот процесс и называется перегрузкой.

посмотреть в документации, надо ли включать специальные файлы заголовков при использовании cout.

Проектирование программы

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

Начните программу с вывода инструкций, которые объясняют цель ее создания:

www.books-shop.com

puts("Добро пожаловать\n");

puts("Эта программа рассчитывает платежи по закладным.\n"); puts("Введите сумму займа,\n");

puts("проценты по закладным и срок выплаты в годах.\n");

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

puts("Пожалуйста, введите сумму полученного займа:");

Когда вам нужно вывести результат, делайте информацию максимально доступной для чтения и понимания:

printf("Основные месячные выплаты:

%7.2f\n", princ);

printf("Проценты:

%7.2f\n", interest);

printf("Общие месячные выплаты:

%7.2f\n", total);

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

Основные месячные выплаты:

256.25

Проценты:

92.12

Общие месячные выплаты:

34.37

Такой способ представления информации кажется более удобным, чем, например, следующий: printf("%f %f %f", prins, inter, total);

в результате чего имеем:

256.25 92.12 34.37

Старайтесь все время поступать в соответствии с предлагаемыми правилами. Процесс создания программы отнимет несколько больше времени, но результат того стоит. Программа будет выглядеть более профессиональной и создаст максимум удобства для всех, кто будет ею пользоваться.

В табл. 4.2 подведен краткий итог всем способам вывода данных, которые обсуждались в этой главе.

www.books-shop.com

Таблица 4.2. Средства вывода информации в языке Си/Си++.

Вопросы

1.Что такое вывод?

2.Какие три типа аргументов можно использовать с функцией puts()?

3.Какие три типа аргументов можно использовать с функцией putchar()?

4.Что такое escape-последовательности?

5.В чем заключаются различия между escape-последовательностями

\n и \r?

6.Как вывести на экран символ «кавычка»?

7.Из каких двух частей состоит список параметров функции printf()?

8.Какие преимущества имеет функция printf() по сравнению с puts()?

9.Что такое указатель формата?

10.Как вывести на экран значение числовой переменной?

Упражнения

1.Напишите программу вывода вашего имени и адреса на экран с ис-

www.books-shop.com

пользованием функции puts().

2.Напишите программу вывода вашего имени и адреса на экран с использованием функции printf().

3.Напишите функцию puts(), которая выводит слово «Заглавие» в середине экрана. Ширина экрана 80 символов.

4.Напишите функцию printf(), которая выводит слово «Страница» с правой стороны экрана.

5.Напишите функцию printf(), которая выводит значения следующих переменных:

float length, width, height, volume;

6.Программа должна отображать имя и возраст субъектов. Напишите функцию printf(), которая выводила бы значения переменных:

7.char name[12]; int age;

8.Программа содержит следующие переменные:

9.сhar item[] = "Дискеты";

10.float cost = 3.55;

float markup = 0.75;

Напишите функцию printf(), которая выводит на экран следующие сообщения:

Наименование товара:

Гибкий диск

Цена за 1 упаковку:

3.55

 

Наценка:

0.75

 

Обратите внимание на выравнивание.

11. Программа содержит следующую переменную: int count = 30;

Используя значение переменной count для вывода числа в последней строке, напишите программу, которая подает звуковой сигнал и выводит на экран следующее сообщение:

Внимание! Внимание! Внимание! Внимание! Нежелательное отклонение параметров среды. У вас есть 30 секунд, чтобы покинуть помещение.

www.books-shop.com

ГЛАВА 5 ВВОД В СИ/СИ++

Вводом называется процесс предоставления компьютеру информации, необходимой для работы программы. Информация вводится в переменные, это означает, что данные, которые пользователь вводит в ответ на соответствующую подсказку, определяются как значение переменной, хранящейся в памяти. Затем переменная используется в выполняемых программой операциях. Из рисунка 5.1 видно, что ввод информации может происходить из различных источников.

Ввод данных — это процесс, который определяет всю дальнейшую работу программы. Достоверность получаемых от программы результатов не может быть больше, чем достоверность вводимой в нее информации. Как говорится, чистый вход— чистый выход. Если введенные в программу данные были ошибочными, все полученные результаты тоже окажутся неверными.

В этой главе мы подробно рассмотрим ввод данных с клавиатуры. В главе 12 вы узнаете, как программа берет данные из дискового файла.

Рис. 5.1. Откуда бы ни поступали данные,компьютер хранит их в памяти как переменные

Как вы увидите, слово ввод употребляется в двух значениях: как существительное, означающее данные, полученные компьютером, и как глагол, обозначающий сам процесс ввода информации.

Замечания по Си++

Си++ может работать со всеми функциями ввода Си.

Данные вводятся только как значения переменных, но не констант. Константы всегда сохраняют присвоенные им начальные значения. Когда вы вводите в переменную некоторые данные, они помещаются в отведенную для этой переменной область памяти. Если переменной уже присвоено какое-то значение, новая информация заместит прежнюю, уничтожив ее (рис.5.2).

www.books-shop.com

Рис. 5.2. При вводе данных прежнее значение переменной теряется

Функция gets()

Функция gets() вводит строку в переменную. Параметром функции является имя переменной. Рассмотрим такую программу:

main()

{

char name[15]; gets(name); puts(name);

}

Функция gets() будет рассматривать первые 14 символов, введенные с клавиатуры, как значение строковой переменной с именем name. Вы помните, что Си отводит строковой переменной столько элементов памяти, сколько указано в максимальном значении при определении переменной, а так как один элемент необходим для нулевого символа (\0), реально можно ввести на один символ меньше. Если вы хотите ввести в переменную name строку, состоящую из 15 символов, то укажите в квадратных скобках максимальное значение 16:

char name[16];

На время работы функции gets() выполнение программы приостанавливается. Она ждет, пока пользователь что-то напечатает. Для того чтобы напечатанные данные стали значением переменной, после ввода информации надо нажать клавишу Enter. Как только это сделано, строка, введенная пользователем, присваивается переменной в качестве значения, а курсор переходит на следующую строку на экране. При нажатии Enter Си добавляет в строку нулевой символ.

Когда вы вводите символы при выполнении инструкции gets(), они отображаются на экране монитора (в режиме эха), при этом не используются никакие функции вывода, и символы на самом деле не будут введены в компьютер, пока не нажата клавиша

Enter.

Рассмотрим более подробный пример: main()

{

char name[25];

printf("Пожалуйста, введите Ваше имя: "); gets(name);

printf("Подтвердите, Ваше имя: %s", name);

www.books-shop.com

}

Когда программа будет выполняться, вы увидите на экране подсказку:

Пожалуйста, введите Ваше имя:

Возьмите себе за правило использовать функции printf() или puts() для вывода на экран подсказок, говорящих пользователю перед каждой процедурой ввода данных, что именно ему надо сейчас ввести. Как вы сами убедитесь, четкие подсказки очень важны для правильного ввода информации.

Поскольку функция printf() в данном случае не содержит кода «новая строка», курсор останавливается сразу за подсказкой, на расстоянии в один пробел от двоеточия, так как в строку формата функции printf() мы ввели пробел между двоеточием и закрывающими кавычками. Итак, пока вы сидите перед компьютером и смотрите на экран, ничего не произойдет. Программа ждет, что вы введете некую информацию, в данном случае напечатаете свое имя.

Пока вы печатаете имя, символы отображаются на экран в режиме эха. Если вы допустите ошибку, ее можно исправить до того, как нажата клавиша Enter, уничтожив неправильные символы клавишей Backspace и напечатав новые. В некоторых системах можно использовать клавишу Esc для того, чтобы удалить все введенные символы и начать процедуру заново.

После нажатия клавиши Enter Си присваивает введенные символы переменной name и вставляет нулевой символ в конце строки. Затем программа переходит к выполнению второй функции printf() и на экране появляется вторая надпись (предположим, что вас зовут Петр Иванов):

Пожалуйста, введите Ваше имя: Петр Иванов Подтвердите, Ваше имя: Петр Иванов

Помните, символы, составляющие ваше имя, отображались на экране после первой подсказки только в режиме эха, они не были введены в программу до того, как вы нажали Enter. После второй подсказки имя появляется на экране в качестве значения переменной name в результате выполнения второй функции printf().

Таким образом, функция gets() прекрасно подходит для ввода в программу строк.

Функция getchar()

Функция getchar() вводит с клавиатуры единичный символ. Для большинства компиляторов безразлично, к какому типу (char или int) вы отнесете вводимый символ, что обусловлено способом определения символьной переменной в K&R-стандарте языка Си (двойственность символьных данных подробно обсуждалась в главе 4).

Для ввода символа можно использовать оба этих формата:

int letter;

char letter;

letter = getchar();

letter = getchar();

Обратите внимание на то, что вызов функции getchar() осуществляется не так, как вызов функций, которые мы рассматривали раньше. Вместо того чтобы поставить имя функции в начало строки инструкции, мы относим его к переменной с помощью знака «равно». Эта запись означает: «Присвоить переменной letter значение, полученное в результате выполнения функции getchar()». Практически, функция getchar() рассматривается программой как значение переменной (рис.5.3). При выполнении этой инструкции вызывается функция getchar() и осуществляется ввод символа, который присваивается переменной. Функция getchar() не имеет аргумента. Поэтому круглые скобки после имени функции остаются пустыми.

Когда пользователь нажимает клавишу, getchar() отображает введенный символ на экране. В данном случае нажимать Enter нет необходимости, так как getchar()

www.books-shop.com

Рис. 5.3. Функция getchar()

вводит только один символ, после чего программа немедленно продолжает работу. Символ присваивается переменной, как только вы нажали какую-либо клавишу.

Некоторые компиляторы Си и Си++ используют функцию getch(), которая вводит символ без последующего нажатия Enter. Может оказаться, что при работе с getchar(), эти компиляторы требуют нажатия Enter после ввода символа. Проверьте документацию вашего компилятора.

Для чего может понадобиться ввод единичного символа? Вероятно, вам приходилось видеть программы, в которых необходимо ответить «Да» или «Нет» в ответ на запрос, или выбрать один из пунктов предложенного меню. Функция getchar() идеально подходит в этих случаях, ведь при работе с ней нет необходимости нажимать Enter, ввод одного из предложенных на выбор символов позволяет немедленно продолжить выполнение программы.

Если значение переменной введено с помощью функции getchar(), оно, независимо от того, определена переменная как int или как char, может быть отображено с помощью функции putchar() или printf(). В последнем случае используется указатель формата %c:

/*getchar.c*/

main()

{

int initial;

puts("Пожалуйста, введите следующий инициал."); initial=getchar();

putchar('\n');

putchar(initial);

putchar('\n'); printf("%c", initial);

}

Данная программа вводит символ в переменную initial, а затем отображает значение переменной на дисплее, используя функции putchar() и printf(). Если в качестве инициала вы ввели букву 'А', то на экране увидите эту букву, повторенную трижды на отдельных строках. Первый раз она появляется при вводе ее с

www.books-shop.com

Соседние файлы в предмете Программирование на C++