Глава 2. Тема 2. «Структурное программирование» Урок 1. Тема урока: Структура языка программирования Паскаль. (1 час). Общие замечания: следующие несколько уроков носят в целом знакомую для учащихся информацию, поэтому учителю важно систематизировать знания учащихся и построить уроки, сочетая теорию с практикой. Цель урока: Знакомство учащихся со структурой процедурных языков программирования. Систематизация знаний учащихся программирования по основам языка Паскаль, развитие навыков учащихся по отладке программ. Примерный ход урока: 1 часть - теоретическая (20 минут). Урок проводится в форме дискуссии по истории развития языка Паскаль, обсуждения подсистем системы процедурных языков программирования, понятий синтаксис и семантика языка. Затем следует обсудить структуру Паскаль-программы, основные понятия: алфавит языка, понятие идентификатор, комментарии. 2 часть – практическая (20 минут). Подготовьте примеры программ, содержащие синтаксические и семантические ошибки (или предложите учащимся привести свои примеры), пусть сначала ученики проанализируют программы и визуально определят ошибки. Затем можно проверить высказанные предположения и отладить программы. Необходимо подчеркнуть, что компьютер – это формальный исполнитель программы, написанной человеком, и даже если компилятор выдаёт сообщение об ошибке, то понимать его надо не буквально, а пытаться разобраться с причиной, приведшей к ошибке. Здесь уместно вспомнить этапы решения алгоритмической задачи и исследовать, какие ошибки на каком этапе могут возникнуть. Подведение итогов занятия. Домашнее задание. §2.2.1, знать структуру Паскаль-программы, назначение каждого раздела. Урок 2. Тема урока: Концепция типов данных. (1 час). Цель урока: Систематизация знаний учащихся программирования по основам языка Паскаль, знакомство с новыми типами данных. Примерный ход урока: 1. Повторение материала прошлого урока (10 минут). Можно подготовить 2-3 слайда с небольшими программами, содержащими синтаксические ошибки: неверно записан идентификатор, дважды описанная переменная, неверно расставлены (или не расставлены) «;», отсутствует конец программы и т.п. В последний пример целесообразно включить 1-2 команды, содержащие ошибки применения типов данных. Таким образом, возникнет проблема, связанная с необходимостью обсудить концепцию типов данных. 2. Обсуждение понятия «тип данных» в языке Паскаль. Данный вопрос имеет важное значение для воспитания культуры программирования. Необходимо донести до учащихся мысль, что прежде чем разрабатывать программу, необходимо чётко представлять, какие переменные будут использованы в программе и какого типа они должны быть. В основе этого понимания лежит представление о форме представления значения в памяти компьютера, множестве допустимых операций и диапазоне принимаемых значений. В учебнике представлена таблица, содержащая всю информацию о простых типах данных языка Паскаль. Обязательно следует разобрать таблицу, напомнить учащимся связь: представление значения в памяти - диапазон значений. Для грамотного использования типов в программах надо знать диапазон значений всех целых типов данных и хотя бы порядок значений вещественного (real). Новой информацией для учащихся являются сведения о возможности создавать свой тип и о перечислимом типе данных. Следует разобрать примеры, приведённые в учебнике. Так же можно добавить, что перечислимый тип имеет ограничения по использованию, так как нельзя вводить-выводить значения перечислимого типа. Его, как правило, применяют для использования в программах, где необходимо перечислить дни недели, названия месяцев и т.п. Например, определить недельную учебную нагрузку можно с помощью программы, в которой применяется перечислимый тип данных: type week_day= (mon, tue, wed, thu, fri, sat, sun) ; var day:week_day ; S,k:byte; begin S:=0; for day:=mon to sun do begin case day of mon,wed: k:=6; tue,fri:k:=8; thu,sat:k:=4 else k:=0; end; S:=S+k; end; writeln('s=',S); Readln end. Затем необходимо остановиться на особенностях применения ограниченного типа: это подмножество значений порядкового типа, причем нижнее значение не должно превышать верхнее значение. Домашнее задание. §2.2.1, §2.2.2, ответить на вопросы, выучить сведения о порядковых типах (табл. 2.1), §2.2.3, выучить стандартные математические функции Паскаля, выполнить упражнения 1-4 после §2.2.3. Урок 3. Тема урока: Операции, функции, выражения в языке Паскаль. (1 час). Цель урока: Систематизация знаний учащихся программирования по основам языка Паскаль, развитие навыков отладки программ. Примерный ход урока: 1 часть – Проверка домашнего задания (10 минут). Обсудите возникшие у учащихся вопросы, затруднения. Особое внимание уделите приоритетам операций в выражениях, типу получаемого значения. Например, в упражнении 4 и) значение выражения вычисляется слева направо: 3*7 div 2 mod 7/3 — trunc(sin(1))=21 div 2 mod 7/3 – trunc(sin(1))=10 mod 7/3 trunc(0,0175)=3/3 – 0=1.0 (имеет результат вещественного типа) Остановите внимание на приоритеты выполнения логических операций при составлении логических выражений. 2 часть – (7-8) выполнение упражнений 5, 6 после §2.2.3. 3 часть – Практическая работа (20-25 минут) – составить и отладить программы к заданиям 1-2 практической работы 3.1 (данные вводятся с клавиатуры). Выполнить №8-9 в тетради, обсудить результаты. Домашнее задание. §2.2.3, составить и отладить программы к заданиям 3-7 практической работы 3.1, принести в электронном виде, задания 10-14 оформить в тетради. Урок 4. Тема урока: Оператор присваивания в языке Паскаль. (1 час). Цель урока: Систематизация знаний учащихся о командах присваивания, ввода-вывода данных в языке Паскаль. Примерный ход урока: 1. Проверка домашнего задания, обсуждение возникших трудностей, исправление ошибок (20 минут). Следует обратить внимание учащихся на следующие моменты: во-первых, возможные ошибки, которые можно выявить только в процессе тестирования. Например, в задании №6 практической работы 3.1, если в арифметическом выражении вычисления квадратного b D корня x1 : при записи на языке Паскаль не расставить правильно скобки, 2a можно получить результат, но неверный. И эта ошибка выявляется только правильно подобранным тестом. Неверное выражение: x1:=(-b+sqrt(D))/2*a; - ошибка не выявляется при a=1, поэтому нужно подобрать тест при a≠1; Правильная запись: x1:=(-b+sqrt(D))/(2*a); или x1:=(-b+sqrt(D))/2/a. Во-вторых, в задаче №7 (вычисления площади равнобедренной трапеции) используется значение угла при большем основании трапеции. Необходимо напомнить учащимся, что тригонометрические функции sin(x), cos(x) вычисляют значение для аргумента, выраженного в радианах. В задаче после ввода данных необходимо значение угла из «градусов - xg» перевести в «радианы-xr» следующей командой: xr:=xg*Pi/180. 2. Теоретическая часть (25 минут). Обсуждение особенностей выполнения оператора присваивания. Упражнения №3-6 после параграфа 2.2.4. Особое внимание необходимо обратить на соответствие типов данных (упр. 3), напомнить, что «вещественное деление» - «/» - всегда даёт результат вещественного типа, даже если выполняется команда n:=n/1, равно как результат функции sqrt(4) и т.д. Можно практически проверить решение №4 (выполнить с целыми и вещественными величинами). Решение задачи без использования дополнительной переменной: var x,y:integer; begin writeln(‘введите x y’); Readln(x,y); x:=x+y ; y:=x-y; x:=x-y; writeln('x=',x); writeln('y=',y); end. При вводе x,y соответственно 10 20000 Ответ: x=20000 y=10 Далее предложите выполнить программу при вещественных значениях x = 10.3 и y= 20000.1, объяснить результат: x=20000.1 y=10.2999999999993. Домашнее задание. Составить и отладить программы к № 15-21 практической работы 3.1. Уроки 5-6. Тема занятий: Текстовые файлы в языке Паскаль. Ввод-вывод данных. (2 часа). Общие замечания: На следующих двух занятиях необходимо с учащимися освоить чтение данных их текстового файла и их использование в программе, а также запись результатов в файл. Если группа достаточно сильная, можно сразу на одном уроке объяснить операции ввода и вывода данных в файл, а на следующем уроки практически закрепить полученные знания. Здесь приводится вариант последовательного освоения учебного материала. Урок 5. Текстовые файлы в языке Паскаль. Ввод данных из файла. (1 час). Цель занятия: Знакомство учащихся с особенностями хранения данных в текстовом файле и операциями ввода данных из файла в языке Паскаль. Примерный ход занятия: 1. Объяснение нового материала (25 минут). Занятие можно начать с постановки проблемы: как сохранить получаемые при выполнении программы результаты или вывести их на внешнее устройство? Как в программе использовать данные, хранящиеся во внешнем файле? Затем перейти к объяснению понятия «файл», назначения и типов файлов, подробнее остановиться на особенности хранения данных в текстовом файле. Следует обсудить отличия команд read-Readln, write-writeln при работе со стандартными файлами ввода-вывода, исследовать особенности выполнения команд на практике. Желательно подготовить и разобрать несколько примеров с программами, подобных тем, что приведены в учебнике. Учащиеся выполняют, делают выводы. Далее необходимо объяснить порядок подключения текстового файла для ввода информации из текстового файла. Обсудите с учащимися, какие действия надо для этого выполнить: создать с помощью текстового редактора и сохранить текстовый файл с данными, затем в программе обратиться к нему (порядок подключения файла к программе описан в учебнике, §2.2.4). Необходимо обратить внимание учеников на корректность представления в файле числовых данных: целая часть отделяется от дробной части символом ‘.’, межу числами обязательно должен стоять 1 или несколько пробелов. Практическая часть урока. В качестве примера можно рассмотреть программу решения следующей задачи: В двух строках текстового файла находится по два действительного числа. Найти сумму этих чисел. Результат вывести на экран. Текст программы: Program one; Var a,b,c,d,S: real; F: text; Begin Assign(F, 'c:\temp\abc.txt'); Reset(F); Readln(F, a, b); Readln(F, c, d); S:=a+b+c+d; writeln('сумма=',S) ; Close(F); end. При содержимом файла: -1.5 3.5 6.5 4 Результат программы: сумма=12.5 Для контроля прочитанных из файла значений желательно добавлять в программу следующую команду: writeln(‘из файла прочитаны значения: a=’, a,’ b=’,b, ‘ c=’,c, ‘ d=’ , d). 2. Практическая часть урока (20 минут) – закрепление навыков чтения данных из файла. Задание: внести изменения в составленные дома программы практической работы 3.1 (№ 8-14) таким образом, чтобы ввод данных осуществлялся не с клавиатуры, а из файла. Обязательно выводить прочитанные из файла данные на экран. Учитель консультирует, помогает справиться с проблемами. Домашнее задание. Изменить программы к № 15-21 практической работы 3.1 таким образом, чтобы данные вводились из файла. Составить и отладить программы для заданий №22-24, принести в электронном виде. Урок 6. Тема занятия: Вывод данных в текстовый файл. (1 час). Цель занятия: Знакомство учащихся с операцией вывода данных в файл; закрепление навыков чтения из файла, использования стандартных функций языка Паскаль. Примерный ход занятия: 1. Проверка домашнего задания (15-20 минут). Проверьте правильность выполнения заданий, особенно №18, 19, 21, так как при выполнении этих заданий требуется неформальное применение математических функций языка Паскаль. Приведём решения заданий. Задание №18: Примечание: в данной задаче для выделения дробной части необходимо использовать целочисленные операции, а не функцию frac(x), так как в результате вызова функции возвращается приближённое значение, например, Frac(338.169)=0.168999999999983. program n18; var t,h,m,s:integer; f:Text; begin Assign(f,’18.txt’); Reset(f); Readln(f,t); Close(f); writeln(‘введено время в секундах’,t); h:= t div 3600; m:= t mod 3600 div 60; s:=t mod 60; writeln('часы h=',h); writeln('минуты m=',m); writeln('секунды s=',s); end. Задание №19: program n19; var number1, number2,dr:real; c:integer; f:Text; begin Assign(f,’19.txt’); Reset(f); Readln(f, number1); Close(f); writeln('исходное число', number1); c:=trunc(number1); {целая часть числа} dr:=trunc(number1*1000) mod 1000 ;{дробная часть числа, записанная как целое 3-хзначное число} number2:=dr+ c/1000; writeln('число 1= ',number1,'число 2= ', number2); end. Задание №21: Пояснения к решению: Для решения данной задачи требуется провести ряд выкладок: 1. Окружность составляет 360○, это значение – 12 часов. Следовательно, в 1 часе 360/12=30○. 2. в 1 часе (30○)– 60 минут. Следовательно, одному градусу соответствует 2 минуты. 3. Если будет введено число, содержащее дробную часть, то округление должно производиться по правилам математики, например, число 90.5 будет производиться в большую сторону, так как 0.5○ соответствует 1 мин. program n21; var y:real; yc:integer; h,m:0..60; f:Text; begin Assign(f,’19.txt’); Reset(f); Readln(f,y); Close(f); writeln(‘угол составляет’, y,’градусов’); yc:=round(y); {преобразовали вещественное число к целому} h:=yc div 30; {полное количество часов} m:= yc mod 30 *2 ;{целое количество минут} writeln(число полных часов',h, 'прошло минут ',m) end. 2. Объяснение нового материала (20 минут). Логику объяснения можно построить аналогично тому, как описано в учебнике: обсудить команды, порядок их выполнения, проверить работу программы записи в текстовый файл таблицы умножения. Кроме того, целесообразно пояснить особенности работы команды Rewrite(f) – каждый вызов операции стирает содержимое файла, запись будет осуществляться «с нуля». Если необходимо добавить данные в конец непустого текстового файла, то надо вызвать команду Append (f)-открыть текстовый файл для «дозаписи». Также можно более подробно остановиться на особенностях форматов вывода для целочисленных и вещественных величин. В заключение можно предложить учащимся в программах, рассмотренных в первой части занятия, изменить экранный вывод результатов на вывод в файл. Например, программа к №18 из практикума преобразуется к следующей: Program n18; var t,h,m,s:integer; Fi, Fo:Text; begin Assign(Fi,’18.txt’); Assign(Fo,’Result_18.txt’); Reset(Fi); Readln(Fi,t); Close(Fi); Rewrite(Fo); writeln(Fo,‘введено время в секундах’,t); h:= t div 3600; m:= t mod 3600 div 60; s:=t mod 60; writeln(Fo,'часы h=',h); writeln(Fo,'минуты m=',m); writeln(Fo,'секунды s=',s); Close(Fo) end. Домашнее задание. §2.2.4, задание №7 после параграфа. Составить программы к заданиям 25-28 практикума (данные вводить из файла, результаты выводить в файл). Урок 7. Практическая самостоятельная работа на тему «Программирование линейных алгоритмов на Паскале (1 час). Цель занятия: закрепление навыков построения линейных алгоритмов, работы с текстовыми файлами, построения арифметических и логических выражений с использованием стандартных функций языка Паскаль. Примерный ход занятия: 1. Проверка домашнего задания (10 минут). Рассмотрим решение задачи №28 из практической работы 3.1 (Вывести результат логического выражения: Среди первых трёх цифр из дробной части вещественного числа есть нуль). program N28; var Dr:real; cd:integer; a,b,c:0..9; begin Writeln('введите вещественное число'); Readln(Dr); cd:=Trunc(frac(Dr)*1000); {выделение из дробной части числа трёх первых цифр, результат – целое трёхзначное число} a:=cd div 100; b:=cd div 10 mod 10; c:=cd mod 10; writeln((a=0) or (b=0) or (c=0)); end. 2. Практическая самостоятельная работа на тему «Программирование линейных алгоритмов на Паскале (35 минут). Задание 1. Один из вариантов задания №29 из Практической работы 3.1. Данные должны вводиться из файла, результаты выводиться в файл. Разработать тесты к программе и проверить их. Задание 2. Задание из №30-36 из Практической работы 3.1. Данные должны вводиться из файла, результаты выводиться в файл. Разработать тесты к программе и проверить их. Домашнее задание. §2.2.5, №3,4 после параграфа (блок-схемы в тетради, программы в электронном виде).