Главная стр 1стр 2стр 3
скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ

РОССИЙСКОЙ ФЕДЕРАЦИИ

МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ОБЛАСТНОЙ УНИВЕРСИТЕТ


Р. В. МИТИН


ОТ БЕЙСИКА К ТУРБОПАСКАЛЮ

Учебное пособие для студентов МГОУ



МОСКВА 2003


Печатается по решению кафедры ИТО и

редакционно-издательского Совета МГОУ

УДК 519.6

Учебное пособие для студентов МГОУ

" От Бейсика к Турбопаскалю. "

Москва, МГОУ, 2003 г., 73 страницы

В пособии приведены программы на языке программирования Турбопаскаль, позволяющие получить представления о некоторых возможностях языка Паскаль. Предполагается, что учащийся знаком с основными командами языка Паскаль. Материал излагается, начиная с самых простых примеров с постепенным усложнением. Приведенные в работе программы ориентированы на конкретный тип ПЭВМ – Pentium I - II, но могут быть использованы на других ПЭВМ после небольшой коррекции. Приведенные в пособии компьютерные программы составлены автором с использованием его предыдущего учебного пособия: Р.В. Митин, «Самостоятельная работа учащихся в классе компьютеров IBM», Москва, МПУ, 2001, в котором учащемуся предоставлялась возможность самостоятельно освоить язык программирования GW Бейсик. Известные недостатки языка Бейсик (использование оператора безусловного перехода, приводящее часто к программам вида «тарелки с макаронами») отсутствуют в языке Паскаль, позволяющем создавать полностью структурированные программы. Параллельно с программами на Турбопаскале приводятся аналогичные программы на языке GW Бейсик, но улучшенными в сторону большего структурирования по сравнению с предыдущим пособием автора. Нужно сказать, что работу программ на Бейсике легче объяснять, поскольку каждая строка пронумерована.

Пособие основано на опыте преподавания автором в течение ряда лет курса информатики на некоторых факультетах МГОУ.

© Автор текста и компьютерного оформления – профессор, доктор физ-мат наук Р.В. Митин, кафедра информационных технологий обучения МГОУ, 2003. Автор благодарен Ю.Р. Митину, студ. экон. фак. МГУ за полезные советы.


§ 1. ВЫЧИСЛЕНИЯ, ДИАЛОГ, ЦИКЛЫ

Пусть наша первая простая задача - найти по формуле у = значение "у" при заданном значении “х”. В этом случае программа выглядит так:

Бейсик:


5 PRINT "введи значение х"

10 INPUT X

20 PRINT "у равно";(2*X+3)/(3*X-4) (Б-1)

30 GOTO 10

40 END

Паскаль:


Program Dialog;

uses crt;

var

x,y:real;



begin (П-1)

ClrScr;


repeat

writeln('Введи значение x');

readln(x);

y:=(2*x+3)/(3*x-4);

writeln('y равно',y:5:2);

until false;

end.

Отметим, что программа (П-1) прекращает работу при вводе вместо числа х любой буквы.


Следующая задача - надо вычислить квадраты целых чисел от 1 до 20 и напечатать на экране сами числа и их квадраты. Изобразим блок-схему алгоритма этой задачи:

Рис. 1
Программа на языке Бейсик, соответствующая этому алгоритму.


10 LET N=1 пусть N=1

20 IF N>20 THEN 70 если N>20 тогда 70

30 LET S=N^2 пусть S равно N в квадрате (Б-2)

40 PRINT N,S печатай N и S

50 LET N=N+1 пусть N=N+1

60 GOTO 20 иди к 20

70 END конец
Однако в языках программирования и соответственно в Бейсике существует специальный, более простой способ для осуществления циклических программ.

Запишем снова нашу программу, но уже в новом виде:


10 FOR N=1 TO 20 для N от 1 до 20

20 PRINT N,N^2 печатай N и N2 (Б-3)

30 NEXT N следующее N

40 END конец


На языке Паскаль эта программа выглядит так:

Program Kvadrat;

uses crt;

var


n:integer;

begin (П-3)

ClrScr;

for n:=1 to 20 do



writeln(n:2, n*n:6);

readln;


end.
Продемонстрируем теперь возможности ПЭВМ в выполнении быстрых и довольно сложных вычислений.
Требуется решить такой пример:

X6 +46 +86 +86 +36 +46 =X48834


Надо найти такое число "X" в интервале 1-9, которое было бы решением примера. Решить этот пример, даже пользуясь микрокалькулятором, довольно сложно. Для ПЭВМ же достаточно написать простую программу, и ответ будет получен через несколько секунд при ее исполнении.
Итак, эта программа на Бейсике:
10 FOR X=1 TO 9

20 PRINT X^6+4^6+8^6+8^6+3^6+4^6,

30 PRINT X*100000+48834

40 NEXT X (Б-4)

50 END
И на Паскале:

Program Stepen;

uses crt;

var


x:integer;

z,z1:longint;


function Step(n:integer;u:longint):longint;

var


i:integer;

y:longint;

begin

y:=1;


for i:=1 to n do

y:=y*u;


Step:=y;

end;
begin

ClrScr;

z:=2*Step(6,4)+2*Step(6,8)+Step(6,3); (П-4)


for x:=1 to 9 do

begin


z1:=Step(6,x)+z;

writeln(x,z1:14,x*100000+48834:14);

end;

writeln('Решение - х=5':20);



readln;

end.
Сравнивая (Б-4) и (П-4), видим, что программа на Бейсике гораздо проще, преимуществом Бейсика является возможность быстрой записи операции возведения в степень, такого нет в языке Паскаль. Результаты работы программ (Б-4) и (П-4) аналогичны, ответ Х=5.

