Вход/Регистрация
Язык Си - руководство для начинающих
вернуться

Д. МАРТИН

Шрифт:

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') используется для завершения печати данной строки и перехода на новую.

Форма данных

При написании программы необходимо понимать, как она будет взаимодействовать с входными данными. Сейчас мы обратимся к этому вопросу.

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

Н 10 40

I 9 41

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

Н

10

40

I

9

41

и такую

H10 40I 9 41

но не

Н 10 40 I 9 41

Почему наличие одних пробелов является необязательным, а других - обязательным? Почему символ "новая строка" может быть помещен между последним целым числом из одного набора данных и первым символом из следующего набора, а пробел нет?

Эти вопросы поднимают проблемы, касающиеся не только данной программы. Рассмотрим работу функций getchar и putchar и найдем ответы на них.

Функция getchar читает первый встретившийся символ независимо от того, является ли он алфавитным символом, пробелом, символом "новая строка" или еще чем-нибудь. Функция scanf делает то же самое, если чтение производится в формате %с (символ). Но, когда scanf осуществляет ввод данных в формате %d (целые), пробелы и символы "новая строка" пропускаются. Поэтому символы "новая строка" или любые пробелы между символом, считываемым функцией getchar, и следующим целым числом, считываемым функцией scanf, игнорируются. Функция scanf читает цифры до тех пор, пока не встретит нецифровой символ - пробел, символ "новая строка" или букву.

Следовательно, между первым и вторым целыми числами необходимо помещать пробел или символ "новая строка", чтобы функция scanf могла распознать где кончается одно и начинается другое. Этим объясняется, почему между символом и следующим целым числом может стоять пробел или символ "новая строка", и почему между двумя целыми числами обязательно должен быть разделитель такого вида. Но почему между целым числом, стоящим в конце набора данных, и следующим символом не может быть пробел? Потому что в следующий раз на очередном шаге выполнения цикла while функция getchar осуществляет ввод символа из той позиции, где "остановилась" функция scanf. Поэтому она прочтет любой следующий символ, стоящий после целого числа, - пробел, символ "новая строка" и т. п. Если бы мы следовали требованиям функции getchar, структуру данных необходимо было бы организовать так:

w10 50a20 60у10 30

где между последним целым числом, стоящим в конце группы, и следующим символом разделитель отсутствует. Но такая структура выглядит неуклюже, поскольку число 50 при этом выглядит так, как будто оно помещено в одну группу с а, а не с w. Поэтому введен оператор

if(ch != '\n')

чтобы иметь возможность обнаружить, когда значение ch равно символу "новая строка". Вместо этого можно использовать данные, вводимые в виде

  • Читать дальше
  • 1
  • ...
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: