Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
билеты по информатике.docx
Скачиваний:
46
Добавлен:
18.04.2015
Размер:
341.85 Кб
Скачать

24.3. Стандартные подпрограммы

Познакомимся со стандартными подпрограммами, предназначенными для работы со строковыми величинами. Покажем их работу на примере строки T='Good bye':

Функция

Назначение

Пример

Length (X)

Определение длины строки Х (количества знаков)

D:=Length (T);  D=8

Copy (X, k, n)

Копирование фрагмента строки Х длиной n символов, начиная с символа с номером k

B:=Copy(X,7,2);  B='yе'

C:=Copy(X,4,1);  C='d'

D:=Copy(X,9,1);  D=''

E:=Copy(X,6,9);  E='bye'

Pos (X, Y)

Поиск первого вхождения подстроки Х в строку Y (результат – номер позиции в Y, с которой начинается Х, или нуль, если подстрока не обнаружена)

K:=Pos(S, T);

При S='o': K=2

При S='a': K=0

При S='odb': K=0

При S='od b': K=3

Процедура

Назначение

Пример

Delete(X,K,D);

Удаление из строки Х фрагмента длиной D символов, начиная с позиции K

Delete (T, 6, 3);

Insert('luck',T,6);

вначале из T удаляется «bye», а затем вставляется с той же позиции «luck» T='good luck'

Insert (X,Y,K);

Вставка подстроки Х в строку Y, начиная с позиции с номером К

Использование операций соединения и копирования фрагментов строк позволяет получать из заданных строк новые. Например, пусть А='программирование', В='идентификатор', C='реформа', тогда строка 'информатика и программирование' может быть получена как результат выполнения операций: B[1]+B[4]+Copy(C,3,5)+B[5]+Copy(B,8,3)+ ' '+B[1]+ ' '+A.

Примеры программ:

Пример 1. Сколько букв в твоем имени? (уточнение примера 1 о простом диалоге: программа Privet_1).

Программа предлагает ввести имя пользователя T и выводит количество букв K в имени, его первую T[1] и последнюю T[K] буквы.

Program Privet_3;

Var T: String; K: Byte;

Begin

Write ('Как тебя зовут? ');

Readln (T); Writeln ('Здравствуй, ', T, '!');

K:=Length (T);

Writeln ('Число букв в имени=',K);

Writeln ('1-я буква имени=',T[1]);

Writeln ('последняя буква=',T[K]);

End.

Пример 2. Узнай фамилию и имя: программа предлагает ввести строку T, содержащую фамилию и имя, и выводит их (FAM и IM) в отдельные строки экрана.

Для этого в программе организуем поиск позиции P пробела, которым разделяются искомые данные, и скопируем фрагменты строки левее и правее пробела.

Program Privet_4;

Var T, FAM, IM : String;

P, D : Byte;

Begin

Writeln ('Введите фамилию и имя (через пробел)');

Readln (T); D:=Length (T);

P:=Pos(' ', T); {поиск пробела}

FAM:=Copy(T, 1, P-1);

Writeln ('Ваша фамилия=', FAM);

IM:=Copy(T, P+1, D-P);

Writeln ('Ваше имя=', IM)

End.

Пример 3. Тарас отправляет телеграмму. Нужно определить количество букв «а» и количество слов в телеграмме. Известно, что слова разделяются только одним разделителем: пробелом или точкой, предложение заканчивается единственной точкой.

Введем переменные A и S для хранения соответственно количества букв «а» и количества слов при посимвольном просмотре текста T в направлении слева направо.

Программа TELE

Описание

T, B: Строковый

A, S, i : Целый

Конец_Описания

Ввод (T, 'предложение=')

A:=0 S:=0

Повторять_Для i

От 1

До длина (Т)

Подстрока (i, i, T, B)

Если (B='a') Или (B='A')

То A:=A+1

Конец_Если

Если (B=' ') Или (B='. ')

То S:=S+1

Конец_Если

Вывод ('Количество букв “a”=',A)

Вывод ('Количество слов =',S)

Конец_Программы

Program TELE;

Var T : String;

A, S, i : Byte;

Begin

Writeln ('Введите текст телеграммы');

Readln (T);

A:=0;

S:=0;

For i:= 1 To Length (T) do

Begin {i – номер очередного символа}

If (T[i]= 'a') or (T[i]= 'A') Then

A:=A+1;

If (T[i]= ' ') or (T[i]= '.') Then

S:=S+1

End;

