Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Часть I. Основы программирования на Паскале

Поиск

УДК

621.398

Б28

 

 

Утверждено учебным управлением МЭИ

Подготовлено на кафедре экономики и управления
Гуманитарно-прикладного института
Московского энергетического института (технического университета)

 

Рецензенты:

канд. техн. наук, профессор А.А. Крюков (СТАНКИН),

канд. техн. наук, доцент К.Г. Меньшикова (МЭИ)

 

Батасова В.С.

Начальный курс программирования на основе алгоритмического языка Паскаль. Учебное пособие по курсу «Высокоуровневые методы информатики и программирования». – М.: Издательство МЭИ, 2006.–116 с.

Излагаются основы алгоритмизации и программирования. Главный акцент делается на анализ задачи и разработку принципиальной схемы алгоритма без при­вязки к алгоритмическому языку. Даются основные приемы кодирования алгоритмов на Паскале. Рассматриваются такие разделы программирования как типы и структуры данных, основные алгоритмические структуры, подпрограммы, модули, обработка текстов и документов сложной структуры, файлы.

Для студентов Гуманитарно-прикладного института,
обучающихся по специальностям «Прикладная информатика»,
«Математические методы в экономике». Может быть полезно студентам всех технических и экономических специальностей МЭИ, обучающихся программированию.

 

© Московский энергетический институт, 2006


 

ВВЕДЕНИЕ

Настоящее пособие представляет собой попытку изложения общих основ программирования, независимых от алгоритмического языка. Конкретный язык программирования – в данном случае, Паскаль – используется для приобретения практических навыков кодирования алгоритмов и отладки программ. Это уже вторая попытка: настоящее пособие представляет собой результат переработки [1], как бы перевод его с СИ на Паскаль. Возможность такого перевода еще раз подтверждает тезис: «Не важно, на каком алгоритмическом языке программируешь, а важно, какие задачи решаешь».

Любая программа, независимо от алгоритмического языка, на ко­тором она написана, состоит из описания данных и описания дей­ст­вий, выполняемых с этими данными. "Алгоритмы+структуры дан­ных = программы" - это название книги [2] классика современного програм­мирования Н. Вирта является важнейшим принципом разра­ботки про­грамм.

Существующие в настоящее время универсальные алгоритми­ческие языки (т.е. языки, содержащие все основные средства совре­менного программирования), такие как Паскаль, Си, Фортран, Бейсик, практически не отличаются по своим возможностям. Различия в пра­вилах построения фраз языка не являются принципиальными, освое­ние этих правил - дело практики, а приверженность программиста к ка­кому-то алгоритмическому языку обычно является следствием мно­голетней привычки. Вы­бор алгоритмического языка Паскаль для данного пособия объясняется тем, что в настоящее время он является признанным языком для обучения программированию, а пособие предназначено, прежде всего, для тех, кто учится программировать «с нуля». Автор надеется, что пособие поможет и при изучении Паскаля как второго (или следующего) языка.

Чтобы начать писать программы на каком-либо алгоритмиче­ском языке, надо знать:

1. Какова структура простейшей (не использующей нестандартные подпрограммы) программы, в каком порядке в ней разме­щаются ин­струкции языка.

2. Какие типы и структуры данных приняты в языке и как они опреде­ляются (описываются), какие операции над данными различных ти­пов допустимы в языке, как строятся с их помощью выражения и как они вычисляются. Заметим, что на начальном этапе овладения язы­ком необязательно глубоко изучать все допустимые в нем типы и структуры, достаточно знать те, которые необходимы для реше­ния интересующего вас класса задач.

3. Как записывать операторы преобразования данных: оператор при­сваивания, с помощью которого осуществляются все преобразова­ния внутренних данных, операторы ввода (передачи данных с внеш­них устройств в память компьютера) и вывода (передачи дан­ных из памяти компьютера на внешние устройства).

4. Как записать алгоритм (порядок, организацию обработки данных). Современные алгоритмические языки, как правило, имеют избы­точный набор управляющих операторов для кодирования алгорит­мов. На первом этапе изучения языка можно познакомиться с тремя-пятью из них, достаточными для программирования основных алго­ритмических структур, с помощью которых можно записать любой алгоритм.

Изложению перечисленных сведений посвя­щена первая часть пособия. Дальнейшее изучение программи­рова­ния связано с подпрограммами, организацией многомодульных программ (этот мате­риал из­лагается во второй части), а также со сложными типами дан­ных (тре­тья часть). В четвертой части излагаются правила работы с динамическими массивами. Объектно-ориентирован­ное и визуальное про­граммирова­ние не входит в данное пособие.