Рассмотрим теперь пример, который покажет, что хотя ЭВМ считает быстрее, хороший ученик все равно остается умнее ее.

Задача - сосчитать сумму целых чисел от 1 до 100. Машина решит эту задачу с помощью программы:


Бейсик:

10 LET S=0

20 FOR N=1 TO 100

30 LET S=S+N

40 NEXT N (Б-5)

50 PRINT S

60 END

RUN


5050
Паскаль:

Program Summa;

uses crt;

var


n,s:integer;
begin (П-5)

ClrScr;


s:=0;

for n:=1 to 100 do

s:=s+n;

writeln(s);



readln;

end.
Таким образом, машина просто, тупо и быстро сложит все числа одно за другим. Умный же ученик поступит так:

100

1+99=100


2+98=100

3+97=100 100+49х100+50=5050

. . .

47+53=100



48+52=100

49+51=100

50
Попробуем теперь использовать операторы организации цикла для печати на экране ПЭВМ школьной таблицы умножения.

Бейсик:


10 FOR A=2 TO 9

20 FOR B=2 TO 5

30 PRINT B;"x";A;"=";A*B,

40 NEXT B

50 NEXT A

55 PRINT (Б-6)

60 FOR A=2 TO 9

70 FOR B=6 TO 9

80 PRINT B;"x";A;"=";A*B,

90 NEXT B

100 NEXT A

110 END
Паскаль:

Program Tablica;

uses crt;

var

a,b:integer;


begin

ClrScr;


for a:=2 to 9 do (П-6)

begin


for b:=2 to 5 do

write(b,'x',a,'=',a*b:2,' '); {14 пробелов}

end;

writeln;


for a:=2 to 9 do

begin


for b:=6 to 9 do

write(b,'x',a,'=',a*b:2,' '); {14 пробелов}

end;

readln;


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

Бейсик:


5 RANDOMIZE (TIMER)

10 LET X=RND(1)*6+1

20 LET A=INT(X)

30 PRINT A (Б-7)

40 END
Паскаль:

Program Kosti;

uses crt;

var


a,n:integer;
begin

ClrScr;


randomize; (П-7)

repeat


writeln('Введи значение n'); {n=6 - бросание игральной кости}

readln(n);

a:=random(n)+1;

writeln('a равно ',a);

until false;

end.
И ещё один вариант на Паскале:

Program Kosti;

uses crt;

var

a,n:integer;


begin (П-7а)

ClrScr;


randomize;

while true do

begin

writeln('Введи значение n');



readln(n);

a:=random(n)+1;

writeln('a равно ',a);

end;


end.

Теперь мы сможем составить простую программу, которая данное "бросание костей" использует для контроля знаний ученика. Имеется в виду умение перемножать числа.

Вот эта программа:

Бейсик:


5 RANDOMIZE (TIMER)

10 LET A=INT(RND(1)*10+1) (любое число из 1-10)

20 LET B=INT(RND(1)*20+1) (любое число из 1-20)

30 LET C=A*B

40 PRINT "Сколько получится, если перемножить числа" (Б-8)

50 PRINT A,B

60 INPUT X

70 IF X=C THEN PRINT"Правильно": ELSE PRINT"Неверно"

80 GOTO 5

90 END
Паскаль:

Program Proizvedenie;

uses crt;

var

a,b,c,x:integer;


begin

ClrScr;


randomize;

while true do

begin (П-8)

a:=random(10)+1;

b:=random(20)+1;

c:=a*b;


writeln('Сколько получится, если перемножить числа ', a:3,b:3);

readln(x);

if x=c then writeln('Правильно ') else writeln('Неверно');

end;


end.

§ 2 ПОЗНАВАТЕЛЬНЫЕ ИГРОВЫЕ ПРОГРАММЫ


Рассмотрим теперь несколько игровых программ. Эти игры, однако, потребуют определенных полезных размышлений, то есть это познавательные игры.

Итак, игра - Угадай число.

Бейсик:

5 RANDOMIZE (TIMER)



10 A=INT(RND(1)*100+1)

20 K=1: N=100: L=0

30 PRINT "Угадай целое число, загаданное ЭВМ"

40 PRINT "Число находится в интервале"

50 PRINT K,N (Б-9)

60 WHILE B>

70 INPUT B: L=L+1

80 IF B>A THEN PRINT K,B: N=B

90 IF B
100 WEND

110 PRINT "Угадал с "L"-го раза"

120 END
Паскаль:

Program Ugadai;

uses crt;

var


a,b,k,n,l:integer;
begin

ClrScr;


randomize; (П-9)

a:=random(100)+1;

k:=1;n:=100;l:=0;

writeln('Угадай целое число, загаданное ЭВМ ');

writeln('Число находится в интервале 1 100');

repeat


writeln('? ');

readln(b);

l:=l+1;

if b>a then begin writeln(k:3, b:4); n:=b; end;



if b
until b=a;

writeln('Угадал с ', l,' раза');

readln;

end.
Следующие три программы построены по тем же простым алгоритмам, которыми мы пользовались, когда изучали программируемый микрокалькулятор.


Итак, программа игры - Артиллерия.

Бейсик:


10 L1=1000: N=0: S=20: L2=2000

20 WHILE (L-L1)*(L-L1)>=S

30 INPUT A: N=N+1 (Б-10)

40 R=3.1416*A/180: L=L2*SIN(2*R)

50 PRINT "Перелет (недолет) на "L-L1" метров"

