Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УПП Программирование 2102,2202.doc
Скачиваний:
16
Добавлен:
20.04.2015
Размер:
760.32 Кб
Скачать

Министерство образования российской федерации

МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

ТЕХНОЛОГИЙ И УПРАВЛЕНИЯ

(образован в 1953 году)

_______________________________________________________________________________

Кафедра Информационных технологий

Дистанционное Информ – 10.22.2102

обучение Информ – 11.22.2202

А.А. ПОПОВ

Программирование

и основы алгоритмизации

Учебно-практическое пособие для студентов спец. 2102

Программирование

на языке высокого уровня

Учебно-практическое пособие для студентов спец. 2202

.

www.msta.ru

Москва – 2004

УДК 681.3

© Попов А.А.

Учебно-практическое пособие по дисциплинам:

Программирование и основы алгоритмизации”,

Программирование на языке высокого уровня”.

М., МГУТУ, 2004

Рекомендовано Институтом информатизации образования РАО.

Пособие предназначено для студентов специальности 2102 и 2202.

Автор: Попов Александр Алексеевич

Рецензенты: проф. МГУПБТ Сапфиров С.Г.,

проф. МГУПБТ, д.т.н., начальник управления

информационных технологий Бородин А.В.

Редактор: Свешникова Н.И.

© Московский государственный технологический университет технологий и управления, 2004г. 109004, Москва, Земляной вал, 73.

Программирование

на алгоритмическом

языке Турбо Паскаль

Алгоритмические языки предоставляют возможность человеку управлять действиями ЭВМ. Существует множество таких языков, среди которых очень популярным является Турбо Паскаль фирмы Borland (далее просто Паскаль). Для него имеется разновидность для операционной системы Windows – объектно-ориентированная система Delphi. Мы будем изучать DOS-версию языка. Владея этим инстру­ментом, можно при желании быстро перейти и к программированию в Delphi.

1. ЭЛЕМЕНТЫ ЯЗЫКА

Символы. В Паскале разрешены следующие основные символы: 1. Буквы латинского и русского языков (кириллица исполь­зуется только в константах). 2. Цифры. 3. Символы: + – * / = > < . , ( ) [ ] ‘ ; ^ : и другие.

Операции. Арифметические: +, , * (умножение), / (вещес­твенное деление). Операции отношений: =, >, <, >= (больше или равно),<= (меньше или равно), <> (не равно). Операции возведения в произвольную степень в классическом Паскале нет.

Кроме перечисленных, имеются еще две арифметические опера­ции над целыми числами:

div целочисленное деление (дробь отбрасывается, например 14 div 3=4),

mod целочисленный остаток от деления (пример 14 mod 3=2),

 Переменные снабжаются именами, которые могут содержать латинские буквы, цифры и знаки подчеркивания, но начинаться имя должно с буквы. Программист выбирает имена произвольно, но таким образом, чтобы они указывали на смысл переменной. За каждой переменной компьютер закрепляет одну ячейку памяти. Большие и маленькие буквы в именах воспринимаются компьютером одинаково, т.е. буквы W и w обозначают одну и ту же переменную. Примеры имен: Х, y, A24, VES_Netto, MAXIMUM.

Типы переменных. Всем переменным в программе предвари­тельно должны быть указаны типы. Вот важнейшие.

числовой целый Integer (диапазон -32768..32767)

числовой целый длинный Longint (диапазон -2147483648..2147483647)

числовой вещественный Real (диапазон 2,9Е-39..1,7Е+38)

символ Char (один символ)

строка символов String (до 255 символов)

логический Boolean (значения true – истина, false – ложь).

Задание типа производится оператором VAR.

Например: var a,d: integer; x: real; d: string;.

В разделе констант можно сразу задать и тип и значение перемен­ной const binteger=5; sstring=’поле’. Здесь переменной b придается тип Целый и значение 5.

 Выражения используются для отображения формул и запи­сываются в строку. Вычисления в них реализуются слева направо в общепринятой после­довательности: 1. вычисление функций, 2. умно­жение-деление, 3. сложение-вычитание. Порядок действий может быть изменен скобками. Следующие два примера иллюстрируют правила построения выражений (слева в рамке формулы в обычной записи, справа выражения на Паскале):

