Успех! Это было не просто, но не невозможно. Разделив задачу на небольшие части и продумав, какой информацией должна обмениваться каждая из них, мы свели задачу к частям, поддающимся управлению. Кроме того, отдельные модули, которые мы создали, можно использовать как части подобных программ.
Этим завершаются наши примеры в данной главе. Давайте теперь вернемся немного назад и сделаем обзор главы.
ОБЗОР
Чего же мы достигли? Если посмотреть с практической стороны, то мы разработали генератор случайных чисел и программу сортировки целых чисел. При этом создали функцию getint( ), которую можно использовать в других программах. Если посмотреть с педагогической точки зрения, то мы проиллюстрировали несколько основных принципов и концепций, полезных при создании программ.
Следует обратить внимание на самый существенный момент:
программы нужно проектировать, а не создавать их методом проб и ошибок. Вы должны внимательно подумать о форме и содержании ввода и вывода для программы. Необходимо разделить программу на хорошо определенные задачи, затем раздельно запрограммировать, принимая во внимание взаимодействие их друг с другом. Идея заключается в достижении модульности. Если необходимо, разбивайте модули на еще более мелкие модули. Используйте функции для повышения степени модульности и простоты программы.
При проектировании программы, попытайтесь предвидеть, что может идти неправильно и программируйте, исходя из этого. Используйте локализацию ошибок, чтобы контролировать действия в местах потенциальных затруднений, или по крайней мере предупреждать пользователя, что может возникнуть осложнение. Гораздо лучше дать пользователю еще одну возможность ввести данные, чем продолжать выполнять программу и прийти к аварийной ситуации.
Если создается функция, сначала определите, как она будет взаимодействовать с вызывающей программой. Решите также, какая информация будет входить в нее, а какая выходить. Какими должны быть аргументы? Хотите ли вы использовать указатели, или возврат, или то и другое? Если вы примете во внимание все эти параметры, то можете обратить внимание на работу самой функции.
Используйте эти идеи, и ваша программа будет более надежной и менее подверженной аварийным ситуациям. Вы получаете тело функции, которое можете применять в других программах. Программирование в таком случае потребует меньше времени. Вообще все это похоже на хороший рецепт здорового программирования.
Не забывайте о классах памяти. Переменные можно определять вне функции; в этом случае их называют внешними (или глобальными) и они доступны более чем для одной функции. Переменные, определенные внутри функции, являются локальными для нее и не известны другим функциям. Если можно, используйте автоматическую разновидность локальных переменных. Они охраняют переменные одной функции от воздействия других функций.
ЧТО ВЫ ДОЛЖНЫ БЫЛИ УЗНАТЬ В ЭТОЙ ГЛАВЕ
Как представлять функцию: черный ящик с информационным потоком.
Что такое "проверка ошибок" и почему эта процедура хороша.
Алгоритм сортировки.
Как заставить функцию изменять массив: function(array).
Как преобразовать строку цифр в число.
Классы памяти: auto, extern, static и register.
Область действия каждого класса памяти.
Какой класс памяти использовать: обычно auto.
ВОПРОСЫ И ОТВЕТЫ
Вопросы
1. Что может сделать наш алгоритм сортировки неэффективным?
2. Как следует изменить нашу программу сортировки, чтобы она сортировала и по рядке возрастания, а не убывания?
3. Измените функцию print( ) таким образом, чтобы она печатала по 5 чисел в строке.
4. Как следует изменить функцию stoi( ), чтобы обрабатывать строки, представляющие восьмеричные числа?
5. Какие функции "знают" каждую переменную из описанных ниже? Есть ли здесь какие-нибудь ошибки?
Ответы
1. Предположим, что вы сортируете 20 чисел. Программа производит 19 сравнений, чтобы найти одно самое большое число. Затем делается 18 сравнений, чтобы найти следующее самое большое. Вся информация, полученная во время первого поиска "забывается" за исключением самого большого числа, поставленного на первое место. Второе самое большое число можно временно поместить на место с номером 1, а затем при сортировке опустить вниз. Много сравнений, выполнявшихся в первый раз, повторяется второй, третий раз и т. д.
2. Замените array[search] > array[top] на array[search] < array[top]
3.
/* печать массива */
print(array, limit)
int array[ ], limit);
{
int index;
for(index = 0; index < limit; index++)
{ printf("%10d", array[index]);
if(index % 5 == 4) primf("\n" );
} printf("\n");
}