- •2 Этапы развития эвм
- •3)Архитектура основные принципы работы эвм.
- •4) Операционные системы, их функции.
- •Вопрос 5
- •'Это текстовая строка'
- •'Это '' - символ одиночной кавычки'
- •Билет 6 Типы данных в Delphi
- •8 Вопрос Преобразование числовых данных в строковые и обратно. § 24. Строковый тип данных
- •24.1. Строковые величины
- •24.2. Операции со строковыми величинами
- •24.3. Стандартные подпрограммы
- •* 24.4. Преобразование строковых данных
- •* 24.5. Отображение числовой информации в графическом режиме
- •9 Вопрос
- •10 Билет- Язык блок-схем
- •Основные элементы схем алгоритма
- •Объектно-ориентированное программирование Основные понятия
- •Оператор цикла repeat
- •Оператор цикла while
- •Оператор цикла for
- •15 Вопрос
- •1. Основные понятия объектно-ориентированного программирования
- •2. Объект - как базовое понятие в объектно-ориентированном программировании
- •2.1 Инкапсуляция
- •2.2 Наследование как важнейшее свойство объекта
- •2.3 Экземпляры объектных типов
- •2.4 Поля объектов
- •2.5 Методы
- •2.6. Полиморфизм
- •3. Понятие класса
- •4. Процесс объектно-ориентированного проектирования
- •5. Объектно-ориентированные языки
- •6. Простая объектная модель и ссылочно-объектная модель
- •7. Языки и программное окружение
- •18 Вопрос
- •19 Вопрос
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) выполнения нескольких примеров с подсчетом количества правильных и неправильных ответов.