Главная Обратная связь

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)






III.6. ВСПОМОГАТЕЛЬНЫЕ АЛГОРИТМЫ, ПОДПРОГРАММЫ, ПРОЦЕДУРЫ



 

Обратите еще раз внимание на то, что функции используются операндами в различных выражениях, а процедуры - в виде команд или операторов!

задача 46: заменить функции пользователя задачи 45 процедурами.

решение:

алгоритмический язык алг Задача_46(лит s) дано s=" " надо s начцел k,l l:=длин(s) нцдля k от 1 до l i1(s,l); s:=s кц нцдля k от 1 до l i2(s,l); s:=s кц кон алг i1(лит z, цел m) дано z,m надо нач z:="*"+z[1:m-1] кон алг i2(лит z, цел m) дано z,m надо нач z:=z[2:m]+" " кон Pascal program problem46; var s : string; k,l : byte; procedure i1; begin s:='*'+copy(s,1,l-1); end; procedure i2; begin s:=copy(s,2,l-1)+' '; end; begin s:=' '; l:=length(s); for k:=1 to l do begin i1; gotoxy(1,8); writeln(s); delay(100); end; for k:=1 to l do begin i2; gotoxy(1,8); writeln(s); delay(100); end end.
Basic 5 REM Задача46 10 DEFSTR S : DEFINT K,L 15 GOTO 40 : REM начальный "обход" подпро граммы 20 S="*"+MID$(S,1,L-1) : RETURN 30 S=MID$(S,2,L-1)+" " : RETURN 35 REM начало 40 S=" " : L=LEN(S) 50 FOR K=1 TO L : GOSUB 20 : LOCATE 1,8,0 : PRINT S : NEXT K 60 FOR K=1 TO L : GOSUB 30 : LOCATE 1,8,0 : PRINT S : NEXT K 70 END С /* Задача 46 */ #include <stdio.h> #include <conio.h> #include <string.h> char *mid(char* str,int xx,int yy); void i1(char *x,int y); void i2(char *x,int y); main() { char *s=" "; int k,l=strlen(s); clrscr(); 1: for (k=0;k<=l;k++) {i1(s,l); gotoxy(1,8); printf("%s",s);)} for (k=0;k<=l;k++) {i2(s,l); gotoxy(1,8); printf("%s",s);)} goto 1; return 0; } =========================== char *mid(char* str,int xx,int yy) {char c1[80]=""; char c2[80]=""; strncpy (c1,str,xx+yy); strrev (c1); strncpy (c2,c1,yy); strrev (c2); return (c2);} =========================== void i1(char *x,int y) {x=strcat("*",mid(x,0,y-1));} =========================== void i2(char *x,int y) {x=strcat(mid(x,1,y-1)," ");}

 

ПРИЛОЖЕНИЕ.

задача 47: составить программу простейшего текстового редактора.

Обсуждение. Заключается в управлении курсором в режимах редактирования любого символа в любом месте экрана.

решение:



    Pascal program problem47; uses crt; label 1,2; var a : char; x,y : shortint; begin clrscr; x:=32; y:=7; 1: gotoxy(x,y); if x<1 then begin x:=79; y:=y-1; end; if x>79 then begin x:=1; y:=y+1; end; if y<1 then y:=24; if y>24 then y:=1; a:=readkey; if a=#27 then exit; if a=#0 then begin a:=readkey; if a=#77 then inc(x); if a=#75 then dec(x); if a=#72 then dec(y); if a=#80 then inc(y); goto 1; end; write(a); x:=x+1; goto 1 end.
