Конспект уроку №8 Свинаренка Олександра
Конспект уроку на тему: "Поняття про алгоритми роботи з величинами. Аргументи та результати алгоритму."
Підготував: Студент 44 – групи: Свинаренко Олександр
Мета уроку: Узагальнити і систематизувати матеріал з теми "Поняття про алгоритми роботи з величинами. Аргументи та результати алгоритму". Набути практичних навичок у розв'язуванні задач.
Тип уроку:
Урок-практикум
Зміст уроку
1.Організаційний момент.
2.Актуалізація.
3.Подання матеріалу для виконання.
4.Підсумок уроку.
5.Домашня робота.
Хід уроку
1.Організаційна частина.(Перевірка присутніх і т.д.)
2.Актуалізація.
ВСТУП:
Кожна людина щодня зустрічається з безліччю задач від найпростіших і добре відомих до дуже складних. Для багатьох задач існують визначені правила (інструкції, команди), що пояснюють виконавцю, як розв'язувати дану проблему. Ці правила людина може вивчити чи заздалегідь сформулювати сама в процесі розв'язування задачі. Чим точніше описані правила, тим швидше людина опанує ними і буде ефективніше їх застосовувати. У нашому житті ми постійно складаємо опис деякої послідовності дій для досягнення бажаного результату, тому поняття алгоритму не є для нас досить важливим щоб вміти його сформулювати!!!!!!!!!!!!!
1)Дати визначення АЛГОРИТМА
Відповідь:
Алгоритмом називається зрозуміле і точне розпорядження виконавцю виконати послідовність дій, спрямованих на досягнення зазначеної мети чи на розв'язання поставленої задачі. І стосовно ЕОМ алгоритмом називають систему правил, що визначає послідовність дій, які повинен виконати комп`ютер, щоб знайти результат розв`язання задачі.
2)Створюючи алгоритми необхідно пам`ятати, що набір вказівок вважається алгоритмом, коли він відповідає вимогам (алгоритм повинен характеризуватися такими властивостями):
Відповідь:
1.Дискретність – алгоритм повинен складатися з кінцевого числа окремих послідовних вказівок.
2.Зрозумілість – алгоритм мусить бути зрозумілим для виконавця, тобто складатися з таких вказівок, які входять у систему команд ЕОМ або які відомі (можуть адекватно сприйматися) іншим виконавцям.
3.Визначеність (детермінованість) – усі вказівки повинні бути чіткими й однозначними: значення величин, які отримуються в конкретний момент часу, повинні однозначно визначатися значеннями величин, отриманими в попередні моменти часу.
4.Масовість – можливість використання не для однієї задачі, а цілого класу задач, причому вхідні дані можуть обиратися з деякої області, що називаєтьсРезультативність – у результаті виконання алгоритму повинен бути кінець і результат, якщо ж результат не може бути отриманий, то алгоритм повинен містити пояснення такої ситуації.я областю застосування алгоритму.
3)Виконання будь-якого алгоритму повинне завершуватися одержанням кінцевих результатів (Тобто ситуації, що в деяких випадках можуть призвести до так званого "зациклення", повинні бути виключені при написанні алгоритму). Ця властивість називається:
Відповідь:
Результативність.
4)Залишається згадати, яким чином можна подати алгоритм виконавцю (Існує кілька методів запису алгоритмів, вибір яких залежить від виконавця та того, хто його задає).
Відповідь (кожен з відповідаючих має назвати один спосіб):
Першій спосіб - це словесний опис алгоритму.
Другий спосіб - це подача алгоритму у вигляді таблиць, формул, схем, малюнків тощо.
Третій спосіб - запис алгоритмів за допомогою блок-схеми.
Четвертий спосіб - навчальні алгоритмічні мови (псевдокоди).
П'ятий спосіб - це мови програмування.
Слід звернути увагу що 5й спосіб наближений до комп'ютера!!!!!!!!
5)Пропоную щоб діти дали означення та опис рядкових величин, оскільки мої приклади
побудовані на розв'язуванні задачі з використанням рядкових величин.
При великому бажанні провести даний урок типу "урок викладення нового матеріалу"
даний матеріал легко переробити, додатково надаю матеріал < додаток.
Алгоритми задач в конспекті також присутні.
3.Подання матеріалу для виконання.
Першу задачу слід розглянути з учнями.
Умова: У даному тексті всі послідовності крапок замінити на одну крапку.
Для розв'язку цієї задачі пропонується організувати цикл перегляду кожного елементу рядка (краще за допомогою циклу з передумовою), причому, якщо буде знайдена група крапок, вилучити її повністю, а потім вставити на це ж місце тільки одну крапку. Для вилучення групи крапок можна скористатися кількома способами. Наприклад, підрахувати їх кількість, а потім всі вилучити.
Ми пропонуємо вилучати всі крапки, доки не зустрінеться символ, що не являється крапкою.
Program Example_1;
Uses crt;
Var i:word; {i - змінна циклу}
St:string; {St - даний текст}
Begin
Clrscr;
Write ('Введіть текст: ');
Readln (St);
i:=1;
While i<=length(St) do
Begin
While St[i]='.' do Delete(St,i,1);
Insert('.',St,i);
i:=i+1;
End;
Writeln ('Результуючий рядок: ');
Writeln (St);
Readkey; {Затримка зображення на екрані}
End.
Варіант 1:
Умова: Дано деякий текст, у якому є хоча б одна кома. Визначити порядковий номер останньої коми в тексті. Для пошуку останньої коми в тексті необхідно організувати цикл перегляду рядка з кінця до початку, тобто від останнього символу рядка з номером length(St) до першого. В зв'язку з тим, що ми не знаємо, якою за номером буде кома, краще це зробити командою повторення з передумовою. Цикл завершить свою роботу при досягненні позиції, в якій знаходиться кома (за умовою вона обов'язково є в тексті). Значення змінної циклу і буде номером шуканої позиції. Програма, що реалізує описаний алгоритм, має наступний вигляд:
Program Example_2;
Uses crt;
Var i:byte; {i - змінна циклу}
St:string; {St - даний текст}
Begin
Clrscr;
Write ('Введіть текст: ');
Readln(St);
i:=length(St);
while St[i]<>',' do i:=i-1;
Writeln ('Номер позиції останньої коми в тексті ',i);
Readkey; {Затримка зображення на екрані}
End.
Варіант 2:
Умова: Дано деякий текст. Створити новий текст, який утворено із даного читанням з кінця до початку. Для реалізації даної задачі знов, як і в попередньому випадку, пройдемо рядок з кінця до початку, виконуючи конкатенацію кожного наступного символу до нового рядка. Програма, що реалізує описаний алгоритм, має наступний вигляд:
Program Example_3;
Uses crt;
Var i:byte; {i - змінна циклу}
St,Rez:string; {St - даний текст, Rez -
результуючий (перегорнутий)
рядок}
Begin
Clrscr;
Write ('Введіть текст: ');
Readln (St);
Rez:=; {Очищення рядка}
For i:=length(St) downto 1 do
Rez := Rez+St[i];
Writeln ('Результуючий рядок: ');
Writeln (St);
Readkey; {Затримка зображення на екрані}
End.
Варіант 3: Умова: Перевірити, чи однаково читається дане слово зліва направо і навпаки. Для розв'язку цієї задачі можна використовувати попередню задачу, як підзадачу, тобто спочатку отримати новий рядок, який являється оберненим відносно даного, а потім порівняти даний та отриманий рядки. Якщо вони співпадають, слово являється паліндромом (читається в обох напрямках однаково, наприклад, "дід", "потоп", "Пилип" тощо), в протилежному випадку - ні. Програма, що реалізує описаний алгоритм, має наступний вигляд:
Var i:byte; {i - змінна циклу}
St,Rez:string; {St - даний текст, Rez -
результуючий (перегорнутий) рядок}
Begin
Clrscr;
Write ('Введіть текст: ');
Readln (St);
Rez:=; {Очищення рядка}
For i:=length(St) downto 1 do
Rez := Rez+St[i]; {Перегортання рядка}
If Rez = St
Then Writeln ('Слово являється паліндромом.')
Else Writeln ('Слово не являється паліндромом.');
Readkey; {Затримка зображення на екрані}
End.
Варіант 4:
Умова: Визначити, скільки разів у даному тексті зустрічається послідовність символів "абв". Організовуємо прохід по рядку за допомогою циклу з параметром, причому враховуємо, що необхідно перевірити три послідовно розташованих символи (зверніть увагу на можливість виходу за межі рядка!). Один з методів вибору кількох послідовних символів вже розглядався раніше (і-ий, і+1-ий та і+2-ий елементи), тому розглянемо інший метод, що полягає у використанні функції копіювання Copy. Нагадуємо, що ця функція містить у якості параметрів вихідний рядок, номер початку копіювання (виділення) та кількість вибраних символів, тобто для вибору трьох символів з будь-якого місця рядка St ця функція буде мати вид:
Copy(St,і,3).
Порівнюючи виділені (скопійовані) символи з еталоном, нарощуємо лічильник при виконанні поставлених умов.
Програма, що реалізує описаний алгоритм, має наступний вигляд:
Var i:byte; {i - змінна циклу}
St:string; {St - даний текст}
Count:byte; {Count - лічильник
послідовностей}
Begin
Clrscr;
Write ('Введіть текст: ');
Readln (St);
Count:=0; {Початкове значення лічильника}
For i:=1 to length(St)-3 do
If Copy (St,i,3) = 'абв'
Then count:=count+1;
Writeln ('Кількість шуканих послідовностей: ',count);
Readkey; {Затримка зображення на екрані}
End.
Варіант 5:
Умова: Нехай дано формулу. Визначити коректність формули щодо кількості відкритих та закритих дужок. Вважається, що закриті дужки не стоять перед відкритими. Якщо дужки у формулі відсутні - повідомити про це. Для визначення коректності формули необхідно підрахувати кількість відкритих та кількість закритих дужок. Якщо ці значення дорівнюють одне одному, баланс дужок виконується, якщо ні - не виконується (дійсно, у правильній формулі кількість відкритих та закритих дужок повинні співпадати). Щоб визначити, чи є в формулі дужки взагалі, достатньо перевірити на нуль кількість одних чи других дужок. Визначимо змінні count_left та count_right,
як кількість відповідно лівих (відкритих) та правих (закритих) дужок, тоді програма, що реалізує описаний алгоритм, має наступний вигляд:
Var i:byte; {i - змінна циклу}
St:string; {St - даний текст}
count_left, count_right:byte;
{count_left - лічильник кількості
лівих дужок, count_right -
лічильник кількості правих дужок}
Begin
Clrscr;
Write ('Введіть формулу: ');
Readln(St);
Count_left:=0; {Початкове значення лічильника}
Count_right:=0;
For i:=1 to length(St) do
Begin
If St[i] = '('
Then count_left:=count_left+1;
If St[i] = ')'
Then count_right:=count_right+1; End; Writeln ('Кількість лівих дужок: ',count_left);
Writeln ('Кількість правих дужок: ',count_right);
If (count_left=0) or (count_right=0)
Then writeln ('Формула не має дужок.')
Else
Begin
If count_left = count_right
then Writeln ('Формула коректна.')
else writeln ('Формула не коректна.');
end;
Readkey; {Затримка зображення на екрані}
End.
4.Підсумок уроку.
5.Домашнє завдання:
Умова: Нехай дано текст S та значення символьних змінних x та y. Із тексту вилучити всі символи, що збігаються з x і повторити двічі всі символи, що збігаються з y. Для розв'язання запропонованої задачі необхідно переглянути кожен символ рядка і, якщо він співпадає з символом x, вилучити його процедурою delete, а якщо збігається із символом y - вставити перед ним такий самий процедурою insert. Програма для реалізації цього алгоритму має наступний вигляд:
Var i:byte; {i - змінна циклу}
S:string; {S - даний текст}
x,y:char; {x,y - шукані символи}
Begin
Clrscr;
Write ('Введіть текст: ');
Readln (S);
Write ('Введіть шукані символи: ');
Readln (x,y);
For i:=1 to length(S) do
Begin
If S[i] = x
Then delete(S,i,1);
If S[i] = ')'
Then insert(y,S,i);
End;
Writeln ('Результуючий рядок після зміни: ',S);
Readkey; {Затримка зображення на екрані}
End.
Умова: Розробити програму-шифрувальник тексту, що замінює кожну його літеру наступною по порядку в абетці. Останню літеру абетки необхідно замінити першою. В даній задачі необхідно, по-перше, перевірити, чи є черговий символ рядка буквою. Відомо, що всі букви латиниці розташовані в таблиці ASCII-кодів двома групами великих та малих літер, а літери кирилиці - двома нерівномірними групами від 'А' до 'п' та від 'р' до 'я': 'A'.. 'Z' - коди 65 .. 90;
'a'..'z' - коди 97 .. 122;
'А'..'п' - коди 128 .. 175;
'р'..'ї' - коди 224 .. 245.
Якщо черговий символ рядка - буква, необхідно збільшити її код на 1, а потім перетворити отриманий код в букву. Для визначення коду за символом використовується процедура ord, а для визначення символу за ASCII-кодом - процедура char. Для останніх літер необхідно написати незалежні команди розгалуження для заміни їх на перші літери абетки, причому для символів латиниці можна скористатися однією формулою chr(ord(S[i])-25), тому що, кількість великих та малих літер в абетці однакові і відстань від першої літери до останньої дорівнює 25. Програма для реалізації описаного алгоритму має наступний вигляд:
Var i:byte; {i - змінна циклу}
S:string; {S - даний текст}
Begin
Clrscr;
Write ('Введіть текст: ');
Readln (S);
For i:=1 to length(S) do
Begin
If (S[i]>=65) and (S[i]<90) or
(S[i]>=97) and (S[i]<122) or
(S[i]>=128) and (S[i]<159) or
(S[i]>=160) and (S[i]<=175) or
(S[i]>=224) and (S[i]<245) or
Then S[i]:=chr(ord(S[i]+1);
If (S[i] = 'Z') or (S[i] = 'z')
Then S[i]:=chr(ord(S[i])-25);
If (S[i] = 'Я')
Then S[і]:='А';
If (S[i] = 'я')
Then S[і]:='а';
End;
Writeln ('Результуючий рядок після зміни: ',S);
Readkey; {Затримка зображення на екрані}
End.
Умова: Дано деякий текст. Групи символів, які розділені пробілами (одним або кількома) та не містять всередині себе пробілів, називатимемо словами. Вважатимемо, що текст завжди починається зі слова. Визначити кількість слів, у яких перша та остання літера однакові.
При виконанні розв'язку цієї задачі, очевидно, що початок першого слова буде співпадати з першою літерою рядка (дивись умову), а кінець слова можна визначити, знайшовши перший проміжок. Скопіювавши це слово в додатковий рядок, ми отримаємо нескладну задачу порівняти його перший та останній символи. Якщо ці символи співпадають, слово підраховується, і процес продовжується для наступного слова.
Щоб задачу пошуку чергового слова зробити ідентичною для всіх слів, можна вважати,
що початком слова є послідовність з проміжку та непроміжку,
а відповідно кінцем слова є послідовність з непроміжку та проміжку
(цей метод зручний ще тим, що враховує те, що між словами може бути не один проміжок -
всі зайві проміжки пропускаються). Виділятися з цього буде перше та останні слова,
тому що на початку рядка та в його кінці користувач може не поставити проміжок і ці
слова не буде знайденим. Щоб узагальнити задачу пропонуємо один зі штучних методів:
дописати на початку та в кінці рядка проміжки . Тоді, програма для реалізації
описаного алгоритму буде мати наступний вигляд:
Var i:byte; {i - змінна циклу}
S,Slovo:string; {S - даний текст, Slovo -
вирізане з тексту слово}
count:byte; {count - лічильник шуканих
слів}
Begin
Clrscr;
Write ('Введіть текст: ');
Readln (S);
S:=' '+S+' '; {Дописування проміжку перед
першим словом та після останнього}
Count:=0; {Початкове значення лічильника}
i:=1; {Початок перегляду рядка}
while i<=length(S)-1 do
Begin
If (S[i]=' ') and (S[i+1]<>' ')
Then
Begin
Slovo:=; {Очищення рядка для
зберігання чергового слова}
While (S[i+1]<>' ') do
Begin
Slovo:=Slovo+S[i+1];
i:=i+1;
End;
If Slovo[1] = Slovo[length(Slovo)]
Then count:=count+1;
End;
i:=i+1;
End;
Writeln ('Кількість шуканих слів: ',count);
Readkey; {Затримка зображення на екрані}
End.
--СВИНАРЕНКО АЛЕКСАНДР 21:53, 21 октября 2008 (EEST)