ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 31.03.2021
Просмотров: 6802
Скачиваний: 51
226
Программа 9
program fibon;
"''
const n=20;
var a: array[l..n] of integer;
k:
integer;
begin
a[l]:=l;a[2]:=l;
for k:=3 to n do a[kl:=a[k-l]+a[k-2];
for k:=l to n do write(a[k]:5);
writeln
end.
Рассмотрим часто встречающуюся задачу упорядочения членов числовой последовательно-
сти по какому-либо признаку.
Пример:
упорядочить члены числовой последовательности по возрастанию.
Используем метод упорядочения, носящий имя «пузырек». Будем просматривать пары со-
седних элементов последовательно справа налево и переставлять элементы в
паре, если они стоят неправильно:
5,3,2,4,1 → 5,3,2,1,4 → 5,3,1,2,4 →
5,1, 3,2,4 → 1,5,3,2,4
В начале просмотра присвоим некоторой логической переменной значение true:
p:=true; если при просмотре пар была хотя бы одна перестановка, изменим значение логи-
ческой переменной на противоположное: p:=false; это означает, что последовательность еще не
была упорядочена и просмотр пар надо повторить. Цикл просмотров заканчивается, если после
очередного просмотра выполняется условие: p=true. Последовательность зададим в программе как
константмассив
из
10 элементов - целых чисел.
Программа 10
program bubble; '
const a:array[l..10] of integer=(19,8,17,6,15,4,13,2,11,0);
var b,i:integer; p :boolean;
begin c1rscr;
for i:=l to 10 do write(a[i]:3);writeln;writeln;
repeat p:=true;
for i:=10 downto 2 do
if a[i]<a[i-l]
then begin
b:=a[il;a[i]:=a[i-l]; ali-1]:=b;p:=false
end
until p=true;
for i:=l to 10 do write(a[i]:3);
writeln
end.
Обработка элементов двумерных массивов (матриц) обычно выполняется с помощью двой-
ного цикла. Один цикл управляет номером строки, другой - номером столбца.
При решении задач на ЭВМ часто возникает необходимость в использовании последова-
тельностей символов. Такую последовательность можно описать как массив символов, однако в
Паскале для таких целей имеется специальный тип - string[n] -
строка
из n символов, где n <= 255.
Способы описания переменных - строк - аналогичны описанию массивов.
1. Строковый тип определяется в разделе описания типов, переменные этого типа - в разде-
ле описания переменных:
227
type word : string[20];
var a,b,c : word;
2. Можно совместить описание строкового типа и соответствующих переменных в разделе
описания переменных:
var a,b,c : string[20];
d : string[30];
3. Можно определить строковую переменную и ее начальное значение как
констант-строку:
const l:string[l 1]='информатика';
Символы, составляющие строку, занумерованы слева направо; к ним можно обращаться с
помощью индексов, как к элементам одномерного массива.
Для переменных одного строкового типа определен лексикографический порядок, являю-
щийся следствием упорядоченности символьного типа:
'fife' < 'tree' (так
как 'f'
<
't'); '4' > '237' (так как '4' > '2'
).
Кроме логических операций
<,
>, =, для величин строкового типа определена некоммута-
тивная операция соединения, обозначаемая знаком плюс:
а:='кол'+'о'+'кол'; (в результате а='колокол').
Для строковых величин определены следующие четыре стандартные функции.
1. Функция соединения - concat(sl,s2,...,sk). Значение функции - результат соединения строк
sl ,s2,...sk, если он содержит не более 255 символов.
2. Функция выделения - copy(s,i,k). Из строки s выделяется k символов, начиная с i-того
символа:
а:=сору('крокодил',4,3); (в результате а='код*).
3. Функция определения длины строки - length(s). Вычисляется количество символов, со-
ставляющих текущее значение строки s:
b:=length('каникулы'); (b=8).
4. Функция определения позиции - pos(s,t). Вычисляется номер позиции, начиная с которо-
го строка s входит первый раз в строку t; результат равен 0, если строка s не входит в t:
с:=роs('ом','компьютер'); (с=2).
В Паскале определены также четыре стандартные процедуры для обработки строковых ве-
личин:
1. Процедура удаления delete(s,i,k).
Из строки s удаляется k символов, начиная с i-того сим-
вола.
s:='таракан'; delete(s,5,2); (в результате S='таран').
2. Процедура вставки - insert(s,t,i). Строка s вставляется в строку t, начиная с позиции i:
t:='таран'; insert ('ka',t,5); (t='таракан').
3. Процедура преобразования числа в строку символов - str(k,s). Строка s получается «на-
вешиванием» апострофов на число k:
228
str(564,s); (s='564').
4. Процедура преобразования строки из цифр в число - val(s,k,i). Число i=0, если в строке s
нет символов, отличных от цифр, в противном случае i=позиции первого символа, отличного от
цифры:
val('780',k,i); (k=780; i=0).
Рассмотрим несколько программ, в которых используются строковые величины.
1. Составить программу, определяющую количество гласных в русском тексте, содержа-
щем не более 100 символов.
Здесь удобно определить констант-строку, состоящую
из всех 18 строчных и заглавных
русских букв, и в цикле проверить, будет ли очередной символ заданного текста элементом кон-
стант-строки.
Программа 11
program vowel;
const
с:зtring[18]='аеиоуыэюяАЕИОУЫЭЮЯ' ;
var a :string[100]; k,n:integer;
begin
writeln('введите текст'); readln(a);n:=0;
for k:=l to length(a) do
if pos(a[k],c)>0 then n:=n+l;
writeln('кол. гласных=',n) end.
2. Заменить в арифметическом выражении функцию sqr на ехр. Замена выражения sqr на
ехр достигается последовательным применением процедур delete и insert:
Программа 12
program stroka;
var a,b:string[40]; k:integer;
begin
writeln('введите строку <= 40 символов');
readin(a);b:=a;
repeat k:=pos('sqr',b);
if k>0 then
begin
delete(b,k,3);insert('ехр',b,k) ;
end
until k=0;
writein('старая строка=',a); writein('новая строка"',b);
end.
3. Ввести и упорядочить по алфавиту 10 латинских слов. В программе определим массив
из
10 элементов-строк и упорядочим его элементы методом пузырька.
Программа 13
program order;
const s=10;
type word=string(20] ;
var
i, j, k
: 1. . s;
b:word; p:boolean; list :array[l..s] of word;
begin
clrscr;writeln<'введите список слов');
for i:=l to s do readln(list[i]);
repeat p:=true;
for i:=s downto 2 do
if list[i]<list[i-l] then
229
begin
b:list[i);list[i]:=list[i-l]; list[i-l]:=b;p:=false end
until p=true;
writein('упорядоченный
список слов:');
for i:=l to s do writeln(list[i])
end.
Множество
в Паскале имеет такой же смысл, как и в алгебре - это неупорядоченная сово-
купность отличных друг от друга однотипных элементов. Число элементов множества не должно
превышать 255. В качестве типа элементов может быть любой скалярный тип, кроме типа integer и
его интервалов, содержащих числа > 255. Тип элементов множества называется базовым. При
описании множественного типа используются служебные слова set и of. Задание конкретного
множества определяется правилом (конструктором) - списком элементов или интервалов, заклю-
ченным в квадратные скобки. Пустое множество обозначается двумя символами [].
Множественный тип можно определить в разделе описания типов по схеме:
type <имя> = set of <тип элементов>
Например:
type t=set of byte;
var a:t;
Можно совместить описание множественного типа и соответствующих переменных:
var code: set of0..7;
digits: set of'0'..'9';
Можно описать переменную множественного типа и задать ее первоначальное значение в
разделе описания констант, как константмножество. Тип множества можно описать ранее, напри-
мер,
type up=setof'A'..'Z';
low=set of'a'.. "z";
const upcase : up=['A'. . 'Z'];
vocals :low=['a', 'e', 'i', 'o', "u", 'y'];
delimiterset of char=[ '..' /',':'..' ? '];
Для данных множественного типа определены операции объединения, пересечения и до-
полнения множеств, обозначаемые в Паскале соответственно знаками +, * и -, а также отношения
равенства множеств (А=В), неравенства (А<>В), включения (А<=В,А>=В).
Логическая операция принадлежности
х in А принимает значение true, если элемент х при-
надлежит множеству А и false в противном случае. Так как к элементам множества прямого дос-
тупа нет, то операция in часто используется для этой цели.
Заметим, что операции отношения на множествах выполняются быстрее, чем соответст-
вующие операции на числах, поэтому их выгодно применять в программах.
Пример:
составить программу, анализирующую латинский текст и печатающую в алфавит-
ном порядке все найденные в нем буквы, а затем все ненайденные.
Пусть alfa - множество всех букв латинского алфавита. Будем вводить заданный текст с
клавиатуры символ за символом, одновременно формируя множество Е -множество латинских
букв текста. В конце текста введем символ *. Затем с помощью операции in будем проверять, ка-
кие буквы алфавита имеются во множестве Е. Множество N - ненайденных букв в тексте - опреде-
ляется оператором: N := alfa - Е .
Программа 14
230
program search;
const alfa:set of char=['a'
. .
'z'];
var c:char;E,N:set of char;
begin
cirscr; E:=[]; writeln('введите текст, конец ввода -*'); read(c);
while c<> '*' do
begin
if с in alfa then E:=E+[c]; read(c)
end;
writeln;
if E=alfa then writeln('найдены все латинские буквы')
else begin
N:=alfa-E;
writeln('найдены:');
for c:='a' to 'z' do if с in E then write(c);
writeln; writeln('не найдены:');
for c:='a' to 'z' do if с in N then write(c);
writeln
end
end.
Переменные множественного типа удобно применять в задачах, где порядок данных не
имеет значения, например при моделировании случайных событий.
Пример:
составить программу «спортлото 5 из 36», которая позволяет человеку ввести с
клавиатуры пять натуральных чисел из интервала 1..36, затем генерирует случайным образом пять
различных чисел из того же интервала и объявляет величину выигрыша по правилу: если угаданы
человеком 0, 1 или 2 числа, объявляется проигрыш; если угаданы 3 числа, объявляется выигрыш 3
рубля; если угаданы 4 числа, объявляется выигрыш 100 рублей; если угаданы 5 чисел, объявляется
выигрыш 1000 рублей.
В программе используются обозначения: mn — множество натуральных чисел из интервала
1 . . 36, а - множество чисел, задуманных человеком, х - множество чисел, . генерируемых компь-
ютером, z=a*x - пересечение множеств а и х; i, k, s - переменные, значения которых принадлежат
интервалу 1..36. Случайное число из этого интервала генерируется оператором: s:=random(35)+l.
Программа сначала выводит на экран сообщение о выигрышных номерах, затем определяет вели-
чину выигрыша.
Программа 15
program lottery;
type mn = set of 1 . . 36;
var x
,a,
z: nm; i, k, s: 0 . . 36;
begin
writeln; a:=[];
for i:=l to 5 do
begin write('введите ',i,' -тое число '); readin(k);a:=a+[k]
end;
randomize;
k:=0; x:=[];
while
k<5 do
begin
s:random (35) +1;
if not(s in x) then begin k:=k+l; x:=x+[s]
end
end; writeln;
writeln('выигрыш выпал на следующие номера : ');
for i:=l to 36 do if (i in x) then write(i,' ');
writeln; z:=a*x; k:=0;
for i:=l to 36 do if (i in z) then begin
writeln('угадано: ',i); k:=k+l