Basic 5 REM задача 47 10 DEFSTR X 15 REM начало 20 CLS 30 PRINT X$ : X$=INKEY$ 40 IF X$<>CHR$(27) THEN 30 С /* Задача 47 */ #include <stdio.h> #include <conio.h> #include <bios.h> #include <ctype.h> #include <stdlib.h> void change_xy_coord ( int keypressed ); void control_border ( int x_coord, int y_coord ); int x_coord=40, y_coord=13; main() { int keypressed; textbackground(9); textcolor(15); _setcursortype (_NORMALCURSOR); clrscr (); gotoxy (x_coord, y_coord); while (1) { while (!bioskey (1)); keypressed=bioskey (0); if (isalnum (keypressed & 0xFF)) {x_coord++; putchar (keypressed); gotoxy (x_coord+1, y_coord); control_border (x_coord, y_coord); } else {change_xy_coord ( keypressed ); control_border (x_coord, y_coord); } }return 0; } //============================== void change_xy_coord ( int keypressed ) {switch ( keypressed ) {case 19200:{x_coord--; break;} // влево case 19712:{x_coord++; break; } //вправо case 18432:{y_coord--; break;} // вверх case 20480:{y_coord++; break;} // вниз case 14624:{putchar(32); x_coord++; // пробел break;} case 3849: {x_coord=x_coord+8; // табуляция break;} case 283 : {textbackground (0); //выход <ESC> textcolor (7); clrscr (); exit (0);} } } //============================== void control_border ( int x_coord, int y_coord ) {if (x_coord<0) {x_coord=79; y_coord--;} if (x_coord>79) {x_coord=0; y_coord++;} if (y_coord<0) {y_coord=24;} if (y_coord>24) {y_coord=0;} gotoxy (x_coord+1, y_coord); }

 



Логическая схема: нач

 
 

 

 


п.-x=key

 

да

(x="")

нет

 

да

(x=27)

нет

 

р.-x

 

кон

 

задача 48: вычислить t=(y2)/(y-2) для любых значений y. Аргументы вводятся как литерные константы в режиме опроса клавиатуры.

решение:

    Pascal program problem48; uses crt; var c : integer; t : real; d : longint; x : char; y : string; begin clrscr; x:=' '; writeln('введите число'); repeat y:=y+x; write(x); x:=readkey; until x=#13; val(y,d,c); t:=d*d/(d-2); writeln; write(t:8:3); x:=readkey; end.
Basic 5 REM Задача48 10 DEFSTR X,Y : DEFSNG Y1,T 15 REM начало 20 X$=INKEY$ : IF X$="" THEN 20 30 IF X$<>CHR$(13) THEN Y$=Y$+X$ : LOC ATE 1,1,0 : PRINT Y$ : GOTO 20 40 Y1=VAL(Y$) : T=Y1^2/(Y1-2) : PRINT T 50 END С /* Задача 48 */ #include <stdio.h> #include <conio.h> #include <math.h> #include <string.h> main() { double t=0, y1=0; char x; char *y=""; clrscr (); opros : x=getch (); if (x==13) //Если нажали <Enter>, то переход {goto formula;} //на вычисление выражения. else {y=strcat(y,x); //Иначе, увеличиваем "бу- gotoxy (1, 1) //фер" на символ нажатой printf(%s\n",y);} //клавиши. formula : y1=atof (y); //Преобразовываем "бу- t=pow(y1,2)/(y1-2); // фер" в число и вычисляем printf("%8.5f\n",t); //выражение. getch(); return 0; }

 

Логическая схема: нач

 
 

 


а.-x

 

нет

(key)

да

 

да нет

(x=13)

 

в.-y1,t в.-y

р.-t р.-y

 

кон

задача 49: вычислить t=(y2)/(y-2) для любых значений y. Значения аргументов в текстовом режиме установить и, по нажатию какой-либо клавиши, сканировать их с экрана (память АЦЗУ). Примечание: адрес начала видеопамяти B000:0000 hex в текстовом режиме.

решение:

    Pascal program problem49; uses crt; var i : byte; c : integer; t,d : real; x : char; y : string; begin clrscr; x:=' '; y:=''; t:=0; c:=0; repeat x:=readkey; write(x); inc(c); until x=#13; for i:=0 to c-2 do begin y:=y+chr(mem[$b800:0000+i*2]); val(y,d,c); end; t:=sqr(d)/(d-2); writeln; writeln(t:8:4); readkey; end.