Следует заметить, что овладение конструкциями алгоритми­ческого языка еще не означает умения программировать. Главную роль в создании программных средств играет умение анализировать задачу и разрабатывать принципиальную схему алгоритма без при­вязки к алгоритмическому языку. Однако обучение начальным навы­кам алгоритмизации не укладывается в формальные рамки, и напи­сать пособие по этой теме также трудно, как самоучитель по чтению и письму. Чтобы помочь начинающим программистам, в пособии, на­ряду с программами на Паскале, используются блок-схемы, которые, по­жа­луй, являются наиболее общим и наглядным способом описания алго­ритмов.

Для читателей, впервые столкнувшихся с программированием, поясним, что программа, написанная на алгоритмическом языке, должна быть переведена в коды компьютера. Процесс такого перевода назы­вается трансляцией, а специальная программа-переводчик - транс­лято­ром. Существует два способа трансляции: компиляция и интерпре­та­ция. При компиляции программа сначала полностью переводится в коды, а затем выполняется без участия компилятора. При интерпретации последовательно чередуются перевод группы инструкций языка в коды и их выполнение. Алгоритмический язык Паскаль (также как Си и Фортран) требует именно компиляции. Откомпилированная программа (так называемый объектный модуль) далее подвергается редактированию связей [1] (процесс под­ключения к программе подпрограмм) и загрузке в оперативную па­мять. В результате такой обработки получается готовая к выполне­нию программа, которая называется исполняемой программой или загру­зочным модулем.

Трансляторы обычно входят в состав сис­тем программирования, включающих в себя также редактор для на­бора и исправления текстов программ, редактор связей, загрузчик, средства для работы с файлами, программу-отладчик и среду, обес­печиваю­щую удобную работу с этими программами.

Примеры пособия ори­ентиро­ваны на систему программирования Borland Pascal 7.0 и операционную систему MS DOS или на режим консольного приложения среды Delphi. Среда программирования Borland Pascal предполагает использование алгоритмического языка с тем же именем, являющегося расширением стандартного языка Паскаль; более ранняя среда (и язык) Turbo Pascal с точки зрения основ программирования мало отличается от Borland Pascal и может использоваться читателем для отладки программ. Среда Delphi имеет в своей основе язык Object Pascal. Краткое описание основных приемов работы в этих средах дано в Приложениях; подробнее с этими средами и соответствующими версиями языка можно ознакомиться, например, в [3-5].

Имея целью начальное обу­чение программированию, мы рассмотрим только подмно­жество языка Borland Pascal (или Object Pascal в Delphi), позволяющее писать простые и практически важные программы. Пособие не имеет своей целью полное описание этих языков.


Данные и операции над ними

Типы данных

Кроме разделения данных на переменные и константы, существует классификация данных по типу. Описание переменных прежде всего состоит в объявлении их типа. Тип данных характеризует форму их представления в памяти компьютера, и, следовательно, область значений. Каждый тип характеризуется набором выполняемых над данными операций. Традиционно в универсальных языках программирования имеются такие стандартные типы, как целый, вещественный, символьный и логический[5].

Существование двух числовых типов (целого и вещественного) связано с двумя возможными формами представления чисел в памяти компьютера.

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

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

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

Данные символьного типа принимают значения на всем множестве допустимых для данного компьютера символов. Каждому символу соответствует двоичный код, все коды символов собраны в специальные стандартные таблицы кодирования. В настоящее время используются таблицы ANSI (в которой для хранения одного символьного значения отводится один байт) и UNICODE (код одного символа занимает два байта). Эти таблицы совместимы: первые 256 кодов UNICODE совпадают с кодами ANSI. Существование двух кодовых таблиц объясняется необходимостью поддержки приемственности программного обеспечения при развитии компьютерной техники: для уже устаревших 16-разрядных компьютеров используется таблица ASCII, первая половина которой совпадает с ANSI.

В Паскале для описания данных символьного типа используется ключевое слово char. В версии Borland Pascal используется только система кодированияANSI. В Object Pascal, кроме типа char, имеется тип widechar, поддерживающий кодировку UNICODE.

Данные логического типа в Паскале описываются с помощью ключевого слова boolean.

Используемые в различных версиях Паскаля целые и вещественные типы представлены в таблицах 1-4.

