Программирование на языке Си. Разработка и отладка программ на персональном компьютере с использованием программного пакета Borland C++, страница 7

Задания для самостоятельной работы.

   Наберите текст программы inout2.cpp и выполните ее. Внимательно посмотрите результаты работы программы. Обратите внимание, что программа правильно работает до момента выполнения последнего оператора scanf(). Эта строка программы выполняется без ожидания ввода данных с клавиатуры. Эта аномалия объясняется тем, что функция scanf() выполняет буферизированный ввод. Во входном буфере после ввода значения переменной х останется символ перевода строки, который передается в программу в качестве значения для ch при следующем обращении к функции scanf(). Исправить ошибку просто - следует очистить входной буфер (обозначается как stdin) перед обращением к функции scanf(), например, с помощью функции fflush(stdin). В общем случае, когда в программе имеется несколько операторов с функцией scanf(), рекомендуется очищать входной буфер перед каждым обращением к scanf().

   Исправьте текст программы inout2.cpp, введя строки с функцией fflush(stdin) перед всеми операторами с функцией scanf() (за исключением первого). Запустите программу и убедитесь в корректности ее работы.

    При выводе чисел с плавающей точкой компьютер обычно выводит 6 знаков после точки. Можно изменить это количество, используя указатель %.nf, где число n определяет количество знаков. Так, для вывода двух знаков после точки нужно в исследуемой  программе написать:

printf(“%.2f в квадрате =%.2f, верно?\n”, x, x2);

Внесите изменения в программу inout2.cpp и проверьте результат.

Как видно из предыдущего примера, использование функции scanf() может привести к ошибкам. Если данные, прочтенные с помощью scanf(),  не соответствуют строке формата, то функция может вести себя непредсказуемо. Так как нельзя, вообще говоря, ожидать, что пользователь программы будет вводить данные в точном соответствии с указанным форматом, то профессиональные программисты избегают пользоваться функцией scanf(). Вместо нее они используют функцию gets(). Эта функция читает вводимые данные в некоторый буфер. Данные при этом представляются в виде строки. Если должно быть введено число, то следует вызвать функции atoi(), atol() или atof() для преобразования строки соответственно в целое, длинное целое или вещественное  число. Описание этих функций находится в заголовочном файле stdlib.h. Вот пример:

/* inout3.cpp. Пример ввода/вывода...*/

#include<stdio.h>

#include<stdlib.h>

main()

{

char name[80],                // Строка для имени

age_str[80],            // Строка для возраста

weight_str[80];      // Строка для веса

int age;

float weight;

printf(“Введите ваше имя:”);

gets(name);                     //Чтение имени в строку

printf(“Привет, %s! Сколько вам лет?”, name);

gets(age_str);          // Чтение возраста в виде строки   

age=atoi(age_str);    // Преобразование строки в целое число

printf(“А какой ваш вес?”);

gets(weight_str);             // Чтение веса в виде строки

weight=atof(weight_str); // Преобразование строки в       //вещественное число

printf(“Подтверждаем ввод возраста - %d и веса - %.2f\n”,     age, weight);

return 0;

}

Задание. Наберите текст программы inout3.cpp и запустите ее (для ускорения работы можно комментарии не набирать).

В языке Си имеется еще одна полезная функция ввода - это getch(), которая применяется для ввода с клавиатуры одиночного символа без его отображения на экране, при этом нажатия клавиши Enter не требуется. Функция getch() возвращает значение типа char.

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

printf(“Для продолжения программы нажмите Enter”);

getch();

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