End.
Begin
End.
Begin
Begin
Begin
<последовательность размещения выводимой информации на экране>
end.
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.Экранная форма:
‘Нахождение корней уравнения 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.Экранная форма:
{ 'Введите n ='<N>
['N=0:ошибка'] }
<N> =1{'*' < j > }
******************************************************************************************
{ Разработка алгоритма задачи 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. Экранная форма:
- - - - - - - - - - - - - - - - - - - - - - - -- - - - -
½ ‘Введите десятичное число:’ <dec>½
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
½ ‘Двоичное число:’ <bin> ½
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
*************************************************************************
{Разработка алгоритма задачи 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.
1. Типы данных в Паскале.
3. Оператор выбора case -of.
4. Пример программы с простыми типами и оператором выбора.
1. Типы данных в Паскале.
Ранее мы познакомились с некоторыми стандартными типами данных: числовыми, символьным, строковым и булевским. Стандартные типы данных - это лишь частный случай общей концепции типа данных Паскаля. Согласно этой концепции тип данных - множество возможных значений этого типа (т.е. констант типа) и набор допустимых операций, применимых к типу. Для представления констант типа фиксируется формат их размещения в памяти компьютера (структура данных).
В языке Паскаль впервые была выдвинута и реализована идея типов, конструируемых программистом (в отличие от господствующей ранее концепции стандартных типов данных). Таким образом, тип данных стал таким же компонентом для программы, как переменные или процедуры.
Конструирование требуемых в программе типов данных открыл качественно новый, более совершенный стиль программирования хорошо структурированных программ. Вновь создаваемый тип должен быть описан в разделе описаний программы. Общая форма описания типа имеет вид:
type < имя типа > = < описание типа >;
где: < имя типа > выбирается программистом,
< описание типа > имеет для каждого типа принятую в Паскале синтаксическую форму описания, с которой мы познакомимся при описании соответствующих типов.
В Турбо Паскале имеется целая иерархия типов данных. Ниже приводится классификация типов данных Турбо Паскаля:
Простые Порядковые Целые
Типы данных Вещественные Символьные
Структурные Массивы Логические
Записи Перечислимые
Множества
Файлы
Указатели
Рис. 2. Классификация типов данных Турбо Паскаля.
|
|
|
Простые типы отличаются тем, что их значения атомарны, т.е. неразложимы на какие либо другие типы, а структурные (составные) типы - "контейнеры", которые могут содержать один или несколько компонентов других типов (простых или составных).
В Паскале различают 5 видов структурных типов: массивы, записи, множества, файлы и указатели. Все эти типы мы будем рассматривать в последующих лекциях. В приведенной классификации мы не отразили обобщение типа - объект, а также так называемые процедурные типы. Эти конструкции являются предметами отдельного рассмотрения в соответствующих разделах курса. В данной лекции мы подробнее рассмотрим лишь простые типы Турбо Паскаля.
Согласно приведенной классификации, простые типы включают порядковые и вещественные типы. Рассмотрим вначале порядковые типы.
Порядковый тип - такой тип, который содержит упорядоченный ряд значений так, что каждому значению можно однозначно сопоставить некоторый порядковый номер (отсюда и название - порядковый тип). Другими словами, на порядковом типе задан линейный порядок значений (с отношениями <, >, <=, >=, =, <> между значениями). Каждый порядковый тип эквивалентен некоторому отрезку натурального ряда.
Вещественные типы не обладают указанными свойствами порядковых типов, т.к. множество их значений не сопоставимо однозначно с целыми числами-номерами (в виду приближенного представления вещественных чисел!).
К любому порядковому типу применимы следующие функции:
Ord(X) - порядковый номер значения выражения Х этого типа;
Pred(X) - предыдущее значение выражения Х этого типа;
Succ(X) - следующее значение выражения Х этого типа;
High(X) - наибольшее значение диапазона аргумента Х;
Low(X) - наименьшее значение диапазона аргумента Х;
Функция Ord определена для любого значения порядкового типа, причём нумерация значений начинается от номера 0 (номера наименьшего значения типа). Функции Pred и Succ не определены соответственно для левой и правой границы отрезка номеров значений типа.
Рассмотрим теперь разновидности порядковых типов согласно классификации.
Целые типы. Помимо уже знакомого нам типа integer, в Турбо Паскале имеется ещё несколько типов для представления целых чисел. Два из них представляют отрезки натуральных чисел:
byte - тип с диапазоном значений от 0 до 255 (представимых одним байтом);
word -тип с диапазоном значений от 0 до 65535 (представимых двумя байтами).
Два целых типа представляют "короткие целые" и "длинные целые":
shortint - тип с диапазоном значений -128.. +127 (длиной 1 байт)
longint - тип с диапазоном значений -2147483648..+2147483647 (длиной четыре байта).
Для всех целых типов применимы стандартные процедуры и функции:
Таблица 3: Основные стандартные процедуры и функции для целых типов:
| Форма обращения | Тип результата | Выполняемое действие |
| inc(x[,j]) | Integer | Увеличение х на j (при отсутствии j: j= 1) |
| dec(x[,j]) | integer | Уменьшение х на j (при отсутствии j: j= 1) |
| sqr(x) | такой же, как х | Возведение числа х в квадрат |
| abs(x) | такой же, как х | Абсолютное значение х |
| chr(x) | Сhar | Перевод кода x в символ ASCII |
| odd(x) | Boolean | Признак нечётного числа |
| random(x) | такой же, как х | Генерация случайного числа в диапазоне 0.. х-1 |
Для целых типов ord(x) = х, pred(x) = x - 1, succ(x) = x + 1.
Символьный тип. Значениями этого типа являются, как указывалось ранее, все символы кодовой таблицы ASCII (Американский стандартный код внутримашинного обмена, используемый в системе MS DOS), которые считаются, упорядочены своими кодами. Для символьного типа применимы бинарные отношения (<,>, <=,>=,=, <>). Значением функции ord является код символа (в диапазоне 0..255). Стандартными функциями, применимыми к типу char, являются:
chr(b) - преобразование значения выражения b типа byte в символ ASCII.
upcase(c) - преобразование строчных латинских букв в прописные (для символов, не являющихся латинскими буквами, результатом является сам символ с).
Логический тип. Значениями логического типа (Boolean) являются константы true и false, которые считаются упорядоченными так, что ord(false)=0, ord(true) =1.
Соответственно, pred(true)= false, succ(false) =true, false<true, true>false.
Логические операции and, or, xor, not применимы также к целым числам, как битовые операции (0 - эквивалентен false, а 1 - эквивалентен true). К битовым операциям также относятся операции shl и shr (J shl K - сдвиг J на K бит влево, и J shr K - сдвиг J на K бит вправо).
Перечислимый тип. Это тип, задаваемый перечислением своих значений. В Паскале приняты соответствующие формы описания перечислимых типов, наиболее общим, из которых является следующий:
type < имя типа > = (< список значений >);
где: < список значений > - перечисляемые через запятую значения, располагаемых в порядке от минимального до максимального (т.е. в виде диапазона значений). Каждое значение обозначается уникальным именем (идентификатором значения). Пример определения перечислимого типа:
type color= (black, red, green, blue, white);
Максимальная мощность перечислимого типа - 65536 значений.
Для любого порядкового типа можно определить тип-диапазон как подмножество значений этого порядкового типа (базового типа). Тип диапазон определяется своими границами внутри базового типа в форме: < мин.значение >.. < макс.значение >
Например, type digit = 0..9; {тип - десятичная цифра}
date = 1..31; { тип - дата }
lat_lt = 'A'..'Z'; { тип - латинская буква }
color3 = red.. blue; {тип - три цвета из набора color}
Тип-диапазон наследует все свойства своего базового типа, которые применимы для него (некоторые свойства, связанные с ограничением множества возможных значений могут оказаться неприменимы для типа-диапазона). Тип - диапазон предоставляет удобную и компактную форму определения порядковых типов без явного перечисления значений этих типов.
Вещественные типы. Помимо типа real, с которым уже встречались ранее, в Турбо Паскале имеется ещё несколько типов данных для представления вещественных чисел. Для всех этих типов характерно то, что значения чисел представляются приближенно в отличие от представлений целых чисел. Точность представления зависит от вещественного типа, для каждого из которых имеется свой формат представления числа.
Кроме типа real имеется ещё 3 вещественных типа:
single - диапазон десятичного порядка от -45 до +38 (длина числа 4 байта);
double - диапазон десятичного порядка от -324 до +308 (длина числа 8 байтов);
extended -диапазон десятичного порядка от -4951 до +4932 (длина 10 байтов);
Фактически эти типы перекрывают все потребности в точности представления вещественных чисел.
Дополнительно к указанным типам в Турбо Паскале имеется также специальный тип comp, который рассматривается как вещественное число. Фактически число типа comp - целое число со знаком, занимающее 8 байтов и представляющее 19-20 значащих десятичных цифр. Этот тип может использоваться для представления денежных сумм, обеспечивая точность до минимальных денежных единиц.
Для операций с вещественными числами предусмотрены стандартные функции, в числе которых: тригонометрические функции (sin, cos, arctan), логарифм и экспонента (ln, exp), выделение целой и дробной части (int, frag), квадратный корень (sqrt), функции abs, sqr и random, аналогичные функциям, используемым для целых типов.
3. Оператор выбора case -of .
Оператор выбора является обобщением оператора if-then-else на случай выбора одного из нескольких возможных продолжений выполнения программы. Выбор осуществляется по ключу выбора (селектору). Синтаксическая структура этого оператора такова:
case < ключ выбора > of
< константа выбора 1 >: < оператор 1 >;
......
< константа выбора m >: < оператор m >;
[else < оператор >]
end;
где: < константа выбора > - значение того же типа, что и ключ выбора. Ключом выбора может быть выражение любого порядкового типа.
m - число ветвей выбора (не более чем мощность типа ключа выбора).
При выполнении оператора выбора вначале вычисляется значение ключа, а затем последовательным просмотром ветвей выбора отыскивается такая ветвь, для которой константа выбора совпадает со значением ключа. Оператор этой ветви выполняется, после чего оператор выбора завершает работу и передает управление следующему по тексту программы оператору. Ветвь else (если она присутствует) выполняется только в том случае, когда ни одна ветвь оператора case-of не выбрана. Если ветвь else отсутствует, то это эквивалентно ветви else с пустым оператором.
В ветвях выбора вместо констант выбора можно использовать список констант выбора (разделенных запятыми), либо диапазон констант выбора (заданный посредством .. также как для типа-диапазона). В этих случаях выбор ветви производится при равенстве константы из списка или из диапазона констант с ключом выбора.
Операторы выбора являются хорошо структурированным средством выбора из любого числа альтернатив и часто выполняют ту же функцию, что и вложенные операторы if-then-else.
4. Примеры программ с простыми типами и оператором выбора.
Следующая простая программа демонстрирует создание и использование перечислимого типа и оператора case-of.
program colors;{Выбор цвета из набора, заданного перечислимым типом}
uses CRT;
type color = (cWhite,cRed,cBlue,cGreen,cBlack); {перечислимый тип}
var b:0..4; c:color;
begin TextBackground(cyan);TextColor(white);ClrScr;window(10,10,50,20);
write('Введите число (от 0 до 4):');read(b);c:=color(b);
case c of cWhite: begin TextColor(white);writeln('white') end;
cRed: begin TextColor(red);writeln('red') end;
cBlue: begin TextColor(blue);writeln('blue') end;
cGreen: begin TextColor(green);writeln('green') end;
cBlack: begin TextColor(black);writeln('black') end;