Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Лекция 9: Концепция типа данных




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. Типы данных в Паскале.

2. Простые типы данных.

3. Оператор выбора case -of.

4. Пример программы с простыми типами и оператором выбора.

1. Типы данных в Паскале.

Ранее мы познакомились с некоторыми стандартными типами данных: числовыми, символьным, строковым и булевским. Стандартные типы данных - это лишь частный случай общей концепции типа данных Паскаля. Согласно этой концепции тип данных - множество возможных значений этого типа (т.е. констант типа) и набор допустимых операций, применимых к типу. Для представления констант типа фиксируется формат их размещения в памяти компьютера (структура данных).

В языке Паскаль впервые была выдвинута и реализована идея типов, конструируемых программистом (в отличие от господствующей ранее концепции стандартных типов данных). Таким образом, тип данных стал таким же компонентом для программы, как переменные или процедуры.

Конструирование требуемых в программе типов данных открыл качественно новый, более совершенный стиль программирования хорошо структурированных программ. Вновь создаваемый тип должен быть описан в разделе описаний программы. Общая форма описания типа имеет вид:

type < имя типа > = < описание типа >;

где: < имя типа > выбирается программистом,

< описание типа > имеет для каждого типа принятую в Паскале синтаксическую форму описания, с которой мы познакомимся при описании соответствующих типов.

В Турбо Паскале имеется целая иерархия типов данных. Ниже приводится классификация типов данных Турбо Паскаля:

 

Простые Порядковые Целые

 

Типы данных Вещественные Символьные

 

Структурные Массивы Логические

 

Записи Перечислимые

 

Множества

 

Файлы

 

Указатели

 

Рис. 2. Классификация типов данных Турбо Паскаля.

 

Простые типы отличаются тем, что их значения атомарны, т.е. неразложимы на какие либо другие типы, а структурные (составные) типы - "контейнеры", которые могут содержать один или несколько компонентов других типов (простых или составных).

В Паскале различают 5 видов структурных типов: массивы, записи, множества, файлы и указатели. Все эти типы мы будем рассматривать в последующих лекциях. В приведенной классификации мы не отразили обобщение типа - объект, а также так называемые процедурные типы. Эти конструкции являются предметами отдельного рассмотрения в соответствующих разделах курса. В данной лекции мы подробнее рассмотрим лишь простые типы Турбо Паскаля.

 

2. Простые типы данных.

Согласно приведенной классификации, простые типы включают порядковые и вещественные типы. Рассмотрим вначале порядковые типы.

Порядковый тип - такой тип, который содержит упорядоченный ряд значений так, что каждому значению можно однозначно сопоставить некоторый порядковый номер (отсюда и название - порядковый тип). Другими словами, на порядковом типе задан линейный порядок значений (с отношениями <, >, <=, >=, =, <> между значениями). Каждый порядковый тип эквивалентен некоторому отрезку натурального ряда.

Вещественные типы не обладают указанными свойствами порядковых типов, т.к. множество их значений не сопоставимо однозначно с целыми числами-номерами (в виду приближенного представления вещественных чисел!).

К любому порядковому типу применимы следующие функции:

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;




Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 354; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.127 сек.