Методическое и дидактическое обеспечение преподавания раздела «Алгоритмы и программы» в 5-11 кл. Исполнитель

Вид материалаРеферат

Содержание


Program prg1_1; Uses Crt
Program prg1_2
WriteLn ('Их сумма = ', d); s:= a-b; WriteLn (
WriteLn ('Их частное = ', q:25:24); {Форматированный вывод} WriteLn
Program prg2; {Стандартные функции} Uses Crt
Билет усовершенствовать и подсчитать количество «счастливых» билетов в задаваемом диапазоне. Здесь же применяем оператор GotoXY
Until z > 50; writeln
End; Function
Подобный материал:
1   2   3   4   5   6   7   8   9

Как всегда на первых уроках начинаем изучать основные понятия языка (описание языка, стандартные имена). Знакомимся со структурой программ на Pascal (заголовок, описательная часть, исполняющая часть) с помощью гипертекстового (есть и Word-овская версия) учебника по Pascal выпускницы 2002 г. Зашихиной Тамары. Это был её экзаменационный проект. Всё это я организую как практическую работу («Структура программы на Pascal»).

Далее разбираемся с типами данных. («Типы данных. Переменные») по гипертекстовой версии самоучителя О.А.Меженного, изготовленного мной и выпускниками Коломойцем Сергеем и Кривоноговым Сергеем.


При изучении темы «Переменные», после уяснения понятий тип, имя, начинаем разбираться со значениями : числовые – целые и вещественные, символьные, логические. Это не представляет никакой сложности, т.к. практически 100% повторяет язык QBasic, меняются лишь названия. С нестандартными простыми типами (перечислимый, диапазонный, типизированные константы) лишь знакомимся, а глубокое изучение откладываем до будущих времён.

Начинаем с простых программ. Знакомимся с командой присваивания, командами ввода/вывода и основными операциями : сложение, вычитание, умножение, деление, и строим первую программу в рамках практической работы :

Program prg1_1;

Uses Crt;

Var a,b,res : integer;

Begin

ClrScr;

WriteLn ('Введите два числа через пробел');

ReadLn (a,b);

res:= a*b;

WriteLn ('Их произведение = ', res);

ReadLn;

End.

А далее учащимся предлагается выяснить диапазон значений, при которых программа работает, вручную, т.е. методом половинного деления найти значения -32768 и 32767. Обращаем внимание на то, что по формуле Х2 – Х1 + 1 (Х2 и Х1 - границы диапазона) получается 65536, т.е. 216, отсюда делаем вывод, что для записи числа типа integer необходимо 16 бит или 2 байта памяти плюс ещё один бит на знак плюс или минус. Так же изящно разбираемся с типами ShortInt, Byte и Word, обращая внимание что два последних типа беззнаковые. Сложнее было бы найти границы диапазона для типа LongInt, здесь я ребятам предлагаю воспользоваться справочником оболочки Turbo Pascal. При таком подходе количество бит и байт памяти для записи различных типов остаётся надолго в памяти (в ребячьей, естественно).

Далее изучаем основные операции и я предлагаю учащимся модифицировать программу №1, добавив в неё все остальные изученные операции. При работе над этой программой учащиеся сталкиваются с проблемой деления данных. И сообща приходим к выводу, что делить целые (Integer) данные нельзя, нужен другой тип, тип вещественных чисел, и мы его находим – это тип Real, а из справочника узнаём, что есть ещё Single, Double, Extended, Comp. При выводе данных на экран возникает проблема количества знаков после запятой и о количестве знаков в выводимом данном. Так ненавязчиво приходим к решению использовать форматированный вывод.

Program prg1_2;

Uses Crt;

Var d,a,b,c,s,t,v : integer;

q:extended;

Begin

ClrScr;

WriteLn ('Введите два числа через пробел');

ReadLn (a,b);

c:= a*b;

WriteLn ('Их произведение = ', c);

d:= a+b;

WriteLn ('Их сумма = ', d);

s:= a-b;

WriteLn ('Их разность = ', s);

t:=a Div b;

WriteLn ('Результат целочисленного деления = ', t);

v:=a Mod b;

WriteLn ('Остаток целочисленного деления = ', v);

q:=a/b;

WriteLn ('Их частное = ', q:25:24); {Форматированный вывод}

WriteLn ('Нажмите ');

ReadLn;

End.

На следующих уроках продолжаем изучение стандартных функций и строим программу, в которой практически осваиваем их применение. В этой же программе применяем способ возведения в степень (в Turbo Pascal нет функции Z=XY, которая успешно используется в QBasic. Попутно практикуемся в форматированном выводе данных на экран.

Program prg2; {Стандартные функции}

Uses Crt;

Var x : Integer;

y : real;

Begin ClrScr;

Writeln ('введите x,y через пробел - ');

Readln (x,y);

Writeln (' cos(x)=',cos(x):6:4);

Writeln (' sin(x)=',sin(x):6:4);

Writeln (' exp(x)=',exp(x):6:4);

Writeln ('trunc(y)=',trunc(y));

Writeln ('frac(y)=',frac(y):6:4);

Writeln (' abs(x)=',abs(x));

Writeln ('sqr(x)=',sqr(x));

Writeln ('sqrt(x)=',sqrt(x):6:4);

Writeln (' arctan(x)=',arctan(x):6:4);

Writeln (' ln(x)=',ln(x):6:4);

Writeln (' pi=',pi:12:10); {Число π до 10-го знака}

Writeln ('round(y)=',round(y));

Writeln ('z:=round(exp(y*ln(x)))=',round(exp(y*ln(x))));

Readln

End.

Для закрепления умений и навыков возведения в степень я предлагаю небольшую самостоятельную работу на расчёт алгебраического выражения.

- Таких заданий я всегда готовлю в 3-4 раза больше, чем нужно на класс, т.к. многие учащиеся быстро осваивают данный способ вычисления и стараются прорешать как можно больше вариантов.

program prg3; {вычислить m=(a3+b4+c5)/a4}

uses Crt;

var a,b,c,d,e,f,g,i : byte;

h,m : real;

begin clrscr;

write('введите a, b, c через пробел'); readln(a, b, c);

d:=round(exp(3*ln(a)));

e:=round(exp(4*ln(b)));

f:=round(exp(5*ln(c)));

i:=round(exp(4*ln(a)));

g:=d+e+f;

m:=g/i;

writeln('m = ',m:6:4);

write('нажмите <Enter>'); readln;

end.

На следующей работе я предлагаю ещё один способ возведения в степень. Попутно в этой работе используем операторы цикла с параметром.

program prg3_2; {Второй способ возведения в степень}

uses crt;

var a,x,y,z : byte;

begin clrscr;

write('Введите число X, и степень этого числа Y'); readln(x,y);

z:=1; {Начальное значение числа Z (объединичивание! ячейки для результата)}

For a:= 1 To y Do

z:=z*x;

writeln('z=',z);

writeln('Для выхода нажмите <Enter>');

readln

end.

Далее переходим к разветвляющимся программам. С понятием ветвления детей даже знакомить не нужно, т.к. составная команда If … Then … Else … (полная и короткая) знакома им с 6-7 класса. Ещё раз уясняем понятие логическое выражение, вспоминаем команду безусловного перехода Goto. Далее строим программы с применением этих операторов. На эти уроки я всегда готовлю задачи на работу с цифрами числа. Это достаточно увлекательное занятие и ребята легко осваивают эту тему. Проблема «счастливого» билета нынешнему поколению практически неизвестна, т.к. они ни в автобусах, ни на трамваях не ездят, поэтому, небольшой экскурс в историю (съедание «счастливого» билета на счастье, а как же иначе добыть себе счастье) они принимают с энтузиазмом. В этой работе повторяем способы защиты «от дурака» и начинаем работать с операторами цвета.

program Bilet; {Счастливый билет}

uses crt;

Label 10; {Задаваемая метка}

var a1, a2, a3, a4, a5, a6, b : byte

n : longint;

Begin Clrscr;

10 : TextColor(2); Write ('Введите шестизначное число); ReadLn (n);

If n < 100000 Then begin {Полная команда}

TextColor(4); writeln (‘Ошибка, введите шестизначное число)’;

TextColor(2); Goto 10;

end;

a1:= n mod 10;

a2:= n div 10 mod 10;

a3:= n div 100 mod 10;

a4:= n div 1000 mod 10;

a5:= n div 10000 mod 10;

a6:= n div 100000;

If a1+a2+a3=a4+a5+a6 Then begin

TextColor(4); writeln ('Это счастливый билет!');

end;

Else begin

TextColor(11); writeln ('Это несчастливый билет!');

write ('Для повторения введите 1/0'); readln (b);

If b=1Then Goto 10; {Короткая команда}

readln;

End.

Ещё один тип программ, который я непременно ввожу (если, конечно, хватает времени) в наш курс – это подсчёт кол-ва банкнот разного достоинства для выдачи определённой суммы денег. Этот тип задач можно применять и для перевода основных единиц измерения (физика, математика, информатика и пр.) в кратные и производные. Достоинство банкнот можно задавать с клавиатуры.

program dengi;

uses crt;

var n7, ost, n18, S, n250, n700, k7, k18, k250, k700:word;

begin clrscr;

n700:=700; n250:=250; n18:=18; n7:=7; {Задание достоинства банкнот}

write('Введите сумму - '); readln(s);

ost:=s;

k700:=ost div n700; ost:=ost - k700*n700;

k250:=ost div n250; ost:=ost - k250*n250;

k18:=ost div n18; ost:=ost - k18*n18;

k7:=ost div n7; ost:=ost - k7*n7;

writeln ('Банкнот по 700 р - ', k700, ' шт');

writeln ('Банкнот по 250 р - ', k250, ' шт');

writeln ('Банкнот по 18 р - ', k18, ' шт');

writeln ('Банкнот по 7 р - ', k7, ' шт');

if ost <> 0 then writeln ('Вам должны - ', ost, 'руб.');

readln

end.

Для тех учащихся, которые «убегают вперёд», я предлагаю самостоятельно поработать с командой ветвления CaseOf {Операторы}… ElseEnd. Синтаксис этой команды очень похож на аналогичный оператор QBasic, так что эта работа вполне по силам учащимся для самостоятельного изучения.

После решения этих простых задач переходим к более сложным задачам. Сначала я предлагаю ту же программу Билет усовершенствовать и подсчитать количество «счастливых» билетов в задаваемом диапазоне. Здесь же применяем оператор GotoXY для установки курсора в нужное место экрана.

program Bilet2; {Счастливые билеты в задаваемом диапазоне}

uses crt;

label 10;

var i, a1, a2, a3, a4, a5, a6, b : byte

n1,n2, k : longint;

begin clrscr;

10 : textcolor(2); write ('Введите начало и конец диапазона через пробел');

readln (n1,n2);

if n2<=n1 then begin

textcolor(4); writeln(‘Ошибка)’; textcolor(2); goto 10;

end;

k:=0;

GotoXY(25,10); textcolor(15); writeln ('Подождите, пожалуйста!');

GotoXY(10,11); textcolor(5); writeln ('Идёт подсчёт счастливых билетов в указанном диапазоне ');

gotoxy(15,12); textcolor(3); writeln ('Число найденных счастливых билетов = ');

For i:=n1 To n2 Do begin

a1:=i mod 10;

a2:=(i div 10) mod 10;

a3:=(i div 100) mod 10;

a4:=(i div 1000) mod 10;

a5:=(i div 10000) mod 10;

a6:=(i div 100000);

if a1+a2+a3=a4+a5+a6 then k:=k+1;

GotoXY(29,13); write(k:6);

End;

GotoXY(1,20);

textcolor(4); writeln('В диапазоне от ',n1,' до ',n2,' счастливых билетов - ',k);

write ('Для повторения введите 1/0'); readln (b);

if b=1then goto 10;

readln;

end.

Существует много занимательных математических задач с цифрами числа, следующая работа как раз на решение подобных задач. В этой работе я ввожу команду Delay для возможности наблюдения за перебором. Такие задачи очень полезны для понимания самой сути программирования.

Задача на цифры числа. В данном примере все цифры заменены буквами. Считая буквы именами переменных, найдите все возможные значения, при которых данный пример был бы корректен, т.е. решался. РАК + КАР = АКР.

program cifry; {rak + kar= akr}

uses crt;

var a,k,r : byte;

n : longint;

begin clrscr;

n:=0; {Обнуление ячейки n для подсчёта суммы}

for a:=0 to 9 do {Перебор всех возможных значений а}

for k:=0 to 9 do {Перебор всех возможных значений b}

for r:=0 to 9 do {Перебор всех возможных значений r}

if (r*100+a*10+k)+(k*100+a*10+r)=(a*100+k*10+r) then begin

n:=n+1;

gotoxy(1,3); writeln(' R= ',R:3,',A= ',A:3,' ,K= ',K:3);

Delay(20000); {Задержка для просмотра перебора всех вариантов}

gotoxy(1,5); writeln(' ',r:3,a:3,k:3);

writeln('+');

writeln(' ',k:3,a:3,r:3);

writeln('______________');

writeln(' ',a:3,k:3,r:3);

end;

gotoxy(1,12); writeln('n=',n);

readln;

end.

Далее мы углубляемся в изучение операторов цикла : с предусловием (WhileDo), с постусловием (Repeat … Until). Эту часть проходим довольно быстро, останавливаясь только на принципиальном отличии двух способов организации цикла. Выясняем, что цикл с постусловием выполняется хотя бы один раз, а цикл с предусловием может не выполнится ни разу. В методической литературе описано большое количество примеров для закрепления этой темы. Мы решаем задачу на рекурсию про Незнайку.

Задача на рекурсию. Ежедневно Незнайка учит половину от суммы выученных за два предыдущих дня иностранных слов и ещё два слова. Знайка считает, что силы Незнайки иссякнут, когда нужно будет выучить 50 слов в день. Написать программу, определяющую, через сколько дней иссякнут силы у Незнайки, если в первые два дня он выучил по одному слову.

program neznajka1;

uses crt;

var d : integer;

x1,x2,n,z:real;

begin clrscr;

x1:=1; x2:=1; n:=2; d:=2;

While z <= 50 Do Begin

d := d + 1; z := (x1 + x2) / 2 + 2; n := n + z; x1:= x2; x2 := z;

end;

writeln(‘Силы Незнайки иссякнут через ’, d, ‘ дней.’);

writeln(‘В последний день он выучит’, z:0:0, ‘ слово.’);

writeln(‘Всего он выучит ‘, n:0:0, ‘ слова.’);

readln

end.

После того, как задача решена, я предлагаю применить оператор цикла с постусловием (Repeat … Until) для решения этой же задачи и сравнить результат.

program neznajka2;

uses crt;

var d : integer;

x1,x2,n,z:real;

begin clrscr;

x1:=1; x2:=1; n:=2; d:=2;

Repeat

d := d + 1; z := (x1 + x2) / 2 + 2; n := n + z; x1:= x2; x2 := z;

Until z > 50;

writeln(‘Силы Незнайки иссякнут через ’, d, ‘ дней.’);

writeln(‘В последний день он выучит’, z:0:0, ‘ слово.’);

writeln(‘Всего он выучит ‘, n:0:0, ‘ слова.’);

readln

end.

Теперь учащиеся сами могут выбирать способ организации цикла.

После окончания работы с циклами самое время перейти процедурам. Понятие подпрограмма уже известна десятиклассникам. Теоретическое обучение продолжаем по уже упомянутому выше учебнику (электронной версии). Вводим понятия :
    1. Процедура (Procedure). Пытаемся понять, что такое формальные параметры, параметры-аргументы (параметры-значения), параметры-результаты (параметры-переменные), фактические параметры, глобальные и локальные переменные.
    2. Функция (Function).
    3. Учимся объявлять процедуры и функции, вызывать их по мере необходимости.

Сначала решаем простую математическую задачу на вычисление факториала числа. После того, как программа сконструирована, некоторые учащиеся спрашивают, а нельзя ли таких программ наделать побольше, чтобы просто вызывать функцию и не строить целую программу. И тут разговор плавно переходит к созданию библиотек, игровых программ.

Для демонстрации работы процедур я ввожу задачу о монетах, принесённых подданными царю.

Задача о монетах. Царь наложил на подданных дань : первый подданный приносит 1 монету, второй в 2 раза больше чем предыдущий, третий – в 3 раза больше, и т.д. Подсчитать количество монет, принесённых последним подданным и общую сумму монет, принесённых всеми подданными. Число подданных ввести с клавиатуры.

program poddannye;

uses crt;

var n : integer;

sum : longint;

Procedure count (n : Integer);

Var m,s : longint;

i : Integer;

Begin m := 1; S := 1;

For I := 2 To n + 1 Do Begin

m := m * i; S := S + m;

End;

Writeln ('Всего монет, принесённых последним - ',m);

Writeln ('Общее количество монет - ',S);

End;

begin clrscr;

write('Сколько будет подданных - '); readln(n);

count(n);

writeln('Прг закончена!');

readln;

end.

Для более подготовленных ребят я даю возможность построить программу, в которой нужно решить эту же задачу двумя способами, причём, выбрать способ должен пользователь. Каждый год эту программу делают 2-3 человека. Совсем, мне кажется, немало.

program poddannye;

uses crt;

label 1,2;

var a, n : integer;

sum : longint;

Procedure count(n : Integer);

Var m,s : longint;

i : Integer;

Begin m:=1; S:=1;

For i:=2 To n+1 Do Begin

m:=m*i; S:=S+m;

End;

Writeln('Всего монет, принесённых последним - ',m);

Writeln('Общее количество монет - ',S);

End;

Function monety(n : Integer) : Longint;

Var m,s : Longint;

i : Integer;

Begin m:=1; S:=1;

For i:=2 To n+1 Do Begin

m:=m*i; S:=S+m;

End;

monety:=s;

End;

begin clrscr;

write('Сколько будет подданных - ');

readln(n);

write('Расчёт с использованием функции (1), процедуры (2) - ');

readln(a);

If a=1 then goto 1;

If a=2 then count(n);

goto 2;

1 : Sum:=monety(n);

writeln('Общее количество монет - ',Sum);

2 : writeln('Прг закончена!');

readln;

end.

Ну, а теперь пришла пора графических операторов. Дети (они же заранее знают учебную программу) ждут этой темы, т.к. им уже обещано, что они познакомятся с гигантскими возможностями графики Turbo Pascal. Конечно, в школьном курсе изучить, а, главное, применять все графические операторы невозможно из-за ничтожного количества часов на информатику в учебном плане. Скорее, этот раздел нужно делать отдельным элективным курсом.

Начинаем работу с изучения таблицы по самым основным операторам графики: (см. Приложение 1).

После изучения приступаем к рисованию с помощью операторов. После просмотра файла GrDemo.pas2, демонстрирующего возможности графики Turbo Pascal, и выяснения сути основных операторов я предлагаю учащимся программу «Точки Линии», повторяющую некоторые картинки GrDemo.pas, но гораздо меньшую по объёму. Строим её совместно. И вот что у нас получается (см. Приложение 2).

Далее я прошу ребят нарисовать их первую картинку. Во всех классах, на всём протяжении курса информатики я обращаю пристальное внимание на самостоятельные рисунки на свободную тему. Рисунки, конечно, разные, но так интересно наблюдать то, что рисуют дети на разных этапах, как изменяются темы рисунков. 80% детей рисуют Дом, 12% - лес, деревья, 8% человека. И совсем не обязательно то, что учащиеся художественной школы рисуют сложное – совсем не так. Ведь здесь не надо водить мышкой или карандашом, здесь работает её величество Фантазия. Как интересно, как неожиданно открывается внутренний мир учащегося! И как часто мы ошибаемся, думая, что знаем ребёнка. Раздолье для психологических наблюдений. Это продолжение домашнего задания, которое заключалось в подготовке рисунка в тетради, в системе координат

Для примера хочу показать программу Светы Шутовой, сделанной на уроке: