Урок — игра по информатике на тему: «Занимательный урок на компьютере. Информатика и Русский язык. Палиндромы»
Учитель: Радаева Елена Николаевна
МБОУ СШ №8 г. Нижневартовск
Класс: 11
Тема урока: «Занимательный урок на компьютере. Палиндромы».
Цели урока:
Образовательные
познакомить со структурой программы, основными типами данных, назначением и синтаксисом операторов ввода/вывода, присваивания, вспомнить из уроков по русскому языку определение палиндрома;
Развивающие
развивать память, внимание, алгоритмическое мышление.
способствовать развитию творческой деятельности учащихся и интереса к предмету информатика;
Воспитательные
воспитывать аккуратность, формировать познавательный интерес к информатике и русскому языку;
воспитывать умение внимательно выслушивать мнение других, воспитание культуры общения.
Тип урока: игровой.
Форма урока: повторение пройденного материала.
Методы обучения: наглядный, словесный, тестирование.
Оборудование: раздаточный материал, доска, среда программирования PASCALABC.NET.
План проведения урока:
Организационный момент –2 мин.
Подготовительный этап – 10 мин.
Решение задачи, тестирование – 26 мин.
Подведение итогов уроков – 2 мин.
Ход урока: Стремление читать слова задом наперёд присуще даже самым отвратительным личностям, к коим мы, без тени сомнения, можем причислить Полиграфа Полиграфыча Шарикова из романа Михаила Булгакова «Собачье сердце». Вспомните, как он начал своё восхождение к высотам низменных мыслей с причудливого слова Абырвалг, которое поначалу поставило в тупик доктора Борменталя и профессора Преображенского. Впрочем, они быстро догадались, что в оригинальном написании это была лишь вывеска магазина Главрыба, прочитанное Шариковым с конца.
Чему нас учит классика на данном примере? — Не всякое слово следует читать «по-арабски», дабы не смущать учёные умы!
Впрочем, истории известен и другой, весьма поучительный пример ретроградного чтения, опровергающий предыдущее утверждение. В порядком уже давние времена на Амуре село на мель судно под названием Сунь Ятп-сен (китайский политик), его пытались стянуть за корму, но безуспешно. Это мероприятие продолжалось очень долго — до тех пор, пока один из матросов не повторил лингвистический подвиг Шарикова и не прочитал название судна с конца. Получилось Не стянусь! (только не придирайтесь к мелочам). Тогда попробовали зацепить трос за нос судна — и оно легко снялось с мели.
Кто мешает тебе выдумать порох непромокаемый.
Козьма Прутков
Второй пример лучше первого потому, что в результате прочтения названия судна наоборот получилась вполне осмысленная фраза, обернувшаяся практической пользой. Конечно, это всего лишь случайность, но кто запретит нам придумывать такие «двусмысленности»?
Однако больше известны другие фразы — их можно без ущерба для смысла читать и слева направо, и справа налево. Их называют палиндромами. Пожалуй, самый известный палиндром а роза упала на лапу Азора придумал Афанасий Фет, но мы знаем этот палиндром только потому, что именно эту «волшебную» фразу диктовала Мальвина своему дубовому ученику Буратино. Легко проверить, что она читается точно так же и в обратную сторону. Потому и волшебная!
В литературе вы найдёте множество примеров фраз-палиндромов (или — более патриотично — перевёртышей), порой очень забавных и даже ненормативных. Но придумывание таких афоризмов — настоящее искусство, которое совершенно не поддаётся алгоритмизации, поэтому мы поставим перед собой чисто техническую задачу — отыскать слова, которые не изменяются при чтении наоборот. Их тоже называют палиндромами, и вы наверняка знаете немало таких слов. Например, РОТОР, ШАЛАШ, КАБАК. Чтобы найти все такие слова, достаточно внимательно просмотреть словарь русского языка, но мы делегируем это занятие компьютеру.
Палиндромная программа:
На этом уроке мы напишем программу Palindrome для поиска слов-палиндромов, но сначала давайте придумаем алгоритм программы.
Объявим переменные и присвоим им значения:
var string 2:= '';
var string l:= 'РОТОР';
Велико искушение присвоить переменной string2 значение перевёрнутой строки stringl. Например, так:
var len := stringl.Length;
for var i:= 0 to len-1 do begin
var chr:= stringl.Substring(len-i-1,1); string2 += chr; end;
Действительно, если слово не изменяется при чтении задом наперёд, то stringl = string2. Сравниваем строки и при их равенстве делаем вывод, что слово-палиндром найдено:
if stringl <> string2 then writeln('He палиндром') else
writeln('Палиндром');
Можно поступить проще и ограничиться одной строковой переменной. Для этого достаточно заметить, что в слове-палиндроме одинаковые буквы расположены симметрично относительно середины слова, то есть нужно сравнить первую половину букв со второй (если в слове нечётное количество букв, то букву в середине слова ни с какой другой сравнивать не надо).
var len:= stringl.Length; var flg:= true;
for var j:= 1 to len div 2 do begin
var chrl:= stringl[len-j+1]; var chr2:= stringl[j]; if (chrl <> chr2) then begin
flg:=false;
break;
end;
end;
//нашли палиндром:
if (fig) then
С одним словом всё понятно, но нам нужно просмотреть все слова русского языка. Обычно палиндромы ищут среди существительных, поэтому мы также можем ими ограничиться. Мы уже пользовались словарем С. И. Ожегова и Н. Ю. Шведовой, в котором были бережно сохранены только существительные. Вы можете загрузить файл OSH-W97.sb ещё раз и убедиться, что в нём ровно 27 407 слов.
Нам нужно знать их число, чтобы задать размер массива. В этом случае нужно ввести константу MAX_WORDS с наибольшим предполагаемым числом слов.
Объявляем константы и переменные:
//ПРОГРАММА ДЛЯ ПОИСКА ПАЛИНДРОМОВ
uses CRT; constMAX_W0RDS = 30000; fileNameIn=' 0SH-W97. txt'; fileNameOut=' palindrome. txt1 ;
var//массив-список слов:
spisok: array [1..MAX WORDS] of string; //число слов в списке:
nWords: integer; f: textfile;
И считываем данные в массив spisok:
//ОСНОВНАЯ ПРОГРАММА
beginSetWindowTitle('ПРОГРАММА ДЛЯ ПОИСКА ПАЛИНДРОМОВ’);
TextColor(LightRed); writeln('ИЩЕМ ПАЛИНДРОМЫ'); writeln;
TextColor(Yellow); readFile; -
Весь процесс загрузки файла вынесен в отдельную процедуру:
//Считываем словарь в массив procedure readFile(); begin
nWords:=0; var s: string; assign (f, fileNameln); reset(f);
while not eof(f) do begin
readln(f, s);
//writeln(s); inc(nWords); spisok[nWords]:= s; end; close(f); end;
Раньше мы только записывали данные в файл, а вот чтобы считать их из файла, необходимы процедуры
reset(f) иreadln(f, s).
Первая открывает файл для чтения. Вторая считывает строку в переменную s
В данном случае мы точно знаем, что в словаре 27 407 слов, поэтому нам достаточно цикла For, чтобы загрузить все слова из файла. Однако не всегда известно, сколько строк в файле, поэтому в подпрограмму введена дополнительная проверка.hile not eof(f) do
Если условие not eof (f) не выполняется, то конец файла ещё не достигнут, в противном случае — файл яякптппглпя. Дальше действие подпрограммы должно быть вам понятно и без дополнительных объяснений. Процесс загрузки файла мы будем контролировать в консольном окне, печатая каждое новое слово на экране. Конечно, словарь загрузится и без нашего наблюдения, но при отладке программы совсем неплохо «присмотреть» за её работой.
В тексте программы эта строка закомментирована, поскольку каждый раз просматривать тысячи слов не обязательно:
w//writeln(s);
Зрелище всё ж любопытное, так что посмотрите обязательно!
Итак, в процедуре readFile мы загрузили все слова в строковый массив spisok и теперь можем целиком отдаться поиску палиндромов. Для этого достаточно проверить каждое слово в списке: если оно симметрично, то это палиндром, иначе — обычное слово. Из этого следует, что можно было бы и не загружать слова в массив, а проверять слова на лету. Но обычно слова используются в программе по нескольку раз, поэтому наш способ более универсальный!
Сам поиск палиндромов основан на уже рассмотренном нами алгоритме. Мы последовательно загружаем слова из массива spisok в переменную s (для наглядности программы и некоторого ускорения работы программы; можно везде пользоваться переменной spisokfi]) и проверяем его на «палиндромность». Найденные слова-палиндромы выводим в консольное окно и записываем в файл:
//ИЩЕМ ПАЛИНДРОМЫ
procedure findPalindrome ();
beginassign (f, fileNameOut);
rewrite (f);
var s: string;
//ищем палиндромы в списке слов:
for var i:=l to nWords do
begins:= spisok[i];
//writeln(s);
var len:= s.Length;
var flg:= true;
for var j:= 1 to len div 2 do
beginvar chrl:= s[len-j+l];
var chr2:= s[j]; if (chrl <> chr2) then
beginflg:=false;
break;
end;
end;
//нашли палиндром: if (fig) then begin
writeln (s);
writeln(f,s);
end;
end; //For i
close(f);
end;
Обратите внимание на переменные chrl и chr2, в которые записываются символы очередного слова, симметричные относительно его середины. Без них также можно обойтись, но, согласитесь, так программа читается куда легче!
Нам осталось вызвать процедуру findPalindrome из основной программы:
findPalindrome;
writeln ();
writeln (OK);
writeln ();
end.
Исходный код программы:
//Программа для поиска Палиндромов
Uses CRT;
ConstMAX_WORDS = 30000;
//fileNameIn=’OSN-W97frc.txt’;
fileNameIn=’OSN-W97.txt’;
fileNameOut=’palindrome.txt’;
var//массив-список слов:
Spisok: array [1..MAX_WORDS] of string;
// число слов в списке:
nWords: integer;
F: textfile;
//Считываем словарь в массив
PROCEDURE readFile();
// procedure findPalindrom();
//begin
//end;
Begin
nWords:=0;
var s: string;
assign(f, failnameIn);
reset (f);
while not eof (f) do
beginreadln (f, s);
//writeln (s);
ink (nWords);
spisok [nWords]:= s;
end;
close (f);
end;
//ИЩЕМ ПАЛИНДРОМЫ
Procedure findPalindrom ();
beginassign (f, fileNameOut);
rewrite (f);
var s:string;
//ищем палиндромы в списке слов:
For var i:=1 to nWords do
Begin
S:=spisok [i];
//writeln (s);
var len:= s.Length;
var flg:= true;
for var j:=1 to len div 2 do
beginvar chr1:= s[len-j+1];
var chr2:= s[j];
if (chr1 <> chr2) then
beginflg:=false;
break;
end;
end;
//нашли палиндром:
If (flg) then
beginwriteln (s);
writeln (s,f);
end;
end; // For iclose (f);
end;
// ОСНОВНАЯ ПРОГРАММА
beginSetWindowTitle (‘Программа для поиска палиндромов’);
TextColor(LightRead);
Writeln («Ищем палиндромы»);
Writeln;
TextColor(Yellow);
readFile;
findPalindrom;
writeln();
writeln(‘OK’);
writeln();
end.