Урок 69 Інформатика (АП)
Розв’язування задач на опрацювання рядкових величин.
Мета.
Навчальна. вчитися виконувати операції над рядковими величинами, записувати мовою програмування класичні алгоритми для роботи рядками (пошук та заміна підрядка).
Розвиваюча. Розвивати логічне мислення, навички створення програм, самостійність, вміння застосовувати набуті знання до практичних завдань.
Виховна. Виховувати наполегливість, естетичність у оформленні, зібраність, уважність, грамотно висловлювати свої думки, вміння раціонально використовувати час.
Тип уроку. Засвоєння нових вмінь і навичок.
Матеріали для роботи з учнями:
План
Пам’ятка для учня!
Хід уроку
1. Організаційний момент.
2. Перевірка домашнього завдання.
3. Актуалізація опорних знань.
а) chr(90); б) ord('z') - ord('y'); в) ord(chr(13));
г) upcase('a'); д) upcase('A')
а) A:=Length (В);
б) B:=Delete (А, X, І);
в) Insert (А, X, І).
а) С:=А+С+В; С-?
б) Х:= Length (С); Х-?
в) В:= Copy (С, 4, 1) + Copy (С, 9,3); В-?
г) Delete (С, З, 3); С-?
д) Insert ('Не', С, 6); С-?
е) Х:= Pos ('e'f С); Х-?
є) For і:=1 То Length (С) Do If С[і]='е' Then Х:= Х+1; Х-?
4. Розв’язування задач на опрацювання рядкових величин.
Стандартні прийоми обробки рядків засновані на аналогії між рядком та одновимірним масивом символьних величин. Розглянемо методи обробки рядків на прикладі задач шифрування і дешифрування текстів.
Задачі шифрування
З давніх часів люди відчували потребу якось зашифровувати послання. Юлій Цезар був першим, про кого відомо, що він придумав власне шифр. Алфавіт розміщується на колі за годинниковою стрілкою (при цьому в українському алфавіті після А йде Б, а після Я - А). Для зашифровки букви тексту замінюються буквами, що стоять далі по колу на задане число позицій за годинниковою стрілкою. Якщо, скажемо, вибране зміщення на 3, то замість і-тої букви використовується (і+3)-я буква. При розшифровці, навпаки, беруть букву, розміщену на задане число букв проти годинникової стрілки.
Шифр Цезаря розшифрувати легко. Відомі імовірності появи букв pі i=1..n, у мові повідомлення (n - число букв в алфавіті). Порахуємо частоти появи кожної з букв fi в зашифрованому повідомленні. Якщо воно не дуже коротке, то fi повинні порівняно добре узгоджуватися з pі:fi=pі. Потім починаємо робити перебір по зміщеннях. Коли зміщення не вгадане, загальне розходження між pі i fi, яке дорівнює
буде великим, а коли зміщення вгадане - малим. Мінімізація (s) по всіх s=1,2,...,n дає ключ до розшифровки коду Цезаря.
Пізніше були вигадані інші, набагато важчі для зламу шифри. Термінологія тут така: законний адресат розшифровує повідомлення, а «ворог», не маючи ключа, зламує шифр. Створення шифрів і законне ними користування - це об'єкт криптографії, злам шифрів - це криптоаналіз, криптологія ж поєднує криптографію і криптоаналіз. Криптоаналіз заснований на використанні теорії чисел і теорії порівнянь і практично неможливий без використання комп'ютера.
Але й робота шифрувальників - чисто автоматична. Виходить, її можна доручити комп'ютеру. До того ж, як відомо, професіонали прагнуть зменшити кількість людей, що знають ключ до шифру.
Розглянемо найпростіші способи шифрування текстів.
Приклади алгоритмів шифрування
Приклад11. Шифр Цезаря. Метод шифрування полягає у виборі цілого числа n від 1 до 32. Потім у повідомленні кожна буква замінюється на букву, що стоїть від неї на n букв праворуч. Для того, щоб імітувати зсув букв по колу на п букв, буква з номером к замінюється на букву з номером m, що обчислюється за формулами:
Алгоритм шифрування:
Завдання. Зашифрувати фразу зі зсувом N=3:
"о, відкриттів чудових скільки”
Програма шифрування:
Const А = 'абвгдеєжзиіїйклмнопрстуфхцчшщьюя, 1;
Var 5,S1: String; N, к, і : Integer;
Begin
WriteLn ('введіть значення зсуву=> '); ReadLn (N);
WriteLn ('введіть повідомлення для шифрування=> ');
ReadLn (S);
S1:=";
For і:=1 То Length(s) Do Begin
K:= Pos (S[i],A);
if N+K<=33 Then Sl:= Sl+A[K+N]
Else Sl:=Sl+A[K+N-33]
End;
WriteLn (S1);
ReadLn
End.
Результат: свгекжнуйххкегьцжсейшгфнко,нй
Для дешифрування до програми вносимо зміни:
WriteLn ('введіть повідомлення для дешифрування^');
ReadLn(S);
S1: = ";
{А - рядок, що містить літери українського алфавіту, кому і пробіл}
For і:=1 То Length(s) Do Begin
K:=pos (s[i], A);
If K-N>0 Then S1:= Sl+A[K-N] Else S1:=Sl+A[K-N+33]
End;
Приклад 12. Заміна кодами. Метод шифрування оснований на тому,лцо у пам'яті машини символи зберігаються у вигляді цілих чисел (кодів символів). У таблиці кодів 256 значень (0..255). За допомогою функції Ord можна одержати код символу, тим самим зашифрувавши текст послідовністю АSCII-кодів.
Алгоритм шифрування:
Завдання. Зашифрувати фразу
"готує Майкрософта дух".
Програма шифрування:
Var S, Sl, S2 : String; N, K, і : integer;
Begin
ReadLn (S);
S1: = ";
For i:=l To Length (S) Do Begin Str (Ord (S[i]), S2);
S1:= S1+S2+' ';
End;
WriteLn (Sl)
End.
Результат:
131 174 226 227 243 32 140 160 169 170 224 174 225 174 228 226 160 32 164 227 229
Алгоритм дешифрування:
Внесення змін у програму для дешифрування:
WriteLn ('введіть зашифроване повідомлення=>');
ReadLn (S); S1: = ";
For і:=1 То Length (S) Do
if S [і] о ' ' Then S2:= S2+S[i]
Else Begin
Val (S2, N, K);
S1:=Sl+Chr (N);
S2: = ";
End;
WriteLn (S1);
Приклад 13. Кодування за ключовою фразою. Вибирається ключова фраза, тобто фраза, у якій є всі букв^і алфавіту, розділові знаки і пробіл. Кожен символ даного тексту замінюється на номер цього символу в ключовій фразі. Отриманий набір чисел передається адресату, який за номерами букв у ключовій фразі відновлює вихідний текст.
Алгоритм шифрування:
Завдання: зашифрувати повідомлення
"Та Інтел, син складних помилок,"
Програма шифрування:
Const А =
'...чи вмію я знаходити за допомогою електронно-обчислювальної машини значення функцій, а ще також об'єми багатогранників?!’;
Var S, Sl, S2 : String; N, K, i: integer;
Begin
WriteLn ("введіть повідомлення для шифрування=> ');
ReadLn (S);
S1:-";
For i:=l To Length (s) Do Begin
K: = Pos (S[i], A); Str (K, S2); Sl:= S1+S2+' ';
End;
WriteLn (S1)
End.
Результат:
21 16 6 9 15 21 37 38 86 6 52 5 15 6 52 40 38 16 19 15 5 8 6 29 18 8 5 38 40 16 8 86
Алгоритм дешифрування:
Внесення змін у програму для дешифрування:
For і:=1 То к Do Begin
ReadLn (N); S1:=S1+S2[N]
End;
WriteLn (Sl);
Приклад 14. Заміна глухих приголосних на дзвінкі. Дуже легко перекладати з української мови на тарабарську, якщо кожен глухий приголосний замінювати відповідним йому дзвінким приголосним і навпаки. Голосні звуки, розділові знаки і пробіли не змінюються. Одна й та сама програма підходить і для шифрування, і для дешифрування.
Алгоритм шифрування:
Завдання: розшифрувати фразу:
«і покцащт, бакаторзіф ткух».
Програма шифрування:
Var S, Sl, S2, S3 : String;
N, Kl, K2, КЗ, і : integer;
Begin
WriteLn ('введіть повідомленням '); ReadLn (S);
S1: = "; S2:= 'бвгджзлмнр1; S3:= 'пфхтшсцчщк';
For i:=l To Length (S) Do Begin
K2:= Pos (S[i],S2);
K3:= pos (S [i],s3);
If (K2=0) And (K3<>0) Then Sl:= Sl+S2[K3]
Else If (K2<>0) And (K3=0) Then Sl:=Sl+S3[K2] Else Sl:=Sl+S[i]
End;
Writel n (S1);
ReadLn
End.
Результат: І Борланд, парадоксів друг.
5. Створення та реалізація програми.
Задача. Зашифрувати повідомлення способом вставки після кожного символу деякої букви.
Var S, sl: String; к, і : Integer; a :Char;
Begin
WriteLn ('Повідомлення для шифрування => ');
ReadLn (s);
WriteLn ('Символ для вставки =>"’);
ReadLn (А); Sl:='';
К:= Length (S);
For і:=1 то K Do
Sl := Sl + S[i] + a;
WriteLn (Sl);
End.
WriteLn ('Повідомлення для шифрування => '); ReadLn (S1);
S:= ";
For і:=1 To Length (Sl) Do
If i Mod 2<>0 Then S:= S+Sl[l];
WriteLn (S);
6. Питання до уроку.
Var A,S,S1:string; і, К: integer; C:char;
Запишіть оператор, що реалізує таку дію:
а) S1='паабсвкгадлеьж';
б) S1=’175 160 225 170 160 171 236';
в) S1='n17а65с34к22а12л34ь56'.
а) Copy (S,4,5);
б) Insert (S1,S,5);
в) Delete (S,4,5).
а) S='інформатика'; -> ? -> S='форма';
б) S='інформатика'; -> ? -> S=’інтика';
6. Домашнє завдання.
Вправа «Опрацювання рядкових даних»
S1:=’’;
For і:=Length(S) DowTo 1 Do S1:= S1 + S[i];
Repeat
{введення рядка S, формування і виведення рядка S1}
….................................................................
Until S=’’;
Slovol, Slovo2 : Array [1..20] of string[20];
Для заповнення масиву Slovol скористайтеся таким фрагментом програмного коду:
і:=0;
Repeat
K:=0; і:=і+1;
{копіювання частішії рядка S до розділового пробілу}
K:=Pos (‘,’, S);
Slovol[i]:=Copy (S, 1, K-l);
Delete (S, 1, K);
Until K=0;
{занесення до масиву останнього слова рядка S}
N:=i;
Slovol[i]:=S;
6. Підготуватися до оцінювання.
«Опрацювання рядкових величин»
а) 345; е) Pred ('D');
б) 7'; є) Suce ('h');
в) 'abed1; ж) Pos ('2а', '32а');
г) '123+34'; з) upease (Т).
д) Length ('56');
а) Z: = '34' + '34-4';
б) A: = 'abc'; D:='de'; Z:=Concat (D,А);
в) Х:=,123'; Y:='qwert'; Z:=Length (X)+Length (Y);
г)X:='-23.34'; Val (X,Z,Cod); Z:=Z+0.34;
д) У:=255; Str (Y,R); Z:=Copy (R^^D+'OO1 ;
е) N: = '3456'; Delete (N,3,2); insert ('lOl',N,2); Z:=Length (N);
є)S: = '9876503', R:=S[6]+S[6]+V+S[5]; Val (R,Z,cod).
a) Length; б) Copy; в) Pos; г) Insert; д) Delete.
Надрукуйте:
а) усі слова зі списку, відмінні від 'привіт';
б) текст, що складається з останніх букв слів;
в) усі слова зі списку, що містять рівно 2 букви 'д'.