Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 8.doc
Скачиваний:
4
Добавлен:
11.07.2019
Размер:
93.18 Кб
Скачать

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]