XC+2.5/(6*K)

F/(B*3)+C*B/(T–5)*8.4

 Функции реализуют стандартные действия. Функции всегда содержат скобки (кроме Pi). Ниже в таблице показаны только важнейшие. Кроме того, здесь имеются две функции для работы со случайными числами:

random(x) – вырабатывает псевдослучайное число, равномерно распре­деленное в диапазоне значений от 0 до х-1.

randomize – эта функция обеспечивает старт функции random(x) каждый раз с нового значения.

Примеры.

abs(–6)=6 int(1.2)=int(1.9)=1 frac(-2.5)=-0.5

odd(3)=true trunc(3.7)=3 round(3.7)=4

Преобразование вещественного типа в целый осуществляется функциями round и trunc. Преобразование в вещественный тип может быть осуществлено простым присваиванием вида вещественная переменная:=целочисленная переменная (например a:=d). Такое преобразование называется неявным.

Функ-

ция

Назначение

Тип

аргумента

Тип

результата

abs(x)

модуль х

целый/

веществ.

как у

аргумента

sqrt(x)

квадратный корень из х (х≥0)

– “ –

– “ –

sin(x)

синус угла х (x в радианах)

веществ.

веществ.

cos(x)

косинус угла x (x в радианах)

arctan(x)

арктангенс х (результат в радианах)

sqr(x)

квадрат х

exp(x)

eх

ln(x)

логарифм натуральный х (x>0)

int(x)

целая часть х

frac(x)

дробная часть х

odd(x)

выявление нечетности х

целый

логический

pi

число π=3.14159...

веществ.

trunc(x)

отбрасывает дробную часть х

веществ.

целый

round(x)

округляет вещественное х к целому


2. ОПЕРАТОРЫ ЯЗЫКА

Оператор – основная единица программы и имеет множество разно­видностей. Рассмотрим самые простые.

 Оператор присваивания. Общий вид оператора присваивания:

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

Такая запись означает, что выражение, стоящее справа, вычисля­ется и его результат присваивается переменной, стоящей слева. Примеры операторов: Z:=2, А:=3.5+EXP(8), S:=X*4+Y/2.

Присваивание не является равенством в обычном смысле. Здесь справа и слева от знака равно можно указывать одну и туже переменную. Например, допустимо: М:=М+2, X:=X/3. Эти выражения следует понимать так, что новое содержимое ячейки М будет равно старому, увеличенному на два, и новое Х будет равно старому, деленному на три. Например, если ранее было М=3 и Х=12, то после вычислений получим М=3+2=5 и Х=12/3=4.

 Тест 2.1. В следующих операторах присваивания имеются три ошибки. Укажите их, выбрав один из трех ответов: 1).z,k,m; 2).y,z,k; 3).x,y,z. Объясните почему.

var y,k,m: integer; x:real; z:string;

begin

y:=3; x:=5.2; z:=7; k:=y+x; m:=3.2;

end.

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

 Оператор вывода. Для анализа результатов вычислений необходимо вывести их на внешний носитель – бумагу или экран дисплея. Для этой цели используется оператор.

WRITE(список_выводимых_переменных)

WRITELN(список_выводимых_переменных)

Например, оператор: WRITELN(a,m) читается так – “Печатать пере­менные А, М”.

Различие двух форм оператора заключается в том, что вторая разновидно­сть оператора после вывода данных переводит курсор на новую строку (line). Оператор writeln может использоваться и без аргументов (и без скобок). Тогда при выводе будет формироваться только пустая строка. В оператор могут включаться не только пере­менные, но и константы и выражения. Например, если Х=12, а Y=100, то применение оператора WRITE('X=', x, ' Y=', y, ' СУММА=', x+y) даст следующий результат: X=12 Y=100 СУММА=112.

