Книга: Язык Си - руководство для начинающих

Структура программы

Структура программы

В нашей программе имеются три цикла while, один оператор if и один оператор if-else. Посмотрим, что каждый из них делает:

while((ch = getchar()) != EOF)

Задачей первого цикла while является ввод нескольких наборов данных. (Каждый набор данных состоит из символа и двух целых чисел, указывающих границы его вывода). Производя вначале чтение символа, мы смогли объединить в одном выражении его ввод и проверку того, не является ли он признаком EOF. Если прочитан символ EOF, то программа останавливается, не делая попытки ввести величины, соответствующие переменным start и stop. В противном случае при помощи функци scanf( ) указанным переменным присваиваются введенные значения, затем программа переходит к их обработке. Этим завершается выполнение тела цикла, после чего вводится новый символ, и весь процесс повторяется снова.

Обратите внимание, что для чтения данных мы использовали два оператора, а не один. Почему нельзя было воспользоваться одним оператором?

scanf(" %с %D %D", &ch, &start, &stop)

Предположим, мы это сделали. Рассмотрим, что происходит, когда программа заканчивает чтение последнего набора данных из файла. Перед началом выполнения очередного тела цикла единственным оставшимся непрочитанным элементом файла будет признак EOF. Функция scanf( ) читает указанный символ и присваивает его переменной ch; зaтем oна пытается ввести значение для переменной start, но в файле не осталось данных, которые не были бы уже прочитаны! Компьютер выскажет свое недовольство, и ваша программа прекратит работу. Отделяя чтение символа от ввода остальных данных, мы позволяем компьютеру обнаружить появление признака EOF перед очередной попыткой прочесть оставшиеся данные.

if (ch != 'n')

Цель введения в программу первого оператора if состоит в том, чтобы упростить чтение данных. Мы объясним, как он работает в следующем разделе.

if(start > stop || start < 1 ||  stop > MAXLENGTH)    printf(" Введены неправильные граничные значения n");else

Цель применения оператора if-else состоит в том, чтобы избежать использования в программе таких значении переменных start и stop, которые могут привести к нежелательным последствиям. Этот вопрос мы также обсудим ниже. Обратите, однако, внимание на то, как мы использовали логические операции и операции отношения, чтобы обнаружить появление любого из трех "опасных" значений.

 

Основная часть программы представляет собой составной оператор, который следует за ключевым словом else.

count = 0;

Вначале счетчик count устанавливается на нуль.

while(++count < start)  putchar(' ');

Затем в цикле while начинается вывод на печать пробелов вплоть до позиции, определяемой значением переменной start. Ecли значение start, скажем, равно 10, то печатается девять пробелов. Поэтому вывод символов на печать начнется с 10-й позиции. Обратите внимание, как использование префиксной формы операции увеличения вместе с операцией < позволяет добиться указанного эффекта. Если бы вместо этого мы использовали выражение count++ < start, то сравнение проводилось бы перед увеличением значения count, и в результате мог быть напечатан один дополнительный пробел.

while(count++ <= stop) putchar(ch);

Второй цикл while в вышеупомянутом блоке осуществляет задачу вывода на печать символа, начиная с позиции, задаваемой переменной start, и кончая позицией, задаваемой переменной stop. На этот раз мы воспользовались постфиксной формой операции увеличения и операцией <=. Такая комбинация обеспечивает желаемый результат при выводе на печать символа - верхняя граничная позиция входит в поле печати. Для проверки этого факта вы можете воспользоваться логикой или методом проб и ошибок.

putchar(' n');

Оператор putchar('n') используется для завершения печати данной строки и перехода на новую.

Оглавление книги


Генерация: 0.267. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз