Автор работы: Пользователь скрыл имя, 11 Марта 2012 в 23:58, лекция
Приведём простейший пример программы, единственная цель которой (
вывести на экран какое-нибудь приветствие:
program Hello;
begin
writeln('Hello, world!');
readln;
end.
.........
if a1>a2 then begin
buf:=a1;
a1:=a2;
a2:=buf;
end;
Следующий пример использует вложенные операторы if.
Пример 4: Поиск корней квадратного уравнения.
program SqEquation;
var a,b,c,d: real;
begin
writeln;
write('Введите коэффициенты a,b,c квадратного уравнения : ');
readln(a,b,c);
d:=sqr(b)-4*a*c;
if d>=0 then
if d=0 then writeln('Единственный корень: x=',-b/(2*a):8:3)
else writeln('Два корня : x1=',(-b+sqrt(d))/(2*a):8:3,
else {d<0} writeln('Корней нет');
readln;
end.
Чтобы не запутаться в структуре этой программы, следует помнить такое
правило: else всегда относится к последнему оператору if. Если же в
программе требуется, чтобы else относилось к одному из предыдущих if, то
придется воспользоваться составным оператором:
Пример 5: пользователь вводит натуральное число, задача программы —
поставить слово «ученик» в нужную форму в сочетании с числительным
(например: 1 ученик, 3 ученика, 9 учеников и т.п.)
begin
write('Число учеников (1..20) --> '); readln(n);
write(n,' ученик');
if n<5 then begin
if n>1 then writeln('а');
end
else
writeln('ов');
readln;
end.
В этом примере пришлось использовать составной оператор (begin ... end;)
для того чтобы часть else относилась не к оператору if n>1, а к if n<5.
2. Оператор выбора (case)
Кроме оператора условного выполнения и циклов в Турбо Паскале имеется
ещё одна управляющая конструкция, одно из названий которой — оператор
выбора. На самом деле это усложнённый оператор if, он позволяет программе
выполняться не двумя способами, в зависимости от выполнения условия, а
несколькими, в зависимости от значения некоторого выражения. В общем виде
этот оператор выглядит так:
case Выражение of
Вариант1: Оператор1;
Вариант2: Оператор2;
...
ВариантN: ОператорN;
[else ОператорN1;]
end;
(Пояснение: квадратные скобки означают то, что часть else может
отсутствовать).
Выражение в простейших случаях может быть целочисленным или символьным.
В качестве вариантов можно применять:
1. Константное выражение такого же типа, как и выражение после case.
Константное выражение отличается от обычного тем, что не содержит
переменных и вызовов функций, тем самым оно может быть вычислено на
этапе компиляции программы, а не во время выполнения.
2. Интервал, например: 1..5, 'a'..'z'.
3. Список значений или интервалов, например: 1,3,5..8,10,12.
Выполняется оператор case следующим образом: вычисляется выражение после
слова case и по порядку проверяется, подходит полученное значение под какой-
либо вариант, или нет. Если подходит, то выполняется соответствующий этому
варианту оператор, иначе — есть два варианта. Если в операторе case
записана часть else, то выполняется оператор после else, если же этой части
нет, то не происходит вообще ничего.
Рассмотрим пример. Пусть пользователь вводит целое число от 1 до 10,
программа должна приписать к нему слово «ученик» с необходимым окончанием
(нулевое, «а» или «ов»).
program SchoolChildren;
var n: integer;
begin
write('Число учеников --> '); readln(n);
write(n,' ученик');
case n of
2..4: write('а');
5..10: write('ов');
end;
readln;
end.
Можно также усовершенствовать программу для произвольного натурального
n:
write(n,' ученик');
case n mod 100 of
11..19: write('ов');
else case n mod 10 of
2..4: write('а');
0,5..9: write('ов');
end;
end;
Лекция 4. Операторы циклов в Паскале
В реальных задачах часто требуется выполнять одни и те же операторы
несколько раз. Возможны различные варианты: выполнять фрагмент программы
фиксированное число раз, выполнять, пока некоторое условие является
истинным, и т. п. В связи с наличием вариантов в Паскале существует 3 типа
циклов.
1. Цикл с постусловием (Repeat)
На Паскале записывается следующим образом: repeat <оператор> until
<условие>. (По-русски: повторять что-то пока_не_выполнилось условие). Под
обозначением <оператор> здесь понимается либо одиночный, либо
последовательность операторов, разделённых точкой с запятой. Цикл работает
следующим образом: выполняется оператор, затем проверяется условие, если
оно пока еще не выполнилось, то оператор выполняется вновь, затем
проверяется условие, и т. д. Когда условие, наконец, станет истинным
выполнение оператора, расположенного внутри цикла, прекратится, и далее
будет выполняться следующий за циклом оператор. Под условием, вообще
говоря, понимается выражение логического типа.
Пример (подсчет суммы натуральных чисел от 1 до 100):
var i,sum: integer;
begin
sum:=0; i:=0;
repeat
i:=i+1;
sum:=sum+i;
until i=100;
writeln('Сумма равна: ',sum);
readln;
end.
Важно заметить, что операторы стоящие внутри цикла repeat (иначе ( в
теле цикла) выполняются хотя бы один раз (только после этого проверяется
условие выхода).
2. Цикл с предусловием (While)
Этот цикл записывается так: while <условие> do <оператор>. (Пока условие
истинно, выполнять оператор). Суть в следующем: пока условие истинно,
выполняется оператор (в этом случае оператор может не выполниться ни разу,
т.к. условие проверяется до выполнения). Под оператором здесь понимается
либо простой, либо составной оператор (т.е. несколько операторов,
заключёных в begin ... end).
Рассмотрим тот же пример, выполненный с помощью while:
var i,sum: integer;
begin
sum:=0; i:=0;
while i<100 do begin
i:=i+1;
sum:=sum+i;
end;
writeln('Сумма равна: ',sum);
readln;
end.
3. Цикл со счетчиком (For)
Записывается так: for <переменная>:=<нач> to <кон> do <оператор>. Вместо
to возможно слово downto. Рассмотрим такой пример: требуется вывести на
экран таблицу квадратов натуральных чисел от 2 до 20.
var i: integer;
begin for i:=2 to 20 do writeln(i,' ',sqr(i)); end.
При выполнении цикла происходит следующее: переменной i присваивается
начальное значение (2), затем выполняется оператор (простой или составной),
после этого к i прибавляется 1, и проверяется, не стало ли значение i равно
конечному (20). Если нет, то вновь выполняется оператор, добавляется 1, и
т. д. В случае, когда вместо to используется downto, все происходит
наоборот: единица не прибавляется, а вычитается. Например, следующий цикл
выведет ту же таблицу, но в обратном порядке:
for i:=20 downto 2 do writeln(i,' ',sqr(i));
В завершение запишем программу о подсчете суммы чисел от 1 до 100 с
помощью for:
var i, sum: integer;
begin
sum:=0;
for i:=1 to 100 do sum:=sum+i;
writeln(sum);
end.
Лекция 5. Символьные и строковые переменные
В математике под переменной обычно понимают некую величину, значения
которой могут быть только числами. В языках программирования почти все
данные, с которыми работают программы, хранятся в виде переменных. В
частности, бывают переменные для хранения текстовых данных: предложений,
слов и отдельных символов.
1. Символьный тип
Тип данных, переменные которого хранят ровно один символ (букву, цифру,
знак препинания и т.п.) называется символьным, а в Паскале — char. Объявить
переменную такого типа можно так: var ch: char;. Для того чтобы положить в
эту переменную символ, нужно использовать оператор присваивания, а символ
записывать в апострофах, например: ch:='R';. Для символьных переменных
возможно также использование процедуры readln, например:
write(‘Выйти из игры? (Да/Нет)’); readln(ch);
if ch=’Д’ then ...{выходить}...
else ...{продолжать}...;
Символьные переменные в памяти компьютера хранятся в виде числовых
кодов, иначе говоря, у каждого символа есть порядковый номер. К примеру,
код пробела равен 32, код ‘A’ — 65, ‘B’ — 66, ‘C’ — 67, код символа ‘1’ —
48, ‘2’ — 49, ‘.’ — 46 и т. п. Некоторые символы (с кодами, меньшими 32)
являются управляющими, при выводе таких символов на экран происходит какое
либо действие, например, символ с кодом 10 переносит курсор на новую
строку, с кодом 7 — вызывает звуковой сигнал, с кодом 8 — сдвигает курсор
на одну позицию влево. Под хранение символа выделяется 1 байт (байт
состоит из 8 бит, а бит может принимать значения 0 или 1), поэтому всего
можно закодировать 28=256 различных символов. Кодировка символов, которая
используется Турбо-Паскале, называется ASCII (American Standard Code for
Information Interchange — американский стандартный код для обмена
информацией).
Для того чтобы получить в программе код символа нужно использовать
функцию chr, например:
var i: byte; {число, занимающее 1 байт, значения — от 0 до 255}
ch: char;
...
readln(i); writeln('символ с кодом ',i,' — это ',chr(i));
Если в качестве кода используется конкретное число, а не выражение и не
переменная, то можно использовать символ «#», скажем так: ch:=#7;. Для
того перехода от кода к символу используется функция ord (от слова ordinal
— порядковый). Имеющиеся знания позволяют нам написать программу, которая
выдаёт на экран таблицу с кодами символов:
program ASCII;
var ch: char;
begin
for ch:=#32 to #255 do write(ord(ch),'—>',ch,' ');
readln;
end.
В этой программе в качестве счётчика цикла была использована символьная
переменная, это разрешается, поскольку цикл for может использовать в
качестве счётчика переменные любого типа, значения которого хранятся в виде
целых чисел.
С использованием кодов работают ещё две функции, значения которых
символьные:
1. succ (от succeedent — последующий), она выдаёт символ со следующим
кодом.
2. pred (от predecessor — предшественник), выдаёт символ с предыдущим
кодом.
Если попытаться в программе получить succ(#255) или pred(#0), то возникнет
ошибка. Пользуясь этими функциями можно переписать предыдущую программу и
по-другому:
...
ch:=#32;
while ch<>#255 do begin
write(ord(ch),'—>',ch,' ');
ch:=succ(ch);
end;
...
Сравнение символов. Также как и числа, символы можно сравнивать на =,
<>, <, >, <=, >=. В этом случае Паскаль сравнивает не сами символы, а их
коды. Таблица ASCII составлена таким образом, что коды букв (латинских и
большинства русских) возрастают при движении в алфавитном порядке, а коды
цифр расположены по порядку: ord(‘0’)=48, ord(‘1’)=49, ... ord(‘9’)=57.
Сравнения символов можно использовать везде, где требуются логические
выражения: в операторе if, в циклах и т.п.
2. Строковый тип
Для хранения строк (то есть последовательностей из символов) в Турбо-
Паскале имеется тип string. Значениями строковых переменных могут быть
последовательности различной длины (от нуля и более, длине 0 соответствует
пустая строка). Объявить строковую переменную можно двумя способами: либо
var s: string; (максимальная длина строки — 255 символов), либо var s:
string[n]; (максимальная длина — n символов, n — константа или конкретное
число).
Для того чтобы положить значение в строковую переменную используются те
же приёмы, что и при работе с символами. В случае присваивания конкретной
строки, это строка должна записываться в апострофах (s:='Hello, world!').
Приведём простейший пример со строками: программа спрашивает имя у
пользователя, а затем приветствует его:
program Hello;
var s: string;
begin
write('Как Вас зовут: ');
readln(s);
write('Привет, ',s,'!');
readln;
end.
Хранение строк. В памяти компьютера строка хранится в виде
последовательности из символьных переменных, у них нет индивидуальных имён,
но есть номера, начинающиеся с 1). Перед первым символом строки имеется
ещё и нулевой, в котором хранится символ с кодом, равным длине строки. Нам
абсолютно безразлично, какие символы хранятся в байтах, находящихся за
пределами конца строки. Рассмотрим пример. Пусть строка s объявлена как
string[9], тогда после присваивания s:=’Привет’; она будет хранится в
следующем виде:
|Номер байта |0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |
|Содержимое |#6 |‘П’ |‘р’ |‘и’ |‘в’ |‘е’ |‘т’ |‘ю’ |‘s’ |‘%’ |
Для того чтобы в программе получить доступ к n-му символу строки
используется запись s[n]. Если поменять значение s[0] то это отразится на
длине строки. В следующем примере из строки 'Привет' мы сделаем 'Привет!':
s[0]:=#7; s[7]:='!';.
Сравнение строк. Строки сравниваются последовательно, по символам.
Сравниваются первые символы строк, если они равны — то вторые, и т. д. Если
на каком-то этапе появилось различие в символах, то меньшей будет та
строка, в которой меньший символ. Если строки не различались, а затем одна