С помощью оператора можно указать не только что будет выведе­но, но и как, т.е. отформатировать вывод. После имени вещественной переменной можно (через двоеточие) задать два числа. Первое из них задаст общую длину вывода числа, второе – размер дробной части. После имени целочисленной переменной нужно задать только одно число. Напри­мер, оператор WRITE(k:6, z:8:2) при выводе отведет для целочисленной переменной K 6 позиций, а для вещественной пе­ре­менной Z – 8, из которых 2 под дробную часть. Лишние позиции, отведенные под целую часть, заместятся пробелами.

 Оператор ввода. Исходные данные, обрабатываемые прог­раммой, должны вводиться непосредственно пользователем с помощью оператора чтения данных:

READLN(список_вводимых_переменных)

Встречая такой оператор, компьютер останавливается и ждет вашего ввода. Число вводимых данных по количеству и типу должно соответствовать списку переменных. Если список переменных содержит более одной переменной, действия пользователя зависят от типов, вводимых данных. Числовые значения разделяются нажатием Enter или пробелом, а в конце Enter. Если вводятся данные типа char – символы набирать следует подряд. Данные типа string разделяются пробелом. Оператор может и не иметь аргументов вовсе (readln()). Тогда все, что вы можете сделать, это нажать Enter.

Пример: READLN(r,l). Дословно, оператор интерпретируется так: “Читать в память компьютера, введенные с клавиатуры, переменные R и L”. Пусть в нашей программе R=5 и L=8.4. Тогда пользователь должен ввести 5 и 8.4 через пробел или Enter.

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

 Оператор завершения используется для принудительного завершения программы/процедуры в любом ее месте.

EXIT

 Оператор ожидания нажатия клавиши может использовать­ся для создания паузы в программе, например, для того, чтобы разглядеть, что выведено на экране.

READKEY

 Оператор очистки освобождает экран и устанавливает курсор в левый верхний угол.

CLRSCR

Этот оператор и оператор readkey находятся в библиотеке CRT Паскаля и, чтобы ими воспользоваться, следует ее подключить оператором USES CRT.

 Комментарии. Для того чтобы не забыть, зачем введен тот или иной оператор, программы снабжаются текстовыми комментари­ями. Они могут занимать целые строки или быть записаны непос­ред­ственно справа от комментируемого оператора. Комментарии ограни­чиваются фигурными скобками и никак не влияют на вычисления.

 Операторные скобки используются, чтобы выделить некоторую группу операторов как единое целое.

BEGIN...END

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

Запись операторов. Оператор может занимать любое количество строк и для переноса на другую строку не нужно никаких символов переноса. Все операторы Паскаля завершаются знаком “точка с запятой”. Однако после оператора begin и перед оператором end точку с запятой можно не ставить.

 Структура программы на Паскале имеет две части: описательную (пункты 1,2,3) и вычислительную и состоит из следующих элементов:

1. Задается имя (program) программы (необязательно).

2. Присоединяются нужные библиотеки (uses) Паскаля (необязательно).

3. Описываются все присутствующие в программе метки (label), переменные (var), константы (const), типы (type) и т.п.

4. Оператором Begin открывается вычислительная часть.

5. Внутри блока помещаются операторы собственно программы.

6. Оператором End (с точкой) завершается вся программа.

Структуру программы определяют следующие операторы:

program Имя программы

uses Подсоединение библиотек

label Перечисление меток

var Описание переменных;

type Описание типов

const Описание констант;

begin

Собственно программа

end.

Теперь напишем простую программу вычисления площади круга S произ­вольного радиуса R по известной формуле S=πR2. Программу назовем KRUG. Переменные S и R обозначим как вещественные, пос­кольку они могут иметь дроб­ную часть. Ввод радиуса осуществляется оператором readln(r). Чтобы пользователь понимал, что именно он должен ввести, прежде оператором write(‘радиус=’) на экран вы­водится слово “радиус=”. В конце программы видим оператор readkey. Он нужен для удобства отладки. Встречая его, компьютер ожидает от пользователя нажатия любой клавиши. В это время он может без спешки осмотреть результаты счета. Если этого не сделать Паскаль сразу же вернет нас в окно редактирования и тогда окно выдачи придется вызывать клавишами Alt+F5, что неу­добно. Оста­льное оче­видно.