Basic 5 REM Задача 49 10 DEFSTR X,Y : DEFINT A,I : DEFSNG D,T 15 REM начало 20 CLS : Y="" : DEF SEG=&HB800 30 X=INKEY$ : IF X<>CHR$(13) THEN PRIN T X; : GOTO 30 40 FOR I=0 TO 30 : Y=Y+CHR$(PEEK(I*2)): D=VAL(Y) : NEXT I 50 T=D^2/(D-2) : PRINT : PRINT T 60 END С /* Задача 49 */ //адрес=адрес_адаптера+y*160+ #include <stdio.h> //+x*2. Для считывания и за- #include <conio.h> // писи в видеоадаптер нуж- #include <string.h> // но использовать ДАЛЬ- #include <math.h> //НИЕ указатели FAR. Од- char far *vid_mem=0xB8000000; // ноцветный ви- main() //деоадаптер использует адрес //B0000000H, а все остальные - //B8000000H. { double t=0, y1=0; char far *t,far *v; char *x="",*bufer=""; int a,i; clrscr (); opros : x=getch (); if (x==13) {v=t; for (i=0;i<79;i++) {t=v; //Вычисляем адрес символа. v+=i*2; //Читаем символ и записы- strcat (bufer, v);} //ваем его в "буфер". y1=atof (y); t=pow (y1, 2) / (y1-2); printf ("\n%8.5f\n", t); goto end; } else {printf (%s", x); } goto opros; end : getch();return 0; }

 

Логическая схема: нач

 
 

 


а.-x

 

нет

(key)

да

 

да нет

(x=13)

 

р.-x

да

(i<=30)

нет

 

в.-y,y1

в.-t

р.-t

 

кон

 

Задачи приложения 47-49 позволят более гибко использовать способы обработки любой информации, несмотря на то, что они относятся к обработке литерной и строковой информации. И как это делается - надо разобраться и понять по смыслу представленных решений.

Программа задачи 47 позволит, например, рисовать узоры символами, писать деловые письма, сочинения, послания. Причем, при желании, все это можно будет выводить на принтер или в файл данных на магнитный диск. Эта же программа легла в основу задач 48 и 49, где строковая или символьная информация преобразуется в числовую, та в свою очередь обрабатывается до получения соответствующих результатов.

Вариантов подобных видов работ очень много: игровые погони одних символов за другими; одновременные графические и символьные динамические попадания одних образов в другие, и наоборот; логические, графические, числовые и символьные головоломки, загадки, задачи в игровых вариантах.

 

УПРАЖНЕНИЕ 3.

 

а) комбинируя стандартные функции и процедуры, составьте программы: перестановки местами символов строки попарно; передвижения первого символа в конец строки перестановкой с соседними символами; образования (составления) новых строк из исходной строки с конкатенацией подстрок; удаления нескольких символов в разных местах строки и вставки на их место других символов по некоторому смыслу; получения строки "слон" из строки "муха" заменой одного символа за одну операцию (описание этого алгоритма можно найти в занимательной грамматике);

б) программы с ветвлениями без циклов позволяют только оценивать и сравнивать некоторую информацию с другой; на этом этапе полезно отработать навыки составления грамотных простых и составных условий, игровые элементы, составление узоров или графиков по условию, организация информационно-поисковых систем, и так далее;

в) с помощью циклических структур можно вводить элементы динамики: игры в слова; символические построения; обработка строк, как линейных массивов; обработка строковых и литерных массивов; построение графиков и диаграмм символами;

г) упростите задачи 47-49 функциями и процедурами с условием, что тело программы должно сохранить смысл достижения целей задач (ориентируйтесь на конечный результат);

д) возьмите наугад одну из составленных программ, проанализируйте ее на предмет сервисного оформления: установка в середине экрана; оформление псевдосимвольной графикой; режим "световой газеты" или "бегущей строки"; "осыпание" символов строки или "всплытие" их снизу вверх"; сигнальное мигание символов или строк; кольцевое движение орнамента из символов; "перемешивание" символов, как шариков в произвольном прямоугольнике; сопровождение сообщениями и подсказками, выводами; поздравления, поощрения и утешения; динамика должна быть умеренной, не суетливой, без мельтешения ненужного; оформление должно быть должно быть не громоздким и не утомительным; простота и изящность исполнения программы для пользователя - результат опыта программиста, который достигается не сразу и требует огромной работы;

е) если вы не придумали игр - попробуйте составить следующие программы:

- морской бой,

- быки и коровы (для чисел и слов),

- угадывание задуманного числа или слова по придуманным правилам,

- шифрование и дешифрование: перевод из десятеричной системы счисления в римскую, и наоборот; выдача прописью чтения числа при его вводе с клавиатуры, и наоборот; отгадывание символьных ребусов числовых примеров;

- "тараканьи бега",

- гонки,

- питон,

- символьный тетрис или полимино;

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

 


Эта страница нарушает авторские права

allrefrs.ru - 2018 год. Все права принадлежат их авторам!