Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Грушвицкий 22.12.11 пособие исправленное.doc
Скачиваний:
28
Добавлен:
09.02.2015
Размер:
1.01 Mб
Скачать

2.2 Расширяем функциональность

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

#include <stdio.h>

void main(void)

{

// Программа суммирования двух чисел

int a, b, c;

printf("Ведите два числа - целых\n");

scanf("%d %d", &a, &b);

c = a+b;

printf("Сумма = %d\n", c);

}

Жирным здесь выделены те места, которые изменены по сравнению с предыдущей версией. Как видно, изменений не так много. Но они достаточно существенны.

В строке printf("Ведите два числа - целых\n");вряд ли мы сможем найти для себя что-нибудь новое, поэтому сразу же перейдём дальше по изменениям. Стоит лишь оговорится, что правильное пояснение предполагаемых действий пользователя является важной задачей программиста: вряд ли кому-нибудь захочется работать с продуктом, где ничего не ясно.

В строке scanf("%d %d", &a, &b);происходит вызов функцииscanf. Эта функция, так же, как и функцияprintf, содержится в библиотекеstdio. Назначение функции – ввод данных пользователем с клавиатуры. Данные вводятся в соответствующем формате, описанном первым параметром. Помещаются данные в переменные, указанные в качестве остальных параметров.

Обратите внимание, что переменные в таком обращении указываются со знаком &. Это означает передачу указателя на переменную (ее адреса). Подробнее об этом вы узнаете позднее или прочтёте в соответствующей литературе, а сейчас стоит просто это учитывать.

2.3 Улучшаем интерфейс. Осмысленное проектирование

Указанные выше программа всё ещё обладает тем недостатком, что для получения суммы других чисел необходимо запускать её заново.

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

Решению этой задачи способствует проектирование схемы алгоритма (рис. 2). Правила составления таких схем описаны в разделе 5. Пример весьма условный, поскольку программа тривиальная. В реальных случаях не следует расписывать схему вплоть до каждого оператора. Схема алгоритма должна быть укрупненной и помещаться на один лист формата А4.

Зададимся вопросом: чем же так замечательны схемы алгоритмов и почему необходимо начинать проектирование именно с них?

Основным преимуществом схем алгоритма является языконезависимость. Это означает, что одна и та же схема может быть реализована практически на любом языке программирования.

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

Отличительная особенность алгоритма заключается в циклическом исполнении основного фрагмента программы. Алгоритмы этого типа называют циклическими.

Ниже приведен текст программы, спроектированный по схеме алгоритма, показанной на рис. 2.

#include <stdio.h>

#include <conio.h>

void main(void)

{ // Программа суммирования двух чисел с циклическим повторением

inta, 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в данном случае означает символьную переменную.