60 WEND


70 PRINT"Попал с "N"-го раза"

80 END


В строке 10 L1 это расстояние до цели, N будет считать число выстрелов, S -площадь поражения цели, L2 -максимальная дальность стрельбы вашей пушки. В строке 30 ЭВМ запрашивает угол А - угол возвышения (в градусах) и производится выстрел. В сроке 40 градусы переводятся в радианы, и вычисляется дальность полета снаряда для данного выстрела. При попадании снаряда внутрь площади поражения игра заканчивается, иначе отмечается перелет или недолет (положительное или отрицательное значение числа (L-L1)) и запрашивается новое значение угла А (цикл WHILE WEND). Отметим, что в языке Бейсик углы должны быть в радианах. Условия вашей стрельбы можно изменить, изменив значения исходных данных L1, S, L2.
Паскаль:

Program Artillerija;

uses crt;

var


n:integer;

l,l1,l2,s,a,r:real;

begin

l1:=1000;l2:=2000;s:=20;n:=0; (П-10)



ClrScr;

writeln('Артиллерия':40);

writeln(' Цель находится от вашей пушки на расстоянии 1000 м.');

writeln(' Ваша пушка стреляет не дальше 2000 м.');

writeln('Начинайте стрелять!':40);writeln;

writeln(' Введи угол возвышения (0 - 90 градусов)');

while (l-l1)*(l-l1)>=s do

begin


writeln('?');

readln(a); n:=n+1;

r:=pi*a/180; l:=l2*sin(2*r);

writeln('Взрыв от цели на ', (l-l1):3:1, ' метров');

end;

writeln('Попал с ', n,'-го раза');



readln;

end.
Следующая программа - Танковая атака.

Бейсик:

10 L1=1000: L2=1000: S=50: V=10: T=9

20 WHILE (L-L1)*(L-L1)>=S

30 INPUT A: L1=L1-V*T (Б-11)

40 R=3.1416*A/180: L=L2*SIN(2*R)

50 IF L1<0 THEN PRINT "Проиграл": GOTO 90

60 PRINT "Промах", (L-L1), L1

70 WEND


80 PRINT "Победа!"

90 END


В этой игре вы стреляете по движущемуся на вас танку. В строке 10 задаются первоначальное расстояние до танка, максимальная дальность стрельбы (при угле 45 градусов), площадь поражения (м2) скорость движения танка (м/сек), промежуток времени между вашими выстрелами (в нашем случае мы выбрали 9 сек). В строке 30 - выбор угла А для выстрела и уменьшение расстояния до танка. Окончание игры - либо при вашем попадании, либо поражении, танк "давит" вашу пушку - строка 50.

Паскаль:


Program Tank;

uses crt;

var

v,t:integer;



l,l1,l2,s,a,r:real;

begin


l1:=1000;l2:=1000;s:=50;v:=10;t:=9; (П-11)

clrscr;


writeln('Танковая атака':40);

writeln(' На вас движется танк, вы стреляете по нему из пушки.');

writeln(' Начальное расстояние до танка - 1000 м.');

writeln(' Ваша пушка стреляет не дальше, чем на 1000 м.');

writeln('Начинайте сражение!':40);writeln;

writeln(' Введи угол возвышения (0 - 90 градусов)');

while (l-l1)*(l-l1)>=s do

begin


writeln('?');

readln(a); l1:=l1-v*t;

r:=pi*a/180; l:=l2*sin(2*r);

if l1<=0 then begin writeln('Проиграл!');readln;halt; end;

writeln('Взрыв от цели на ',(l-l1):3:1,' м., до танка ',l1:4:1,' м.');

end;


writeln('Победа!');

readln;


end.
Наконец, приведем программу - Посадка на Луну:

Бейсик:


10 M=90: H=50: V=8

20 WHILE H>=1

30 PRINT INT(M), INT(H), INT(V)

40 IF M>0 THEN INPUT Z ELSE M=0: Z=0 (Б-12)

50 A=1.62-Z*0.045: M=M-Z*0.15

60 H=H-V-A/2: V=V+A

70 WEND

80 IF V<=2 THEN PRINT "Посадка!" ELSE PRINT "Авария!"



90 END

В строке 10 задаются исходные данные: горючее - 90 кг, высота - 50 м, скорость движения ракеты к Луне - 8 м/сек. Строка 40 - вы должны выбрать и ввести величину тяги двигателя (меняется в пределах 1-100, проценты от максимальной тяги). В строках 50,60 используются простые формулы для изменения ускорения, массы горючего, высоты над поверхностью Луны и скорости ракеты через одну секунду полета при выбранной тяге Z. Строка 80 определяет условия удачной посадки ракеты на Луну (высота меньше 1 метра, скорость меньше 2 м/сек). Строка 40 учитывает также тот случай, когда вы сожгли все горючее, плохо управляя работой двигателя, тогда, конечно, тяга равна нулю и ракета летит неуправляемо под действием только силы тяготения Луны, пока ракета не разобьется.

Паскаль:

Program Kosmo;

uses crt;

var


v,m,z,h,a:real;

n:integer;


begin

ClrScr;


v:=8;m:=90;z:=0;h:=50;n:=0; (П-12)

writeln('Мягкая посадка':40);

writeln(' Вы управляете Лунным модулем (ракетой), ваша задача -');

writeln(' тормозя, посадить модуль на поверхность Луны без аварии.');

writeln(' Запас горючего ограничен');writeln;

writeln('Поехали!':40);

repeat

writeln;


