- •Министерство образования российской федерации
- •Var X,y: real;
- •Var X,y: real;
- •Var t:integer; p:char;
- •0..17: Write('детство');
- •20..30: Write('молодость');
- •31..54: Write('зрелость');
- •Var s:char;
- • Оператор цикла с предусловием имеет вид
- •Program p5_8;
- •Var y,X,z: integer;
- •Var I,j:integer; X,y,r:real;
- •Var I,j: integer;
- •Var n,I,j:integer; s,y,sr:real; X: array [1..10,1..5] of real;
- •Var I,j,n,m: integer;
- •X:array [1..10] of integer;
- •Var n,I,j,st,kl,k:integer;
- •Var st: char; sm: string[32]; ss: string;
- •Var n:integer;y:string;
- •Var k,I:integer; X: string;
- •Var X:string[1]; d:string; I:integer;
- •Var X:vr; y:array [1..5] of vr;
- •Ввод и вывод информации для типизированных и текстовых файлов производится процедурами:
- •X,y:real;
- •X,y:real; I:integer;
- •Im: string[4];
- •I: integer;
- •Im: string[4];
- •I: integer;
- •Im:string[4]
- •Im:string;
- •Var d,I,m,rx,ry:integer;
- •Var d,m,rx,ry:integer;
- •X,y,xn,xk,ymin,ymax,dx:real;
- •Ответы на тестовые задания, имеющиеся в тексте пособия:
- •& Тесты по курсу
- •Тираж: 150. Заказ №
Министерство образования российской федерации
МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ТЕХНОЛОГИЙ И УПРАВЛЕНИЯ
(образован в 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 b: integer=5; s: string=’поле’. Здесь переменной 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');
Оператор безусловного перехода. Оператор вида:
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;