Writeln ('Количество букв “а”=', A);

Writeln ('Количество слов=', S)

End.

* Выделенный красным цветом фрагмент программы можно записать с помощью оператора выбора: Case T[i] of

'a', 'A': A:=A+1;

' ', '.' : S:=S+1

End;

Пример 4. «Есть буква в слове?»: программа должна предложить ввести некоторую букву и «открыть» ее в соответствующих позициях слова или выдать сообщение «нет такой буквы».

Пусть задуманное слово S задается в разделе констант. В этом случае обращение к определенному символу строки осуществляется через стандартную функцию Copy. Будем просматривать строку от 1-го символа к последнему: если очередной знак совпадает с интересующей нас буквой B, выведем ее на экран, в противном случае выведем символ “-”.

Program PRIM_4;

Const S='накiраванасць';

Var B: String; i, K : Byte;

Begin

Writeln ('Есть ли в слове буква?');

Write ('Введите букву ');

Readln (B);

K:=0; {К-количество букв B в слове}

For i:= 1 to Length (S) do

If Copy (S, i, 1)=B Then

Begin {есть буква}

K:=K+1; Write (B)

End

Else Write ('-');

Writeln;

If K=0 Then Writeln ('нет такой буквы')

End.

Пример 5. Программа проверки, является ли заданная строка палиндромом («перевертышем»), то есть, читается ли она одинаково справа налево и слева направо: программа должна предложить ввести строку и вывести ответ: «да» или «нет».

Метод 1. «Перевернем» заданную строку S, читая ее справа налево; сравним на равенство полученную строку Т с заданной S.

Для формирования Т нужно просматривать каждый символ строки. Поэтому оправданным является использование цикла FOR (с параметром).

Program PALI_1;

Var S, T : String;

k : Byte;

Begin

Writeln ('Введите строку');

Readln (S); T:= ''; {текст Т пока пустой}

For k:=Length (S) Downto 1 do

T:=T+S[k];

If S=T Then Writeln ('да')

Else Writeln ('нет')

End.

Метод 2. Будем сравнивать в строке S 1-й символ с последним, 2-й – с предпоследним и т.д. до тех пор, пока не встретятся два несовпадающих символа или пока не достигнем середины строки. В 1-м случае получаем ответ «нет», во 2-м – «да».

В данном случае количество повторений цикла заранее не известно, поэтому уместно использование цикла While.

Program PALI_2;

Var S : String;

k, d: Byte; P: Boolean;

Begin

Writeln ('Введите строку');

Readln (S); d:=Length (S);

P:=True; k:=1; {k-номер позиции в S}

While (P=True) and (k<=d div 2) Do

If S[k]=S[d-k+1] Then k:=k+1

Else P:=False;

If P=True Then Writeln ('да')

Else Writeln ('нет')

End.

* Метод 3. Реализуем идею метода 2 с помощью рекурсивной функции: сравним 1-й и последний символы; если они равны, применим эту же процедуру к строке без граничных (1-го и последнего) символов и т. д.

Условием завершения работы рекурсивной функции PAL является получение пустой строки или строки, состоящей из одного символа.

Program PALI_3;

Var S : String;

Function PAL (S: String) : Boolean;

Begin

If Length(S)<=1 Then PAL:=True

Else PAL:= (S[1]=S[Length(S)]) and

PAL (Copy(S, 2, Length(S)-2));

End;

Begin

Write ('Введите строку: '); Readln(S);

If Pal (S) Then Writeln ('Палиндром')

Else Writeln ('Не палиндром')

End.

Пример 6. В заданном тексте заменить все сочетания «ой» на «ая».

Метод 1. Будем производить требуемую замену непосредственно в заданной строке S: после обнаружения фрагмента «ой» удалим его и вставим «ая».

Так как требуется просмотр всей строки, в программе можно использовать цикл с параметром: вначале будем копировать 1-2 символы, затем 2-3, 3-4 и т.д., и, наконец, предпоследний и последний символы строки S. Переменную k будем использовать для задания номера левого символа из копируемого фрагмента.

Program SAM_1;

Var S: String; k: Byte;

Begin

Writeln ('Введите строку');

Readln (S);

For k:=1 To Length (S)-1 do

Begin

If Copy (S, k, 2)= 'ой' Then

Begin

Delete (S, k, 2); Insert ('ая', S, k)

End

End;

Writeln ('текст после замены: ', S)

End.