write('Горючее ',m:5:1,' кг, ','высота ',h:5:1,' м, ');

write('скорость ',v:5:1,' м/сек');


if m>0 then

begin writeln;writeln('Тяга? (0 - 100)');read(z);end

else begin m:=0; z:=0; end;

a:=1.62-z*0.045; m:=m-z*0.15; h:=h-v-a/2; v:=v+a; n:=n+1;

until h <1;

readln;


if v<=2 then

writeln('Мягкая посадка!')

else begin writeln;writeln('Вы разбились!');end;

readln;


end.
Набрав эти простые программы, можно легко и быстро проверить свое умение управлять таким сложным аппаратом, как ракета возле Луны. Поскольку все формулы движения ракеты используются реальные, то и наш полет максимально приближен к реальной обстановке.
§ 3. "ГРАФИКА" БЕЗ ГРАФИЧЕСКИХ ОПЕРАТОРОВ
Для рисования графических изображений (рисунков, кривых, графиков и т.п.) обычно используют так называемые графические операторы языков Бейсик и Паскаль. К рассмотрению этих операторов мы перейдем несколько позже, а сейчас посмотрим, как можно "рисовать" на экране ПЭВМ, применяя уже известные нам операторы.

Приведем один простой пример рисования синусоиды:

Бейсик:

5 FOR X=0 TO 40: PRINT"-";: NEXT X

10 FOR X=0 TO 15 STEP 0.5 (Б-13)

20 PRINT "I": PRINT TAB(30+15*SIN(X));"*"

30 NEXT X

40 END


Паскаль:

Program Sinusoida;

uses crt;

var


n:integer; (П-13)

begin


ClrScr;

for n:=1 to 22 do

begin gotoXY((30+round(8*(sin(n)))),n); write('*'); delay(800); end;

readln;


end.
Более полно возможности такого способа рисования без графических операторов покажем на примере нескольких контролирующе-обучающих и игровых программ.

В (Б-14) приведено начало программы на Бейсике, проверяющей знания ученика по астрономии. Программа содержит 8 вопросов, требуется ответить на 4 из них, номера вопросов произвольным образом выбираются компьютером. На экране дисплея по мере прохождения программы появляются изображения созвездий. Ученик должен указать правильное имя созвездия. В командах 102-107 с помощью оператора PRINT TAB на экране дисплея формируется изображение созвездия Кассиопея.


Аналогичным образом построены изображения других созвездий в оставшихся семи вопросах, переход к этим вопросам производится с помощью так называемого переключателя ON GOSUB в строке 80 нашей программы.
3 CLS

5 K=0: L=0: DIM M(4)

6 RANDOMIZE(TIMER)

7 PRINT TAB(20)"АСТРОНОМИЯ": PRINT (Б-14)

8 DIM A(8)

10 PRINT TAB(10)"в программе имеется 8 вопросов": PRINT

15 PRINT TAB(8)"вам нужно ответить на 4 вопроса"

17 PRINT" (варианты ответов предлагаются)"

20 WHILE T<8

30 IF K=4 THEN GOSUB 900: PRINT ”Следующий.”: K=0:L=0

40 N=INT(1+8*RND(1))

50 WHILE A(N)=1: N=INT(1+8*RND(1)): WEND

60 A(N)=1

70 T=T=1: K=K+1: M(K)=N

80 ON N GOSUB 100,200,300,400,500,600,700,800

95 WEND


98 GOSUB 900

99 PRINT" ДО СВИДАНЬЯ!": END

100 PRINT" ВОПРОС №1"

101 PRINT:PRINT

102 PRINT TAB(14)"+"

103 PRINT:PRINT:PRINT:PRINT

104 PRINT TAB(18)"+",TAB(28)"*"

105 PRINT TAB(43)"*"

106 PRINT:PRINT:PRINT

107 PRINT TAB(32)"*"

108 PRINT:PRINT

110 PRINT "варианты - 1)Лев, 2)Орион, 3)Кассиопея, 4) Дельфин"

120 WHILE V<>3

130 INPUT V

140 IF V<>3 THEN PRINT"неверно, еще раз-": L=L+1

150 WEND


160 PRINT"правильно": RETURN

200 PRINT" ВОПРОС №2"

и так далее...

900 PRINT"номера ваших вопросов -";:

910 FOR K=1 TO 4: PRINT M(K): NEXT K: PRINT"всего ошибок -"L"

920 IF L=0 THEN PRINT" отлично"

930 IF L=1 THEN PRINT" неплохо"

940 IF L>=4 THEN PRINT"вам надо поучиться"

950 IF L<4 THEN IF L>=2 THEN PRINT" слабовато"

960 RETURN


K - считает вопросы, на которые вы отвечаете, L - считает ошибки, допущенные вами при ответах. Об этом и сообщается вам в конце работы при помощи подпрограммы 900. M(K) - информационный массив, в который записываются номера выбранных вопросов, они сообщаются вам в конце работы.

В строке 40 номер вопроса задается случайным образом, строки 50 и 60 не позволяют снова задать тот вопрос, который уже задавался раньше.

В программе предусмотрены возможности разнообразия выбора правильного ответа - иногда нужно определить правильный ответ из вариантов ответа, последовательно появляющихся на экране, иногда нужно просто самому напечатать правильный ответ. Первый случай осуществится, если, к примеру, в вопросе №1 строки после 108-й записать так:

110 PRINT "ЛЕВ"

112 INPUT N: IF N=1 THEN PRINT"неверно": L=L+1

114 PRINT "ОРИОН" (А)

116 INPUT N: IF N=1 THEN PRINT"неправильно": L=L+1

