
Возможные способы ввода исходных данных в программу
Любая инженерная программа предназначена, в конечном счете, для той или иной переработки введенных в нее исходных данных. При этом число необходимых для проведения вычислений числовых данных в инженерных задачах может быть весьма значительным. Ввод в программу достаточно большого числа параметров накладывает на подсистему ввода данных определенные требования, и лишь их безусловное выполнение позволяет разработать удобную и надежную программу:
пользователь программы должен четко понимать, какому параметру соответствует вводимое значение, в каких единицах его следует задавать и каков примерный диапазон возможных значений этого параметра;
пользователь должен иметь возможность корректировки ошибочно введенных данных без потери информации для правильно введенных ранее параметров;
в программе должен быть предусмотрен контроль вводимых параметров, хотя бы формальный.
Можно выделить следующие возможные способы ввода данных, в различной степени удовлетворяющих приведенным выше требованиям:
Непосредственное задание числовых значений переменным в программе при их описании (инициализация). Этот способ допустим при отладке программы или для решения тестового примера. Однако способ не позволяет сделать полноценную исполняемую программу (файл *.EXE), так как требует постоянного использования системы программирования для перекомпиляции программы при любом изменении исходных данных.
Использование функции форматированного ввода scanf(), что можно видеть в большинстве учебников по программированию. Эта функция годится только для использования в простейших программах, работающих в пакетном режиме и практически непригодна для использования в интерактивных инженерных и научных программах, так как она имеет следующие существенные недостатки:
требует обязательного использования другой функции, например printf() для формирования приглашения к вводу данных;
делает практически невозможным контроль вводимых данных;
затрудняет использование значений переменных по умолчанию, т.е. затрудняет задание в программе тестового примера;
желание изменить значение всего одного параметра или любая ошибка ввода обычно требует перезапуска всей программы и необходимости заново вводить все параметры, что неудобно и утомительно, если входных параметров больше трех-пяти (а в инженерных программах их обычно гораздо больше)
ошибки ввода блокируют работу функции scanf(), что исключает возможность её использования для построения интерактивных программ.
Использование параметров командной строки или пакетных командных файлов. Способ является рациональным при небольшом числе вводимых данных, например, когда их число не более двух-трех. Данные в программу в этом случае передаются путем использование параметров командной строки – аргументов функции main( int argc, char * argv[] ). Команда на запуск программы может выглядеть примерно так:
programm.exe test.dat result.res 1 50
Ввод данных с использованием специальных функций ввода, обеспечивающих формирование приглашения к вводу, контроль данных и возможность сохранения старого значения параметра. Несложные специальные функции ввода позволяют решить одновременно следующие проблемы:
генерировать приглашение к вводу данных;
контролировать допустимость значения параметра и интерактивно реагировать на ошибочный ввод;
передавать в программу значение параметра по умолчанию или сохранять ранее введенное;
позволяет легко организовать серию вычислений для некоторого набора значений какого-либо параметра без выхода из программы и повторного ввода всей совокупности параметров.
Обычно достаточно трех-четырех таких функций, причем, будучи составлены один раз, они могут использоваться в самых различных задачах.
При большом числе входных параметров программы удобнее отказаться от непосредственного ввода в программу с клавиатуры и использовать ввод данных из заранее подготовленного файла. Такой специальный файл заблаговременная подготавливается с помощью любого текстового редактора, а затем программа читает из него исходные данные. Формат файла может быть различным, наиболее совершенная и удобная форма – именованные переменные, разбитые на логические секции (например – файл WIN.INI и т.п.).
В некоторых случаях можно использовать способ подготовки исходных данных в отдельном файле и для программ, ввод данных в которых осуществляется функцией scanf() – в этом случае следует использовать команду MS-DOS для перенаправления потока ввода данных следующим образом:
program.exe < datafile.dat.
Интерактивный ввод с использованием специальных шаблонов и полей ввода данных. Дает наиболее широкие возможности для контроля вводимых данных, гибкого интерфейса (возврат к ранее введенным данным, помощь, подсказки и т.п.). Требует разработки достаточно сложной специальной библиотеки или использования современных средств визуального программирования.
Структурное программирование. Виды алгоритмов (линейные, ветвящиеся, циклы). Процедурно управляемые программы и программы, управляемые событиями.
Структурное программирование.
Технология (и методология) разработки программных комплексов, основанная на следующих принципах:
программирование должно осуществляться методикой нисходящего программирования;
весь проект должен быть разбит на модули с одним входом и одним выходом;
логика алгоритма и программы должна допускать только три основные структуры - последовательноевыполнение, ветвление и повторение.
недопустим оператор передачи управления в любую точку программы;
при разработке, документация должна создаваться одновременно с программированием, в виде комментариев к программе.
Цель структурного программирования - повышение надежности программ, обеспечение сопровождения и модификации, облегчение и ускорение разработки. Идеи структурного программирования появились в начале 70-годов в компании IBM.
Модуль – это файл, содержащий код программы. В одномодульной программе имеется только один модуль, содержащий функцию main() и, возможно, некоторые вспомогательные функции. Для многомодульного проекта составляется файл проекта (расширение *.PRJ), который в Turbo C является обычным текстовым файлом, содержащим перечисление имен файлов модулей (исходных текстов, объектных библиотек и др.). Имя запускаемого файла будет таким же, что и у файла проекта, только расширение будет *.EXE, а не *.PRJ. В файле проекта расширения *.C можно не указывать, остальные надо указывать обязательно.
Многомодульная программа имеет следующие преимущества:
позволяет разделить сложную задачу на ряд более простых блоков-модулей, что упрощает отладку программы, так как с небольшими по объему файлами-модулями легче работать;
улучшается структурированность программы, могут быть выделены в отдельные модули универсальные функции, используемые в нескольких программах, затем эти функции могут быть помещены в личные библиотеки;
возможно сокрытие данных (инкапсуляция) без использования громоздкого механизма классов, что достигается путем использования переменных класса хранения static;
разработка, трансляция и отладка отдельных модулей программы может происходить независимо друг от друга, возможна параллельная разработка модулей различными программистами;
могут быть полностью реализованы преимущества метода нисходящего программирования.
Реализация основных структурных элементов на языке С:
последовательно выполняемые алгоритмы – операторы присвоения, вызовы функций и т.п.;
ветвящиеся алгоритмы – операторы
if (…) {…} else {…}
switch ()
{ case 1: … break;
case 2: … break;
. . .
default;
}
циклическое повторение – операторы
for ( … ; … ; …) { … }
do { … } while ( … )
while ( … ) { … }
/* Пузырьковый метод сортировки */
#include <stdio.h> /* printf() */
#include <stdlib.h> /* rand(), randomize() */
#include <conio.h> /* clrscr(), getch() */
#include <time.h> /* clock(), randomize() */
#define NN 100