Метод 2. В отличие от метода 1 для нахождения очередной подстроки «ой» в строке S будем использовать стандартную функцию POS. Продвижение по строке в данном случае не требуется: функция будет использоваться столько раз, сколько в S имеется подстрок «ой». Так как количество «ой» заранее не известно, уместно использование цикла While (возможно, что в S не окажется ни одной подстроки «ой»).

Program SAM_2;

Var S: String; k: Byte;

Begin

Writeln ('Введите строку');

Readln (S);

k:= Pos ('ой', S);

While k<>0 do

Begin

Delete (S, k, 2); Insert ('ая', S, k);

k:= Pos ('ой', S);

End;

Writeln ('текст после замены: ', S)

End.

* Сравните приведенные решения и определите, какие из них, по Вашему мнению, являются более эффективными. Предложите собственные методы решения задач. Так, например, обратите внимание, что после обнаружения очередной подстроки «ой» и выполнения требуемой замены в методе 1 примера 6 можно «перешагнуть» через два символа для дальнейшего продвижения к концу строки.

* Пример 7. Моделирование работы текстового редактора (режим «Заменить»).

Пусть требуется выполнить редактирование текста T: все сочетания “end” следует заменить на “up”, “fa” – на “cito”.

В процедуре SAM реализуем алгоритм замены подстроки A на подстроку B в строке T, которую опишем в основной программе как глобальную переменную: найденный фрагмент A удалим и на его место вставим подстроку B. A и B – формальные параметры-значения (аргументы).

Исходный текст будем вводить в основной программе (контроль ввода: T – непустой текст). Отредактированный текст будет получен после двух обращений к процедуре SAM.

Program Samena;

Var T, A, B : String;

Procedure SAM (A, B: String);

Var K: Integer;

Begin

K:=Pos(A,T);

While K<>0 do

Begin

Delete (T, K, Length (A));

Insert (B, T, K);

K:=Pos (A, T)

End

End;

Begin

T:= '';

While T='' do

Begin

Write ('Строка для редактирования');

Readln (T)

End;

SAM ('end', 'up');

SAM ('fa', 'cito');

Writeln ('Новый текст: ', T);

End.

* Пример 8. Вывод текста с эффектом «падающие буквы».

После ввода строки T выведем ее в первую строку экрана. Будем постепенно «опускать» первый символ строки T с первой строки экрана в последнюю, стирая его при этом в предыдущей строке. Аналогично поступим со 2-м, 3-м и т.д. символами строки T.

Пусть В – очередной символ строки Т, S – номер строки экрана, в которой отображается B, n – номер символа строки T.

Program Padenie;

Uses Crt;

Var T : String; B: Char; n, S : Byte;

Begin

Writeln ('Введите строку');

Readln (T); ClrScr;

GotoXY(1,1); Write (T);

For n:=1 To Length (T) do

Begin

B:=T[n];

For S:=2 to 50 do {на экране 50 строк}

Begin

GotoXY (n, S-1); Write (' ');

GotoXY (n, S); Write (B);

Delay (1000)

End

End;

End.

Пример 9. Проверка усвоения навыков выполнения арифметических операций: сложения, вычитания или умножения.

Программа должна сформировать случайным образом и вывести на экран компьютера арифметический пример в виде “A@B=”, где @ – символ арифметической операции (+,-,*), A, B – числа, предложить пользователю ввести предполагаемый ответ X решения примера. Далее введенный ответ должен быть проанализирован программой и выдано сообщение «Правильно» или «Неправильно».

Значения операндов A и B сформируем в предположении, что проверяются навыки работы пользователя с числами в пределах 100 (от 1 до 99). Символ операции d будем кодировать по правилу:

Program TEST;

Uses CRT;

Var A, B, d, C, X : Integer;

O : Char;

Begin

ClrScr; Randomize;

A:=Random (99)+1;

B:=Random (99)+1;

d:=Random (3)+1;

Case d of

1: Begin O:= '+'; C:=A+B End;

2: Begin O:= '-'; C:=A-B End;

3: Begin O:= '*'; C:=A*B End

End;

GotoXY (35, 12);

Write ('Введите правильный ответ');

GotoXY (40, 15);

Write (A,O,B, '=');

Readln (X);

If X=C Then Writeln ('Правильно')

Else Writeln ('Неправильно');

End.

1.Как можно объявить величину строкового типа?

2.Какова максимально возможная длина строки?

3.Какие символы используются в операциях сравнения строк?

4.Какой символ операции конкатенации?