Таблица 1.

Стандартные целые типы данных Borland Pascal
(операционная среда MS DOS)

Тип данных Размер, байты Диапазон значений
byte   0...255
shortint   -128...127
word   0...65535
integer   -32768...32767
longint   -2147483648...2147483647

Таблица 2.

Стандартные целые типы данных Object Pascal
(операционная среда Windows)

Тип данных Размер, байты Диапазон значений
byte   0...255
shortint   -128...127
word   0...65535
smallint   -32768...32767
integer   -2147483648...2147483647
longint   -2147483648...2147483647
longword   0…4294967295
int64   -263…+263-1

Таблица 3.
Стандартные вещественные типы данных Borland Pascal (операционная среда MS DOS)

Тип данных Размер, байты Диапазон порядка Число цифр мантиссы
single   -45...+38 7…8
real   -39…+38 11…12
double   -324...+308 15…16
extended   -4951...+4932 19…20
comp[6]   -263-1…+263-1 19…20

Таблица 4.
Стандартные вещественные типы данных Object Pascal
(операционная среда Windows)

Тип данных Размер, байты Диапазон порядка Число цифр мантиссы
single   -45...+38 7…8
real48   -39…+38 11…12
real   -324...+308  
double   -324...+308 15…16
extended   -4951...+4932 19…20
comp[7]   -263-1…+263-1 19…20
currency[8]   ‑922337203685477.5808…922337203685477.5807 19…20

 

Заметим, что помнить эти таблицы совершенно необязательно. Для написания программ первой части пособия нам потребуются всего два числовых типа: вещественный real и целый integer.

Все рассмотренные в этом параграфе типы относятся к стандартным (т. е. встроенным в язык) типам Паскаля. У пользователя имеется возможность задать собственные, нестандартные типы в разделе TYPE программы – об этом см. §§1.5.2, 1.6.

Правила записи констант

Мы рассмотрим простейшие[9] правила записи явных констант. Целая десятичная константа - это последовательность десятичных цифр, например, 12678909. Последовательность шестнадцатеричных цифр (0, 1,..., 9, A, B, C, D, E, F), перед которой записан символ доллара $, представляет собой целую шестнадцатеричную константу; например, $FF - шестнадцатеричное представление числа 255.
Соответствующие отрицательные значения получаются в результате применения унарной операции минус (-), см. п.1.2.5.

Простейшие правила записи вещественных констант состоят в следующем: разделителем между целой и дробной частью числа является точка; можно использовать показатель десятичного порядка Е (большую или малую латинскую букву). Пример вещественных констант: 100.01, 3.44Е3 (значение 3.44*103), 1.0 Е-2 (значение 0.01).

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

Символьная константа - это соответствующий символ клавиатуры, заключенный в апострофы. Примеры: 'a', '5', '?'. Другой способ задания констант - в виде # код, например, #32 –пробел, #90 буква Z.

Уже при написании простейших программ при записи операторов вывода (а иногда и ввода) нам потребуется понятие строковой константы. Это последовательность символов, заключенная в одинарные кавычки (апострофы). Например: ‘Введите исходные данные'.

Логические константы обозначаются следующим образом: false – ложь, true - истина

1.2.4. Описание переменных и именованных констант
в Паскале

Пока мы рассматриваем данные, занимающие одну ячейку памяти. Такие данные называются простыми. Простые переменные описываются в разделе переменных после слова Var с помощью инструкций вида:

Var список_имен_переменных: тип;

Слово список при описании фрагментов алгоритмического языка обычно означает, что элементы списка перечисляются через запятую. Инструкции в Паскале разделяются точкой с запятой (обратите внимание на этот знак в конце описания).

Пример описания:

Var a, b:real; n,i, j,k:integer;

Именованные константы описываются в разделе констант после ключевого слова Const с помощью инструкций вида:

Const имя_константы=значение константы;

Здесь ключевое слово const показывает, что определяемое данное имеет постоянное значение, т. е. доступно только для чтения. Тип константы определяется по ее значению.

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

 

Выражения

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

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

Арифметические: * (умножение), div (деление нацело), mod (остаток от целочисленного деления), / (деление), + (сложение), - (вычитание).

Логические: NOT (отрицание), OR (дизъюнкция), AND (конъюнкция).

Соотношения: = (равно), <> (неравно), < (меньше), > (больше), <= (меньше или равно), >= (больше или равно), IN (вхождение в множество).