118 PRINT "ДЕЛЬФИН"

120 INPUT N: IF N=1 THEN PRINT"ошибка": L=L+1

122 PRINT "КАССИОПЕЯ"

124 INPUT N: IF N=1 THEN PRINT"верно" ELSE PRINT "неверно, правильный ответ - КАССИОПЕЯ": L=L+1:RETURN

В (А) предполагается, что ответ - да - соответствует нажатию 1 (N=1), а ответ – нет - нажатию другой цифры (например, 0).

Во втором случае строки будут выглядеть так:

120 M=0


125 WHILE N$<>"КАССИОПЕЯ"

122 INPUT N$ (Б)

124 IF N$<>"КАССИОПЕЯ" THEN IF M<2 THEN PRINT"ошибка, попробуйте еще раз": M=M+1: L=L=1 ELSE PRINT"неверно, правильный ответ - КАССИОПЕЯ"

126 WEND

128 PRINT"Правильно": RETURN

В (Б) мы используем строковую переменную (N$).


Приведем полный текст аналогичной программы Астрономия на языке Паскаль:

Program Astronom;

uses crt; (П-14)

var


m1,n,t,k,v,v1,i,l:integer;

v5:string[10];

m:array[1..5] of integer;

a:array[1..8] of integer;


procedure Vopros1;

begin


writeln;writeln; writeln; writeln;

writeln('Вопрос №1':40);for i:=1 to 4 do writeln;

writeln('+':24);for i:=1 to 4 do writeln;

writeln('+':28,'*':10);writeln('*':53);

for i:=1 to 3 do writeln;writeln('*':42);

for i:=1 to 3 do writeln;

writeln('Варианты ответов -');

writeln('1)Сев. корона, 2)Дельфин, 3)Орион, 4)Кассиопея');

repeat

writeln('?');readln(v);



if v<>4 then begin writeln('Неверно');l:=l+1;end;

until v=4;

writeln('ПРАВИЛЬНО');readln;

end;
procedure Vopros2;

begin

writeln;writeln; writeln; writeln;



writeln('Вопрос №2':40); writeln;

writeln('.':60); writeln; writeln('+':65); writeln('+':49);

writeln; writeln; writeln('*':18,'.':8,'*':21);

writeln; writeln; writeln('+':53); writeln;

writeln('+':10); writeln('*':4); writeln('*':54);

for i:=1 to 3 do writeln;

repeat

writeln('Кассиопея'); writeln('? (да - 1, нет - 0)');readln(v);



if v=1 then begin writeln('Неверно');l:=l+1;end;

writeln('Орион'); writeln('?');readln(v);

if v=1 then begin writeln('Ошибка');l:=l+1;end;

writeln('Лебедь'); writeln('?');readln(v);

if v=1 then begin writeln('Неправильно');l:=l+1;end;

writeln('Лев'); writeln('?');readln(v);

if v=1 then begin writeln('ВЕРНО'); v1:=99; end

else begin writeln('Неверно, правильный ответ - Лев');l:=l+1; v1:=99;end;

until v1=99; readln;

end;
procedure Vopros3;

label

metka;


var

m1:integer;

begin

writeln;writeln; writeln; m1:=0;



writeln('Вопрос №3':40);

for i:=1 to 3 do writeln;

writeln('+':37); writeln('*':28); writeln('*':42);

for i:=1 to 6 do writeln; writeln('+':38);

writeln('*':35); writeln('+':32);

for i:=1 to 4 do writeln; writeln('.':43);

writeln('.':40,'*':4); writeln('+':28);

repeat


writeln('Напишите имя созвездия'); readln(v5);

if v5<>'Орион' then if m1<2 then

begin writeln('Неправильно, попробуйте еще раз');l:=l+1; m1:=m1+1;end

else


begin writeln('Неверно, правильный ответ - Орион');goto metka;end;

until v5='Орион'; writeln('ПРАВИЛЬНО');

metka:readln;

end;
procedure Vopros4;

begin

writeln;writeln; writeln;



writeln('Вопрос №4':40);

for i:=1 to 7 do writeln;

writeln('+':44); writeln('.':23); writeln;

writeln('+':48); writeln; writeln('+':24); writeln;

writeln('.':30,'+':6,'*':6);

for i:=1 to 3 do writeln;

writeln('Варианты ответов -');

writeln('1)Лев, 2)Сев. корона, 3)Орион, 4)Кассиопея');

repeat

writeln('?');readln(v);



if v<>2 then begin writeln('Ошибка');l:=l+1;end;

until v=2;

write('ВЕРНО');readln;

end;
procedure Vopros5;

begin

writeln;writeln; writeln;



writeln('Вопрос №5':40);

for i:=1 to 5 do writeln;

writeln('.':25); writeln('*':59);

for i:=1 to 3 do writeln; writeln('.':5);

writeln('.':13,'*':4,'*':10,'+':12,'*':22);

writeln('.':68); writeln('+':5); writeln('*':46);

for i:=1 to 5 do writeln;

repeat


writeln('Кассиопея'); writeln('? (да - 1, нет - 0)');readln(v);

if v=1 then begin writeln('Неверно');l:=l+1;end;

writeln('М. медведица'); writeln('?');readln(v);

if v=1 then begin writeln('Ошибка');l:=l+1;end;

writeln('Лебедь'); writeln('?');readln(v);

if v=1 then begin writeln('Неправильно');l:=l+1;end;

writeln('Б. медведица'); writeln('?');readln(v);

if v=1 then begin writeln('ПРАВИЛЬНО'); v1:=99; end

