3. Методика разработки алгоритма.
Разработка алгоритма - творческий и неоднозначный процесс, для которого не существует жёстких правил. Тем не менее, это не означает, что алгоритм должен разрабатываться стихийно, случайным образом. Разработка алгоритма должна быть последовательной и целеустремлённой. Лучшей стратегией для чётко определённых задач является стратегия “сверху вниз”, сводящаяся к постепенным уточнениям деталей алгоритма, начиная от некоторого общего плана. Таким планом вполне может быть разработанная ранее в рамках проекта программы - экранная форма.
Для относительно простых задач и при наличии достаточного опыта по экранной форме можно непосредственно написать соответствующую программу на Турбо-Паскале. Для начинающих программистов рекомендуется предварительно составить по экранной форме блок-схему алгоритма.
Однако для задач посложнее, следует придерживаться стратегии постепенных уточнений. Она даёт “путеводную нить” построения алгоритма, завершающегося получением готовой программы. Для многошаговых уточнений использование блок-схем становится проблематичным.
Запись на псевдокоде может на первом шаге использовать и полностью естественный язык, если это представляется целесообразным. Каждое последующее уточнение сводится к замене фрагмента естественного языка на реализующий его код - фрагмент на Турбо-Паскале. Процесс продолжается до тех пор, пока весь алгоритм будет закодирован на Турбо-Паскале.
Следует иметь в виду, что процесс создания алгоритма не всегда является прямолинейным движением, иногда возникает также необходимость возврата к предшествующему состоянию и его коррекция. Это следует воспринимать как естественное явление, соответствующее самой сущности программирования (да и любого проектирования вообще). В процессе накопления опыта необходимость возвратов будет неуклонно уменьшаться, однако вряд ли от неё можно избавиться совсем.
Для представления алгоритма и его уточнений удобно использовать те средства, которые предусмотрены в самом языке Турбо-Паскаль:
Фрагменты естественного языка следует заключать в комментарные скобки. Рекомендуется использовать также нумерацию таких фрагментов с целью их упорядочения.
Каждый фрагмент естественного языка должен в последующем раскрываться либо как оператор, либо как операция (функция), либо как описание объектов.
При раскрытии одного фрагмента могут порождаться новые фрагменты естественного языка (реализуемые проще, чем исходный).
Процесс уточнения продолжается до тех пор, пока алгоритм не будет полностью записан на языке программирования Турбо-Паскаль.
4. Примеры разработки программ на языке Турбо Паскаль.
А. Разработка программ с использованием блок-схем алгоритмов.
program quad_eq; {проект}
1. Постановка задачи:
По вводимым коэффициентам А,В,С квадратного уравнения
A*x*x + B*x + C =0 вычислить его корни. Исходные данные и
результаты вычислений представить в удобном виде на экра-
не с учётом возможных аномалий.
2. Входные и выходные переменные:
a,b,c:real; - коэффициенты уравнения
х1,х2: real; - корни уравнения
3. Аномалии:
if <А=0> then <сообщение об ошибке и выход из программы>
if < корни мнимые> then < вывод сообщения и выход из программы>
4.Экранная форма:
begin
‘Нахождение корней уравнения A*x*x + B*x + C =0’
‘ Введите коэффициенты уравнения:’
‘A=‘ <A>
‘B=‘ <B>
‘C=‘<C>
‘Корни уравнения:’
[‘Ошибка: А=0 ’]
[‘Нет вещественных корней’]
[‘ X1=X2=‘ <корень>]
[‘X1= <x1> ‘ X2=‘ <x2>]
end.
************************************************************************************
{Блок-схема алгоритма задачи quad_eq }
program quad_eq; {0.2}
{ Корни квадратного уравнения}
var a,b,c:real; x1,x2:real; d,f:real;
begin writeln('Нахождение корней уравнения A*x*x + B*x + C =0');
writeln('Введите коэффициенты уравнения:');
write('A=');read(a); write('B=');read(b);write('C=');read(c);
writeln('Корни уравнения:');
if (a=0) then writeln('Ошибка: А=0 ')
else begin d:= (b*b -4*a*c); f:=-b/(2*a);
x1:=f +sqrt(d)/(2*a); x2:=f-sqrt(d)/(2*a);
if d<0 then writeln('Нет вещественных корней');
if d=0 then writeln('X1=X2=',f);
if d>0 then writeln('X1=',x1:2:3,' X2=',x2:2:3);
end;
end.
Б. Разработка программ с использованием псевдокода.
program decomp; {проект}
1.Постановка задачи:
Для заданного целого числа N вычислить разложение его на простые
множители в виде N=j1*j2*...jm, где: j1=1, j1<=j2<=...<=jm, все jк - простые,
1 к m.
Исходные данные и результат представить в удобной форме на экране.
2.Входные и выходные переменные:
N:integer; - исходное число
j:integer; - текущий простой множитель числа N
3.Аномалии:
if N=0 then writeln('N=0:ошибка'); Повторить ввод N;
if N<0 then Вычисление для abs(N).
4.Экранная форма:
begin
{ 'Введите n ='<N>
['N=0:ошибка'] }
<N> =1{'*' <j > }
end.
******************************************************************************************
{ Разработка алгоритма задачи decomp}
program decomp;{0.1}
var n,j:integer;
begin repeat write('Введите n=');readln(n);
if n=0 then writeln('n=0:ошибка')
until n<>0;
{1* проверка n<0 } write(n,'=1');
{2* вычисление и вывод очередного множителя}
end.
**********************************************************
program decomp;{0.2}
var n,j:integer;
begin repeat write('Введите n=');readln(n);
if n=0 then writeln('n=0:ошибка')
until n<>0;
if n<0 then n:=abs(n); write(n,'=1');
j:=2; while n>=j do
if {3* j является делителем n}
then begin {4* вывести j и удалить делитель j из n } end
else j:=j+1;
end.
***********************************************************
program decomp;{0.3}
var n,j:integer;
begin repeat write('Введите n=');readln(n);
if n=0 then writeln('n=0:ошибка')
until n<>0;
if n<0 then n:=abs(n);
write(n,'=1'); j:=2; while n>=j do
if (n mod j =0) then
begin {4* вывести j и удалить делитель j из n } end
else j:=j+1;
end.
***********************************************************
program decomp;{0.4}
var n,j:integer;
begin repeat write('Введите n=');readln(n);
if n=0 then writeln('n=0:ошибка')
until n<>0;
if n<0 then n:=abs(n);
write(n,'=1'); j:=2; while n>=j do
if (n mod j =0) then
begin write('*', j);n:=n div j end
else j:=j+1;
end.
program dec_bin; {проект}
1.Постановка задачи:
Перевести вводимое десятичное число в эквивалентное
ему двоичное число. Исходное число и результат пред-
ставить в удобном виде на экране (в отдельных окнах).
2.Входные и выходные переменные:
dec: integer; - входное десятичное число
bin:string; - результирующее двоичное число
3.Аномалии: нет
4. Экранная форма:
begin
- - - - - - - - - - - - - - - - - - - - - - - -- - - - -
‘Введите десятичное число:’ <dec>
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
‘Двоичное число:’ <bin>
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
end.
*************************************************************************
{Разработка алгоритма задачи dec_bin}
program dec_bin; {0.1}
var dec:integer; bin:string;C:char;
begin {0 * Установка окна для ввода данных }
write('Введите десятичное число:');read(dec);
bin:='';repeat {1* вычисление C= остатку dec по модулю 2}
{2* добавление C к текущему значению bin}
{3* целочисленное деление dec на 2}
until dec=0;
{4* Установка окна для представления результата}
writeln('Двоичное число:', bin);
end.
*********************************************************************************
program dec_bin; {0.2}
{Перевод десятичного числа в двоичное}
uses CRT;
var dec:integer; bin:string;c:char;
begin Clrscr;TextBackground(blue);window(1,10, 60,12);Clrscr;
write('Введите десятичное число:');read(dec);
bin:='';repeat if dec mod 2=1 then c:='1' else c:='0';
bin:=c+bin;dec:=dec div 2;
until dec=0;
TextBackground(green);window(1,15, 60,17);Clrscr;
writeln('Двоичное число:', bin);
end.