Операции DIV и MOD, естественно, применимы только к целым операндам.

Действия выполняются слева направо с учетом следующих приоритетов (перечислены в порядке убывания):

1) NOT;

2) мультипликативные операции: *, /, div, mod, AND;

3) aддитивные операции: +, -, OR;

4) соотношения: =, <>, <, >, <=, >=, IN.

Программистам, привыкшим к СИ и Фортрану, следует быть внимательными: приоритеты отличны от принятых в этих языках.

Например, в паскалевском выражении

(a>0.1) AND (b<0)

скобки обязательны: при их отсутствии первой будет выполняться операция AND, что логически неверно. Заметим, что компилятор при этом выдаст сообщение о несоответствии типа операндов (0.1 и b) типу операции AND.

Смешивать типы операндов допустимо лишь для арифметических выражений (один операнд типа integer, другой - типа real). Тип результата в этом случае определяется следующим образом: операции *, +, - при целых операндах дают целый результат; если хотя бы один операнд вещественный, то эти операции дают вещественный результат. Операция / дает вещественный результат при любых операндах (в отличии от СИ и Фортрана).

В таблице 5 приведены некоторые часто используемые стандартные функции Паскаля.


Таблица 5. Некоторые встроенные функции Паскаля

Обозначение Паскаля Смысл (математическое обозначение) Тип аргумента Тип результата
abs(x) abs(x) числовой совпадает с типом аргумента
arctan(x) arctg(x) вещественный вещественный
cos(x) cos(x) вещественный вещественный
exp(x) ex вещественный вещественный
ln (x) ln x вещественный вещественный
sin (x) sin x вещественный вещественный
sqr(x) x2 числовой совпадает с типом аргумента
sqrt(x) вещественный вещественный
round(x) преобразование из вещественного в целое с округлением вещественный целый
trunc(x) преобразование из вещественного в целое с отбрасыванием дробной части вещественный целый
odd(x) целый булевский
ord(x) номер х в последовательности значений порядкового типа[10] любой порядковый целый
succ(x) следующее значение порядкового типа любой порядковый совпадает с типом аргумента
pred(x) предыдущее значение порядкового типа любой порядковый совпадает с типом аргумента

 


 

1.3. Операторы преобразования данных

Оператор присваивания

Оператор присваивания осуществляет преобразование внутренних данных. Он имеет вид

<переменная>:=<выражение>

Оператор присваивания означает, что вычисляется выражение, стоящее справа от знака присваивания (:=), и вычисленное значение присваивается переменной, стоящей слева от знака присваивания. Переменная может иметь индексы.

Переменная и выражение должны иметь одинаковый тип; имеются два исключения из этого правила:

§ можно использовать вещественные или целые типы разной мощности (например, integer – shortint), при этом значение результата должно принадлежать диапазону допустимых значений для типа переменной – см. таблицы 1-4;

§ переменой вещественного типа можно присваивать выражение целого типа (но не наоборот!).

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

Примеры

k:=k+1;{увеличение значение k на единицу}

S:=S+a; {значение переменной S увеличивается на a}

p:=p*i; {значение переменной р увеличивается в i раз}

Необходимо, чтобы накапливаемой переменной до оператора накапливания было задано некоторое начальное значение. Операторы такого вида обычно используются в циклах (см. §1.4.4).

Понятие ввода и вывода

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

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

Последовательность значений на входном (или выходном) устройстве часто называют потоком.

В Паскале для ввода и вывода используются встроенные в язык стандартные подпрограммы, и операторы ввода и вывода являются обращениями к этим подпрограммам.

В этом разделе пособия мы рассмотрим только операторы ввода с клавиатуры и вывода на экран монитора. Работа с внешней памятью (файлами на магнитных дисках) будет рассмотрена в третьей части пособия.

Оператор вывода

Оператор вывода имеет вид:

WRITE(V1,V2,...,VN)

и означает вывод на экран монитора значений выражений V1,V2,...,VN (без перехода к следующей строке по окончании вывода). Последовательность V1,V2,...,VN называется списком вывода. В частности, элементом списка вывода Vi, i=1,...,M, может являться переменная (простая или с индексом[11]) или константа.

Оператор WRITELN означает переход к новой строке (т.е. вывод символа конца строки).

Оператор WRITELN(V1,V2,...,VN) эквивалентен двум операторам

WRITE(V1,V2,...,VN); WRITELN