else begin writeln('Неверно, это - Б. медведица');l:=l+1; v1:=99;end;

until v1=99;readln;

end;
procedure Vopros6;

begin


writeln;writeln; writeln;

writeln('Вопрос №6':40);

writeln; writeln('*':36); writeln;

writeln; writeln;

writeln('+':32); for i:=1 to 3 do writeln;

writeln('+':30); for i:=1 to 3 do writeln;

writeln('+':31); writeln('+':26,'.':14);

writeln('.':38); writeln('*':36);

writeln; writeln('+':31,'.':1);

writeln('Варианты ответов -');

writeln('1)Лебедь, 2)М. медведица, 3)Б. медведица, 4)Дельфин');

repeat


writeln('?');readln(v);

if v<>2 then begin writeln('Неверно');l:=l+1;end;

until v=2;

writeln('ВЕРНО');readln;

end;

procedure Vopros7;



label

metka;


var

m1:integer;


begin

writeln;writeln;writeln;m1:=0;

writeln('Вопрос №7':40);

writeln('+':50); writeln('+':48); writeln('.':47);

writeln; writeln; writeln('*':34,'+':12,'.':2);

for i:=1 to 3 do writeln; writeln('+':38);

writeln; writeln; writeln('.':32); writeln('.':44);

writeln; writeln('*':32); writeln('.':50);

writeln('+':22); writeln('+':54); writeln;

repeat


writeln('Напишите имя созвездия'); readln(v5);

if v5<>'Лебедь' then if m1<2 then

begin writeln('Неверно, попробуйте еще раз');l:=l+1;m1:=m1+1;end

else


begin writeln('Неверно, правильный ответ - Лебедь');goto metka;end;

until v5='Лебедь'; writeln('ПРАВИЛЬНО');

metka: readln;

end;
procedure Vopros8;

label

metka;


var

m1:integer;


begin

for i:=1 to 4 do writeln;

writeln;writeln;writeln;m1:=0;

writeln('Вопрос №8':40);

for i:=1 to 4 do writeln;

writeln('.':34); writeln('.':40); writeln('.':36);

writeln('+':42,'.':1); for i:=1 to 2 do writeln; writeln('.':46);

writeln; writeln('+':47); writeln;

writeln('.':44);

repeat


writeln('Напишите имя созвездия'); readln(v5);

if v5<>'Дельфин' then if m1<2 then

begin writeln('Ошибка, попробуйте еще раз');l:=l+1;m1:=m1+1; end

else


begin writeln('Неверно, правильный ответ - Дельфин');goto metka;end;

until v5='Дельфин'; writeln('ВЕРНО');

metka: readln;

end;
procedure Ocenka;

begin

writeln;


write('Номера ваших вопросов -');

write(m[1]:2,m[2]:2,m[3]:2,m[4]:2);

writeln(', Вы допустили ошибок -',l:3); writeln;

if l=0 then writeln('Отлично');

if l=1 then writeln('Неплохо');

if l>=4 then writeln('Вам надо поучиться');

if (2<=l) and (l<4) then writeln('Слабовато');

writeln;


end;
begin

ClrScr;


writeln('Созвездия':30);

writeln('В программе имеется 8 вопросов':40);

writeln('Вам нужно ответить на 4 вопроса, номера которых выберет ЭВМ');

readln;


randomize;

repeat


n:=random(8)+1;

while a[n]=1 do begin n:=random(8)+1; end;

a[n]:=1;

k:=k+1; m[k]:=n;

t:=t+1;

if k=5 then begin ocenka; k:=1; l:=0; m[1]:=m[5];



writeln('Следующий раунд.'); readln; end;

case n of

1: Vopros1;

2: Vopros2;

3: Vopros3;

4: Vopros4;

5: Vopros5;

6: Vopros6;

7: Vopros7;

8: Vopros8;

end;

until t=8;



ocenka;

readln;


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

Рис. 2


Рис. 3

Рис. 4
Подобным образом могут быть составлены программы для проверки знаний и по другим предметам (геометрия, география - контуры государств на карте, контуры островов, озер и т.п.), ботаника (изображения растений), черчение, зоология (изображения животных, насекомых) и так далее.

Следующая программа Скорпион (Б-15) основана на простой физической задаче движения брошенного тела по параболе под действием силы тяжести. Охотник, стоящий на вершине скалы, должен бросить камень и попасть в скорпиона, бегающего внизу и стремящегося спрятаться под скалой. В строке 20 программы (Б-15) величины X1 и S1 задают размеры изображения на экране, величина N считает броски охотника и тем самым отмеряет время с начала "охоты". Подпрограмма (160) "рисует" на экране изображение охотника. Строка 30 изображают при помощи простой формулы "скалу". Строка 40 обращается к подпрограмме рисования изображения "скорпиона". Команды 50, 70 осуществляют диалог с учеником с целью задания исходных данных задачи (выбор скорости скорпиона и силы броска охотника). Команда 180 рисует траекторию камня и одновременно профиль обрыва скалы. Траекторию камня – параболу (формулу в строке 180) легко представить в виде

Y+1=Const (X-L1)2.

Программа на языке Бейсик:

10 CLS

20 X1=12: S1=60: N=1: GOSUB 160



30 FOR X=0 TO X1: L=9-9*SQR(X/X1): PRINT TAB(L) “Щ”: NEXT X

40 S=60: GOSUB 170

50 PRINT ” Скорость скорпиона? (0-1-2-3)“: INPUT U (Б-15)

60 WHILE ABS(Y1-S-2)>2

