Улучшаем интерфейс. Осмысленное проектирование
Указанные выше программа всё ещё обладает тем недостатком, что для получения суммы других чисел необходимо запускать её заново.
Итак, это уже вторая программа, имеющая существенные недостатки. Это говорит о том, что проектирование программы было начато неправильно: вместо того, чтобы кидаться сразу писать текст на языке программирования необходимо сначала четко осознать потребительские свойства и алгоритм будущего программного продукта.
Решению этой задачи способствует проектирование схемы алгоритма (рис. 2). Правила составления таких схем описаны в разделе 5. Пример весьма условный, поскольку программа тривиальная. В реальных случаях не следует расписывать схему вплоть до каждого оператора. Схема алгоритма должна быть укрупненной и помещаться на один лист формата А4.
Зададимся вопросом: чем же так замечательны схемы алгоритмов и почему необходимо начинать проектирование именно с них?
Основным преимуществом схем алгоритма является языконезависимость. Это означает, что одна и та же схема может быть реализована практически на любом языке программирования.
Так же схема алгоритма может показать общие черты предполагаемой программы, не вдаваясь в подробности. Таким образом, можно выявить общую функциональность схемы, не отвлекаясь на излишнюю информацию и подробности, присущие конкретному языку и конкретной реализации. Важно то, что эта общая функциональность далее отображается на конкретные функции языка программирования и, поэтому, проектирование схемы алгоритма – это первый этап проектирования структуры программной системы.
Отличительная особенность алгоритма заключается в циклическом исполнении основного фрагмента программы. Алгоритмы этого типа называют циклическими.
Ниже приведен текст программы, спроектированный по схеме алгоритма, показанной на рис. 2.
#include <stdio.h>
#include <conio.h>
void main(void)
{ // Программа суммирования двух чисел с циклическим повторением
int a, b, c;
char cont;
clrscr(); // Очистка экрана
do
{ // Циклическое повторение суммирования двух чисел
printf("Введите два числа:\n");
scanf("%d %d", &a, &b); // Последний введенный символ - '\n'
c = a + b;
printf("Сумма = %d\n", c);
puts("Хотите продолжать? (y/n)");
fflush(stdin); // Очистка stdin от последнего
// введенного символа '\n'
scanf("%c", &cont);
} while(!(cont=='n'|| cont=='N'));
}
В данной программе жирным выделены места отличия от предыдущего варианта. Начнём разбор изменений по порядку.
Строка #include <conio.h> осуществляет подключение новой библиотеки, которую мы не использовали ранее. Она нам пригодится в дальнейшем в этой программе.
В строке char cont; осуществляется ввод переменной для хранения символов.
Строкаclrscr(); // Очистка экрана говорит сама за себя: именно этой функцией осуществляется очистка экрана. Именно для неё мы и подключали дополнительную библиотеку.
Далее начинается конструкция, которую ни в коем случае нельзя воспринимать как отдельную строку – это цикл. Он состоит как минимум из 2-х (в данном случае из 3-х) строк:
do
{ // Циклическое повторение суммирования двух чисел
и
} while(!(cont=='n'|| cont=='N'));
Данная конструкция предназначена для циклического выполнения того кода, который заключён между первой и второй частью. Выполнение кода повторяется пока истинно значение логического выражения внутри скобок while( … ), то есть до тех пор пока не (!)введен символ 'n'или'N'. Операторы ! и || являются операторами булевой алгебры. Они означают НЕ и ИЛИ соответственно.
Строка puts("Хотите продолжать? (y/n)"); выводит поясняющую надпись. Понятный и удобный интерфейс, как уже было сказано ранее, является важной составляющей частью любой программы.
Строкой fflush(stdin);мы сообщаем компилятору о необходимости очистки входного потока. Это сделано в связи с наличием буфера входного потока, который сохраняет все нажатые символы до момента пока они не будут востребованы. В данном случае, при вводе чисел в буфере клавиатуры остался символ ‘\n’. Это символ перевода каретки, который остался после нажатия клавиши [Enter].
После очистки буфера можно быть совершенно уверенным, что в строке scanf("%c", &cont);мы получим то, что хотел нам передать пользователь, а именно один символ. Считываем мы его в переменную cont; %c в данном случае означает символьную переменную.
Итог
Мы спроектировали программу Вашей лабораторной работы №1. Не правда ли, текст программы на языке С выглядит просто и понятно для человека-проектировщика. Простота и наглядность текста – это то, к чему Вы и в дальнейшем должны стремиться.
Однако, следует обратить особое внимание, что язык С – язык профессионального программирования и, поэтому, содержит массу средств выражения алгоритмов, изощренных деталей и нюансов, делающих его эффективным с точки зрение объема памяти и скорости выполнения результирующей программы.
Настоящее пособие не призвано заменять какую-либо книгу, подробно описывающую язык С. Язык программирования следует изучать по оригиналу (такому как [1]) самостоятельно, что Вы и должны уже сейчас начать делать. А задача преподавателей, читающих лекции и ведущих практические занятия как раз и заключается в том, чтобы помочь Вам разобраться во всех тонкостях предмета. Если Вы чувствуете трудности в освоении языка, то целесообразно воспользоваться учебником [2].