Вместо Vi (i=1,2,...,N) может стоять группа:

Vi:Li:Mi,

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

Mi - длина дробной части, указывается только для вещественных чисел; если параметр Мi указан, то вещественное число выводится в формате с фиксированной точкой, иначе - в экспоненциальном формате, причем используется стандартный для данной среды программирования вид экспоненциального формата.

Программисты, работавшие с Фортраном, будут разочарованы: в Паскале (как и в Си) массивы вводятся и выводятся только поэлементно.

Пример.

Var s:real; a,b:integer;

begin…

writeln(‘a=’,a, ‘ b=’,b);

writeln(‘ s=’, s:4:1);…

end.

На экран будет выведена информация в виде:

a=<a> b=<b>

s=<s>

Здесь конструкция <имя переменной> означает значение этой переменной. Заметим, что следующие значения будут выводиться с новой строки, так как для вывода s использовался оператор writeln. Такое схематичное изображение выводимой (или вводимой) информации называется формой вывода (ввода).

Если a=-2, b=93, s=3.22, то на экране получим:

a=-2 b= 93

s= 3.2

Примеры оператора WRITELN также представлены на рис.1.

 

Оператор ввода

Оператор

READ(V1,V2,...,VN)

означает ввод значений переменных V1,V2,..., VN. Переменные могут иметь индексы. Константы и выражения в списке ввода недопустимы, так как не подлежат изменению.

Встретив оператор ввода, компьютер приостанавливает выполнение программы до окончания задания значений исходных данных пользователем (в профессиональной терминологии программистов - организуется прерывание для ввода). Вводимые значения могут разделяться пробелами (одним или несколькими) или переводом строки (нажатием клавиши Enter); допустимы в качестве разделителей значений исходных данных и некоторые другие символы. Обратите внимание, что после последнего введенного значения надо обязательно нажать Enter. До нажатия клавиши Enter вводимые значения накапливаются в буфере ввода, нажатие этой клавиши служит командой для передачи этих значений в память.

Приведенный выше оператор эквивалентен последовательности операторов:

READ(V1);READ(V2);...;READ(VN)

Оператор READLN предусматривает пропуск вводимых символов до нажатия клавиши Enter, т. е. до ввода символа конца строки (END OF LINE).

Оператор READLN(V1,V2,...,VN) эквивалентен двум операторам

READ(V1,V2,...,VN); READLN

или последовательности операторов

READ(V1);READ(V2);...;READ(VN);READLN

Оператор ввода с клавиатуры всегда предваряется выводом фразы, приглашающей к вводу. Иначе пользователь может только догадываться, по какой причине программа находится в состоянии ожидания; такая ситуация является необъяснимым остановом и может интерпретироваться как “зависание” компьютера.

Пример.

Var i:integer; a:real;

begin

writeln(‘Введите i и a’); { вывод приглашения к вводу }

readln(i, a);...{оператор ввода}

Форма ввода:

Введите i и a

В фигурные скобки принято заключать альтернативные фрагменты формы ввода или вывода. В данном примере значения i и a можно располагать на одной строке экрана, разделяя их пробелами, а можно на разных строках, разделяя их нажатием клавиши Enter.

Следование

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


2. Ветвление (развилка)

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

 
 

Ветвление предполагает проверку некоторого условия. Если на момент проверки условие истинно, то будет выполнен оператор 1, иначе оператор 2. В Паскале ветвление кодируется с помощью условного оператора:

if условие then

Оператор 1

Else

оператор 2

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

Возможна ситуация, когда ветвь “Нет ” не содержит операторов В этом случае в условном операторе слово else и оператор 2 отсутствуют.

Если операторы 1 или 2 состоят из нескольких операторов (являются составными), то входящие в них операторы окаймляются операторными скобками begin-end:

if условие then

begin

оператор 1_1;

оператор 1_2;

оператор 1_N

End

Else

Begin

оператор 2_1;

оператор 2_2;

оператор 2_M

End

Таким образом, операторные скобки begin-end позволяют объединить несколько операторов в один составной.

Цикл

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

 

На Паскале циклы кодируются следующим образом:

цикл-пока цикл-до
while условие do тело цикла Repeat тело цик ла until условие

Тело цикла должно представлять собой один оператор – простой или составной.

Замечания

1. Каждая из трех рассмотренных базовых структур имеет один вход и один выход. Это очень важно, так как любой прямоугольник на рисунках 3 – 5 может представлять собой одну из базовых структур.