70 PRINT ” Сила броска? (0-100)”: INPUT F

80 L4=10: L3=0.5: X2=2: Y1=L4+F*L3*SQR((X1+X2)/L4)

90 GOSUB 160:GOSUB 180:N=N+1:S=S1-N-U*5:GOSUB 170

100 IF ABS(Y1-S-2)>2 THEN IF S>=5 THEN PRINT “Промах!” ELSE PRINT “Неудача!”: GOTO 130

110 WEND

120 PRINT “Попал! Молодец!”

130 END

160 PRINT TAB(7) “ *”: PRINT TAB(7) “<&+-“: PRINT TAB(7) “/> o”:



PRINT”ПППППППППП”: RETURN

170 PRINT TAB(S) “>- <<<”: PRINT TAB(S) “ >OOO=----,“: PRINT TAB(S) “>- <<<”: RETURN

180 FOR X=0 TO X1: Y=L4+F*L3*SQR((X+X2)/L4): L=9-9*SQR(X/X1): PRINT TAB(L) “Щ”; TAB(Y) “о”: NEXT X:RETURN

Та же программа на языке Паскаль:

Program Scorpion;

uses crt;

label (П-15)

metka;


var

x,x1,y,y1,l,s,f,u,n:integer;


procedure voin;

begin


writeln(' O':9);

writeln('<@+-':11);

writeln('/> o':11);

writeln('ППППППППП');

end;
procedure scorp;

begin


writeln('>- <<<':s);

writeln(' >000=----,':s+6);

writeln('>- <<<':s);

end;
procedure bros;

begin

for x:=5 to x1 do



begin

y:=round(11+f*0.5*sqrt((x-2)/10));

l:=9-round(25*sqrt(x-5)/15);

writeln('Щ':l,'o':y-l); delay(800);

end;

end;
begin



ClrScr;

writeln('СКОРПИОН':40);

writeln(' Вы стоите на краю скалы, под вами внизу скорпион стремится');

writeln(' убежать под скалу. Ваша задача - попасть в него камнем.');

writeln;

voin;


x1:=15;

s:=60; n:=0;

for x:=5 to x1 do

begin


l:=9-round(25*sqrt(x-5)/15);

writeln('Щ':l); delay(800)

end;

scorp;


writeln('Скорость скорпиона? (0-1-2-3)');

read(u);


repeat

writeln('Сила броска? (0-100)');

read(f);

y1:=round(11+f*0.5*sqrt((x1-2)/10));

voin;

bros;


n:=n+1;

s:=s-n*u*3;

scorp;

readln;


if abs(y1-s+3)>2 then if s>=10 then writeln('Промах, кидай еще раз!');

if s<10 then begin writeln('Неудача!..'); goto metka; end;

until abs(y1-s+3)<=2;

writeln('Попал! Молодец!');

metka:

readln;


end.
На следующем рисунке приведен один из кадров программы Скорпион.

Рис. 5
Программы подобного типа могут быть легко составлены для решения похожих задач на уроках физики и астрономии.

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

Рассмотрим теперь программу Космодром (Б-16). По сравнению с упрощенным вариантом, рассмотренным ранее, ниже приведенная программа усилена изображениями звездного неба и летящей ракеты, таким образом, диалог с ПЭВМ иллюстрируется "диафильмом", рисующим на экране отдельные кадры полета ракеты к поверхности Луны.

Бейсик:

10 CLS: V=8: M=90: H=50: N=0: Z=5: L=14

20 WHILE L>=1

30 K=INT((Z+33)/35): Y=14: R=10: L=INT(H*Y/50): S=41-20*COS(N*3.1416/5)

40 GOSUB 400

50 IF L<=K THEN GOSUB 800 ELSE IF K>0 THEN GOSUB 500: GOSUB 600: GOSUB 700 ELSE

GOSUB 500: GOSUB 700

60 GOSUB 1000 (Б-16)

70 IF M>0 THEN PRINT”Тяга двигателя? (0 – 100)”:INPUT Z ELSE M=0: Z=0

80 A=1.62–Z*0.045: M=M-Z*0.15: H=H-V-A/2: V=V+A: N=N+1

90 WEND

100 IF V<=2 THEN GOSUB 400: GOSUB 500: GOSUB 1000: PRINT”Мягкая посадка!” ELSE



GOSUB 400: GOSUB 900: GOSUB 1000: PRINT”Вы разбили корабль!”

110 END


400 PRINT TAB(40)"+": PRINT TAB(52)”.”: PRINT TAB(15)”+”: PRINT

410 PRINT TAB(25)".": PRINT TAB(58)"*": PRINT: PRINT: PRINT: PRINT TAB(5)"."

420 PRINT TAB(13)”.”; TAB(17)”*”; TAB(27)”*”; TAB(39)”+”; TAB(61)”*”

430 PRINT TAB(68)”.”: PRINT TAB(5)”+”: PRINT TAB(46)”*”

440 G=65*EXP(-N/6): PRINT TAB(G)”-ooo-“: PRINT TAB(G)” # # “: PRINT

450 RETURN

500 PRINT TAB(R)”О”: PRINT TAB(R)”Ж”: RETURN

600 FOR X=1 TO K: PRINT TAB(R)”#”: NEXT X: RETURN

700 FOR I=1 TO (L-K): PRINT: NEXT I

800 PRINT TAB(R-2)” О”: PRINT TAB(R-2)” Ж”: PRINT TAB(R-2)”@*#*@”: RETURN

900 PRINT TAB(R-2)” \!/”: PRINT TAB(R-2)”@-*-@”: RETURN

