Файл: Могилев А.В. Информатика.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 31.03.2021

Просмотров: 6802

Скачиваний: 51

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

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. Строковый тип определяется в разделе описания типов, переменные этого типа - в разде-

ле описания переменных: 

 


background image

 

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: 


background image

 

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  


background image

 

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

 


background image

 

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