PROGRAM krug; {имя программы krug}

uses crt; {подключение библиотеки CRT}

var s,r: real; {переменные – вещественные}

begin {начало вычислительной части}

clrscr; {очистка экрана}

write('радиус='); {вывод слова-подсказки}

readln(r); {ввод радиуса}

s:=pi*r*r; {вычисление площади}

write('площадь=',s:6:2); {вывод площади}

readkey; {оператор задержки}

end. {конец программы}

Замечание. В следую­щих при­мерах для компакт­ности мы не будем больше вносить команду очистки экрана, опе­ратор задержки readkey, и, в большинстве случаев, опера­торы-подсказки ввода, однако студент должен это делать.

 Тест.2.2. Какой из операторов Writeln выведет переменную r в исходном виде: 1) writeln(r:6); 2). writeln(r:6:3); 3). writeln(r);

r:=12.853; writeln(r:6); writeln(r:6:3); writeln(r);

3. ОРГАНИЗАЦИЯ ВЕТВЛЕНИЙ

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

 Условный оператор позволяет выполнять некоторые действия в зависимости от заданных условий.

IF логическое условие THEN оператор1 ELSE оператор2

Здесь, еслиусловие истинно, выполняется оператор1, иначе оператор2. Например, оператор

IF a>b THEN WRITELN ('А больше В')

ELSE WRITELN ('А не больше В');

выводит словесное сообщение о фактическом соотношении перемен­ных А и В.

Оператор может использоваться и в усеченной форме без опции ELSE.

Другой пример. На практике иногда приходится выяснять кратность числа (например Х) некоторому другому числу (Y). Это можно сделать с помощью следующего выражения (оба числа должны быть целого типа)

if x mod y=0 then writeln ('x кратно y')

else writeln ('x не кратно y');

Всюду, где в синтаксисе команд встречается слово “оператор”, может быть записано любое число операторов, заключенных в опера­торные скобки BEGIN...END. Пример. Напишем оператор извлечения корня числа х с учетом его знака.

if x>0

then begin y:=sqrt(x); writeln('корень=', y) end

else writeln('число отрицательно')

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

В

if a>0 then writeln(a)

else if b>0 then writeln(b)

else if c>0 then writeln(c)

else writeln('все числа <0');

нутрь оператораif могут быть вложены дру­гие операторы if. Например, пусть в последова­тельности чисел a,b,c требуется вывести первое по порядку положитель­ное число. Если та­ковых не оказалось, печатать “Все числа отрицательны”. Программа справа.

 Оператор безусловного перехода. Оператор вида:

GOTO метка оператора

вынуждает программу выполнять не следующий по порядку оператор, а оператор с указанной меткой. Например, опе­ратор GOTO m читает­ся как “Идти к оператору с меткой mи передает ему управление. Метки должны быть предварительно объявлены оператором label в разделе объявлений программы (в нашем случае label m). Меткам можно давать произвольные символьные или числовые имена, важно чтобы все метки были разными, т.е. никогда не совпадали в пределах программы. В операторе, на который происходит ссылка, метка ставится перед ним и отделяется двоеточием.

Очень распространенной задачей является программирование процессов с несколькими исходами – ветвящихся процессов. Здесь удобно (по крайней мере, на первом этапе) сначала построить блок-схему, дающую наглядное графическое представление алгоритма. В блок-схеме отдельные операции или их группы помещаются в прямоу­гольные блоки. Операции анализа отображаются ромбами. Обоз­наче­ние других операций будет рассмотрено позже. Блок-схемы обрамляют блоки НАЧАЛО и КОНЕЦ. Мы будем изображать последние только в случае, если возможно разночтение.

Пример 3-1. Для произвольного аргумента Х вычислить значение кусочно-ломаной функции Y(X) (рис.3-1а).

5+X при Х<0

Y = 5 при 0≤Х<10

10–0,5X при X≥10

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

PROGRAM P3_1;