2. В теории алгоритмов доказано, что для построения любого алго­ритма достаточно иметь три базовых структуры: следование, ветвле­ние, цикл. Это положение называется принципом Дейкстры. Причем безразлично, какую цик­лическую структуру – до или пока – выбрать в ка­честве базовой. Практика программирования, од­нако, сложилась так, что равноправно использу­ются обе эти структуры.

Кроме того, в программировании широко используется еще одна базовая структура (избыточная), которая называется параметрическим циклом (см. рис.6). Этот цикл управляется переменной (так называемым параметром цикла, на блок-схеме для него выбрано имя i), которая меняется от начального значения до конечного с заданным шагом (в Паскале шаг равен единице). Разработчиками компилятора параметрический цикл может быть реализован и как цикл с предусловием, и как цикл с постусловием. Учитывая практику последнего времени, мы считаем, что параметрический цикл реализован как цикл с предусловием.

Для кодирования параметрического цикла в Паскале используется оператор:

for i:= нач_знач to кон_знач do

тело цикла;

Существует также вариант оператора for, в которомпараметр изменяется с шагом –1:

for i:= нач_знач downto кон_знач do

тело цикла;

Как и для предыдущих операторов, тело цикла – один оператор, простой или составной.

Примеры разработки программ

Пример 1. Программа решения квадратного уравнения

ax 2 + bx + c=0

Исходные данные: a, b, c - коэффициенты уравнения, вещественные переменные.

Выходные данные: х1, х2 - значения двух корней уравнения, если дискриминант неотрицателен, и значения вещественной и мнимой частей комплексно-сопряженных корней, если дискриминант отрицателен; это также вещественные переменные.

Промежуточные данные: d - дискриминант уравнения, вещественная переменная.

Блок-схема алгоритма представлена на рис.7. Алгоритм должен разделяться на две ветви в зависимости от знака дискриминанта, поэтому он использует базовую структуру ветвление. Ввод исходных данных,вычисление и анализ d соединены последовательно (используется базовая структура следование).

По этой блок-схеме написана программа:

Program kv_ur;

Var a,b,c,x1,x2,d:real;

Begin

Writeln ('введите коэффициенты уравнения');

Readln(a,b,c);

d:=sqr(b)-4*a*c;

if d>=0 then

begin

x1:=(-b-sqrt(d))/2/a;

x2:=(-b+sqrt(d))/2/a;

writeln('действ. корни уравнения х1=', x1, ' x2=',x2)

end

else

begin

x1:=-b/2/a;

x2:=sqrt(-d)/2/a;

writeln(‘уравнение имеет комплексно-сопряженные корни’);

writeln('мнимая часть компл. корней х2=',x2);

writeln('действит. часть компл. корней х1=',x1)

end;

Readln;{для задержки экрана с результатами}

End.

 
 

Пример 2. Составить программу решения следующей задачи.

На начало первого из рассматриваемых месяцев вклад клиента в банке был равен a руб. В течение каждого следующего месяца со счета снимается b руб.; в конце каждого месяца на остаток вклада начисляется р%. Вывести величину вклада на начало 1, 2,...n месяца.

Исходные данные: a, b, p - вещественные переменные, n - целая переменная.

Выходные данные: i - номер месяца, v - величина вклада на начало месяца.

Блок-схема алгоритма приведена на рис. 8.

 

Program primer2;

Var a,b,p,v:real; n,i:integer;

Begin

Writeln('Введите a,b,p,n');

Readln(a,b,p,n);

If a<b then

writeln('a,b недопустимы')

else

begin

v:=a;

i:=1;

while (i<=n) and (v>=b) do

begin

writeln(i:7, v);

v:=v-b;

v:=v*(1+p/100);

i:=i+1

end

end;

Readln;

End.

Обратите внимание, что при v<nb возможна ситуация, когда цикл выполнится меньше, чем n раз.

Массивы

1.5.1. Понятие массива.
Основные правила работы с массивами в Паскале

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

Массив - это сложноеданное, состоящее из конечного числа упорядоченных компонент, имеющих одно имя, одинаковый тип и расположенных в последовательных ячейках памяти компьютера.

Массивы применяются очень часто, так как многие задачи связаны с обработкой информации, представляющей собой конечное множество однотипных данных. Например, массивы оценок в студенческой ведомости, массивы выплат сотрудникам некоторого предприятия, массивы фам



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 215; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.137.221.252 (0.016 с.)