1000 PRINT TAB(0)”ППППППППППППППППП”; TAB(S)”

1010 PRINT TAB(0)”ППППППППППППППППП”; TAB(S)”* * * * *”

1020 PRINT”&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&”

1030 M1=INT(M): H1=INT(H): V1=INT(V*10)/10

1040 PRINT ”Горючее - ”; M1; ”кг, высота - ”; H1; ”м, скорость - ”; V1; ”м/сек”

1050 RETURN
Сравнивая программу (Б-16) с программой Посадка на Луну (Б-12), видим, что главные отличия заключаются в наличии подпрограмм с изображением звездного неба, ракеты с реактивной струёй и "пустого" пространства высотой L под нею. Добавлены также НЛО и Луноход для оживления.
Приведём теперь аналогичную программу на языке Паскаль:

Program Kosmodrom;

uses crt;
var (П-16)

v,m,z,h,g,a:real;

n,l,r,y,k,x,i,s:integer;
procedure nebo;

begin


writeln('+':40);writeln('.':52);

writeln('+':15);writeln;

writeln('.':25);writeln('*':58);writeln;

writeln;writeln;writeln('.':5);

writeln('.':13,'*':4,'*':10,'+':12,'*':22);

writeln('.':68);writeln('+':5);writeln;writeln('*':47);

g:=65*exp(-n/6);writeln('-oOo-':round(g+5));

writeln(' ^ ^ ':round(g+5));writeln;

end;
procedure modul;

begin


writeln(' o ':r);

writeln('/|\':r);

writeln('\_/':r);

end;
procedure tjaga;

begin

for x:=1 to k do



writeln(' ^ ':r);

end;
procedure pusto;

begin

for i:=1 to (l-k) do



writeln;

end;
procedure posadka;

begin

writeln(' o ':r+1);



writeln(' /|\ ':r+1);

writeln(' \_/ ':r+1);

writeln('@-^-@':r+1);

end;
procedure bum;

begin

writeln('. * ,':r+1);



writeln(' \|/ ':r+1);

writeln('&>*<&':r+1);

end;
procedure luna;

begin


writeln('ПППППППППППППППППП':18,'':s);

writeln('ПППППППППППППППППП':18,'* * *':s);

for i:=1 to 74 do write('&');

writeln;


write('Горючее ',m:5:1,' кг, ','высота ',h:5:1,' м, ');

write('скорость ',v:5:1,' м/сек');

end;
begin

ClrScr;


writeln('КОСМОДРОМ НА ЛУНЕ':40);

writeln(' Вы управляете полетом лунного модуля. Ваша задача - ');

writeln(' совершить мягкую посадку на поверхность Луны.');

writeln(' Независимо от вас производит посадку НЛО,');

writeln(' по космодрому движется луноход.');

readln;


r:=10;v:=8;m:=90;z:=0;h:=50;n:=0;a:=1.62;

repeat


k:=round(z/30); l:=round(h*14/50); s:=24-round(20*cos(n*pi/5));

nebo;


if l<=k then posadka else if k>0 then

begin modul;tjaga;pusto;end else begin modul;pusto;end;

luna;

if m>0 then



begin writeln;writeln('Тяга? (0-100)');read(z);end

else begin m:=0; z:=0; end;

a:=1.62-z*0.045; m:=m-z*0.15; h:=h-v-a/2; v:=v+a; n:=n+1;

until l<1;

readln;

if v<=2 then begin nebo;modul;luna;writeln;



writeln('Мягкая посадка!'); end

else begin nebo;bum;luna;writeln;writeln('Вы разбились!'); end;

readln;

end.
Ниже приведен один из кадров (Рис. 6) полета ракеты к Луне.



Рис. 6
В заключение приведем использованные формулы программы в более привычном виде:

m = m - 0,15 Z t - изменение массы горючего при времени работы двигателя t с силой тяги Z. Коэффициент 0,15 задан (он связан с величиной скорости истечения газов из сопла ракеты)

a = - - величина ускорения ракеты при одновременном действии силы притяжения Луны (в шесть раз слабее, чем на Земле) и силы тяги двигателя F - максимально возможное значение силы тяги (36000 Н в нашем случае), M - масса ракеты (8000 кг)

h = h - v t - , v = v + a t эти две формулы не требуют, надеемся, разъяснений.


скачать

следующая >>
Смотрите также:
Учебное пособие для студентов мгоу москва 2003 Печатается по решению кафедры ито и редакционно-издательского Совета мгоу
567.32kb.
Учебное пособие для студентов мпу москва 2000 Печатается по решению кафедры ито и редакционно-издательского Совета мпу
553.05kb.
Учебное пособие для студентов II курса педагогических университетов Москва 2003 Печатается по решению Ученого Совета Химического факультета мпгу
1131.94kb.
Печатается по решению редакционно-издательского совета факультета управления, экономики и права кгту
560.85kb.
Г. А. Розман Очерки о
889.68kb.
Практикум Санкт-Петербург 2003 ббк 73
414.05kb.
С. П. Поцелуев политические парадиалоги
5585.04kb.
Пермяков Ю. Е
3733.61kb.
Учебно-методическое пособие по хозяйственному праву могилев, 2013 ббк 67. 3 (2Á) т печатается по решению редакционно-издательского совета
2393.23kb.
Семья в психологической консультации
2773.34kb.
Единого государственного экзамена
3175.33kb.
Учебное пособие для студентов, интернов, клинических ординаторов и врачей г. Барнаул, 1997г.. 2 Печатается по решению координационного методического Совета
942.92kb.