5.ПустьC– переменная символьного типа,T–переменная строкового типа. Какие команды допустимы: 1)C:= '5'; 2)C:=T+'1'; 3)T:=C+T; 4)T:=C-'1'; 5)C:= ''; 6)T:= '';

6.Какие операции можно выполнять над строковыми величинами?

7.Какие процедуры и функции определены для величин строкового типа?

8.Как осуществляется доступ к отдельному символу строки?

9.Чему равно значение отношения 'Мама'='мама'?

Заданы значения Т='формула успеха',S='целеустремленность плюс трудолюбие'. Составьте из них строки:

а) 'терпение и труд' б) 'формула успеха' в) 'форум'

г) 'плюс' д) 'цель - успех' е) 'устремление'

Напишите программы решения задач:

1. Программа должна предложить ввести строку, содержащую фамилию, имя и отчество пользователя (через пробел) и вывести фамилию и инициалы.

2. Смоделируйте на Паскале работу функции «Найти» текстового редактора:

1) Ваша программа должна предложить ввести строку и подстроку, и вывести номер символа для первого вхождения подстроки в строку (например, для строки 'максимальный' и подстроки 'ма' ответ: 1);

2) в отличие от задания 1) программа должна вывести все вхождения подстроки в строку;

* в) после вывода номера символа первого вхождения подстроки в строку программа должна сделать запрос на продолжение вывода.

3. Смоделируйте на Паскале работу функции «Заменить» текстового редактора:

1) из заданной строки, где слова разделяются произвольным числом пробелов, Ваша программа должна получать строку с единственным пробелом между словами;

2) Ваша программа должна заменять символ Ана символВ(значенияАиВдолжны вводиться с клавиатуры);

* 3) Ваша программа должна заменять в строке заданную подстроку на другую заданную подстроку (например, 'abba' на 'hi', 'or' на 'and'), запрашивая разрешение для замены у пользователя.

* 4. Составьте программу контроля знаний по арифметике: программа должна случайным образом сформировать два числа и одну из арифметических операций, вывести пример на экран, предложить ввести ответ; после того как ответ будет введен, проверить его правильность и организовать работу счетчика правильных ответов. Всего должно быть предложено 10 примеров. По окончании работы следует вывести количество правильных и количество неправильных ответов.

5. Зашифровать текст сообщения, заменяя каждый символ следующим за ним, а последний – первым (например, если заданный текст равен 'SECRET', то результат работы программы должен быть равен 'ECRETS').

* 6. Напишите программу, которая по желанию пользователя, шифрует или расшифровывает заданное сообщение по правилу упражнения 5 (из 'ECRETS' получает 'SECRET').

7. Напишите программу шифрования текста сообщения:

1) вставляя после каждой гласной буквы слог «ва» (например, для текста “прикол” получите ответ “приваковал”);

2) с использованием так называемой «тарабарской грамоты», где гласные буквы остаются без изменения, а согласные заменяются друг на друга по следующей схеме:

Б

В

Г

Д

Ж

З

К

Л

М

Н

Щ

Ш

Ч

Ц

Х

Ф

Т

С

Р

П

Например, текст «РЕЗИДЕНТ БУДЕТ В СРЕДУ» после шифрования примет вид:

«МЕФИЦЕПК ЩУЦЕК Ш ЛМЕЦУ»

* 8. Придумайте собственный способ шифровки и составьте программу для его реализации.

9. Напишите программу, которая предлагает ввести текст и некоторую букву и определяет, сколько слов в тексте начинается на данную букву.

* 10. Определите, сколько слов в тексте начинается и заканчивается на одну и ту же букву.

11. Расшифровать текст, если выяснилось, что при его шифровании применяли следующую замену: буквы «а», «о», «к», «е», «р» заменяли соответственно на «я», «и». «п», «у», «з».

* 12. Напишите программу «Бегущая строка»: программа предлагает ввести некоторый текст, который затем непрерывно отображается на экране в виде «бегущей строки» (как на экране телевизора) до нажатия на клавишу.

13. Напишите программу, которая подсчитывает количество слогов во введенном слове (будем считать, что количество слогов равно количеству гласных букв).

* 14. Протестируйте программу примера 9 внесите изменения, например, для:

1) выполнения операций над двузначными числами;

2) повторения ввода предполагаемого ответа до получения правильного результата с выводом количества попыток;

3) выполнения нескольких примеров с подтверждением правильности вводимого ответа;

4) выполнения нескольких примеров с подсчетом количества правильных и неправильных ответов.