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

Дисциплины:

Архитектура (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)






IV.3. АЛЬТЕРНАТИВНАЯ ВЕЛИЧИНА ИЛИ ЛИНЕЙНАЯ ФОРМА ЗАПИСИ КОНСТРУКЦИЙ ВЕТВЛЕНИЙ



 

Логический переключатель if содержит ключи then и else, команды после которых выполняются в зависимости от выполнения условия. На Basic'е результат проверки условия принимает значения 0 и -1, что позволяет записать if в линейной форме.

 

задача 56: величине C присвоить большее из A и B.

решение:

    Pascal program problem56; var a,b,c : real; begin readln(a,b); c:=-ord(a>b)*a-ord(a<=b)*b; { if a>b then c:=a else c:=b; - для сравнения } writeln(c) end.
Basic 5 REM Задача56 10 DEFSNG A,B,C 15 REM начало 20 INPUT A,B 30 C=-(A>B)*A-(A<=B)*B 35 REM IF A>B THEN C=A ELSE C=B - для сравнения 40 PRINT C 50 END С /* Задача 56 */ #include <stdio.h> #include <conio.h> main() { double a, b, c; clrscr (); scanf("%lg%lg",&a, &b); c=(a>b)*a + (a<=b)*b; printf("%5.5f\n", c); getch (); return 0; }

 

Из этого примера понятен смысл названия "альтернативная величина", то есть принимающей значение такого слагаемого, логический множитель которого равен -1 (или 1), а логический множитель 0 при других слагаемых исключает их.

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

 

задача 57: представить решение задачи 54 в линейной форме.

Обсуждение: Здесь ситуация такая, что для y=1/x при x=0 в альтернативном варианте пусть будет y=0.

решение:

    Pascal program problem57; var x,y : real; begin readln(x); y:=ord(x<>0)/(x+ord(x=0)); writeln(y) end.
Basic 5 REM Задача57 10 DEFSNG X,Y 15 REM начало 20 INPUT X 30 Y=-(X<>0)/(X-(X=0)) 40 PRINT Y 50 END С /* Задача 57 */ #include <stdio.h> #include <conio.h> main() { double x,y; clrscr (); scanf ("%lg", &x); y=-(x!=0) / (x+(x==0)); printf ("%5.5f\n", y); getch (); return 0; }

 

Видно, что при x=0 числитель обратится в нуль, а в знаменателе будет 1, т.е. y=0/1.

 

задача 58: представить решение задачи 6 в линейной форме.

Обсуждение: Кусочно-непрерывная функция может иметь как равномерные, так и неравномерные промежутки. В 6 задаче промежутки равномерные, кроме крайних значений, которые в переключателе искуственно сведены к равномерным по формуле n=int((x+12)/2). Но и сложное ветвление и выбор можно записать теперь линейно, правда при этом строка будет длинной.



решение:

    Pascal program problem58; var x,y : real; begin readln(x); y:=ord(x<-8)*(11)+ ord((x>=-8)and(x<-6))*(3.7*sqr(x))+ ord((x>=-6)and(x<-4))*(x*x*x*x*x-9.2)+ ord((x>=-4)and(x<-2))*(x*x*x)+ ord((x>=-2)and(x<0))*(6.7*x)+ ord((x>=0)and(x<=2))*(1.8*sqr(x))+ ord(x>2)*((sqr(sqr(x))-1.6*sqr(x))); writeln(y:10:6); end.
Basic 5 REM Задача58 10 DEFSNG X,Y 15 REM начало 20 INPUT X 30 Y=-(X<-8)*11 -((X>=-8)AND(X<-6))*3.7*X^2 -((X>=-6)AND(X<-4))*(X^5-9.2) -((X>=-4)AND(X<-2))*X^3 -((X>=-2)AND(X<0))*6.7*X -((X>=0) AND(X<=2))*1.8*X^2 -(X>2)*(X^4-1.6*X^2) 40 PRINT Y 50 END С /* Задача 58 */ #include <stdio.h> #include <conio.h> main() { double x,y; clrscr (); scanf("%lg",&x); y=-(x<-8)*11- ((x>=-8) && (x<-6))*3.7*x^2- ((x>=-6) && (x<-4))*(x^5-9.2)- ((x>=-4) && (x<-2))*x^3- ((x>=-2) && (x<0))*6.7*x- ((x>=0) && (x<=2))*1.8*x^2- (x>2)*(x^4-1.6*x^2); printf("%5.5f\n", y); getch (); return 0; }

задача 59: заполнить логическую матрицу (состоящую из 0 и 1) случайным образом.

решение:

    Pascal program problem59; var i : byte; a : array [1..20] of byte; begin for i:=1 to 20 do begin a[i]:=ord(random(10)>5); write(a[i]:3); end; end.
Basic 5 REM Задача59 10 DEFINT A,I : DIM A(20) 15 REM начало 20 FOR I=1 TO 20 21 A(I)=RND(1)>.5 22 PRINT A(I); 23 NEXT I : PRINT 30 END С /* Задача 59 */ #include <stdio.h> #include <conio.h> main() { int i, a[20]; clrscr (); randomize (); for (i=0;i<20;i++) {a[i]=random(10)>5; printf("%4d",a[i]);} getch (); return 0; }

задача 60: заполнить вещественный массив случайными числами от -10 до +10.



решение:

    Pascal program problem60; var i : byte; a : array [1..20] of real; h : boolean; begin for i:=1 to 20 do begin h:=random(10)>5; a[i]:=(random*10)*(ord(h)-ord(not h)); write(a[i]:8:2); end; writeln end.
Basic 5 REM Задача60 10 DEFINT I : DEFSNG A : DIM A(20) 15 REM начало 20 FOR I=1 TO 20 : A(I)=RND(1)*10*(-1)^(RND (1)>.5) : PRINT A(I); : NEXT I : PRINT 30 END С /* Задача 60 */ #include <stdio.h> #include <conio.h> #include <math.h> #include <stdlib.h> main() { int i, h; double a[20]; clrscr (); randomize (); for (i=0;i<20;i++) {a[i]=random(10000)*pow(-1,(random(10)>5))/100; printf("%8.2f",a[i]);} getch (); return 0; }

 

В задачах с 56 по 60 в альтернативных величинах речь не о том, как обойти привычные структуры, а о возможной форме записи предикатов логическими операндами, о логико-математическом мышлении нового направления к экспертным системам и к системам искусственного интеллекта.

Решения следующих задач будут приведены только для языка программирования Basic. Это связано лишь с его особенностями.

Рассмотрим более сложную свертку (чем в задаче 58) переключателя в предикаты, записанных в предикаты альтернативными величинами.

задача 61: составить программу элементарного графического оформителя, когда с помощью курсора-ТОЧКИ можно перемещаться в любом направлении в режимах пустого движения и черчения.

Решение:

Basic (стандартное решение) 5 REM Задача61 7 DEFINT X,Y,K,A,I : DEFSTR J 10 SCREEN 12 : CLS : K=1 : A=0 : X=255 : Y=127 11 LOCATE 30,1,0 : PRINT X,Y 15 REM начало 20 J=INKEY$ : IF J="." THEN A=7 ELSE IF J="0" THEN A=0 30 I=VAL(J) : IF I>0 AND I<10 AND I<>5 THEN 40 ELSE K=0 : GOTO 20 40 IF A=7 THEN K=1 ELSE K=K+1 50 ON I GOTO 60,70,80,90,20,100,110,120,130 60 X=X-1 : Y=Y+1 : GOTO 140 70 Y=Y+1 : GOTO 140 80 X=X+1 : Y=Y+1 : GOTO 140 90 X=X-1 : GOTO 140 100 X=X+1 : GOTO 140 110 X=X-1 : Y=Y-1 : GOTO 140 120 Y=Y-1 : GOTO 140 130 X=X+1 : Y=Y-1 140 IF X<=0 THEN X=640 ELSE IF X=>640 THEN X=0 150 IF Y<=0 THEN Y=480 ELSE IF Y=>480 THEN Y=0 160 PSET(X1,Y1),A : PSET(X,Y),7-A : X1=X : Y1=Y : CLS : LOCATE 30,1,0 : PRINT X,Y : GOTO 20 С (стандартное решение) /* Задача 61 - стандартное решение */ #include <stdio.h> #include <conio.h> #include <graphics.h> #include <bios.h> #include <stdlib.h> void test_graphics (void); void change_xy_coord (int keypressed); void test_color (void); void control_border (void); void print_xy_coord (void); void move_pixel (void); int x_coord=320, y_coord=240, x1=x_coord, y1=y_coord, color=0; main () { int keypressed; clrscr (); test_graphics (); cleardevice (); while (1) {while (!bioskey (1)); keypressed=bioskey (0); if (keypressed==14624) test_color (); change_xy_coord (keypressed); control_border (); print_xy_coord (); move_pixel ();} return 0; } //========================== void test_graphics (void) {int gdriver = DETECT, gmode, errorcode; initgraph(&gdriver, &gmode, ""); errorcode = graphresult(); if (errorcode != grOk) {printf("Graphicserror:%s\n",grapherrormsg(errorcode)); puts("Press any key to EXIT"); getch (); exit (1); } } //========================== void change_xy_coord ( int keypressed ) {switch ( keypressed ) {case 19200: {x_coord--; break;} // влево case 19712: {x_coord++; break;} //вправо case 18432: {y_coord--; break;} // вверх case 18176: {y_coord--; x_coord--; break;} // вверх и влево case 18688: {y_coord--; x_coord++; break;} // вверх и вправо case 20480: {y_coord++; break;} // вниз case 20224: {y_coord++; x_coord--; break;} // вниз и влево case 20736: {y_coord++; x_coord++; break;} // вниз и вправо case 511 : {cleardevice (); break;} // очистка экрана case 283 : // выход <ESC> {setcolor (0); cleardevice ();closegraph (); exit (0);} } } //========================== void control_border (void) {if (x_coord<0) {x_coord=640;} if (x_coord>640) {x_coord=0;} if (y_coord<0) {y_coord=480;} if (y_coord>480) {y_coord=0;} } //========================== void test_color (void) {if (color==15) {color=0; gotoxy(1,1); puts("СТИРАЕМ");} else {if (color==0) {color=15; gotoxy(1,1); puts("РИСУЕМ ");}} } //========================== void print_xy_coord (void) {gotoxy (60,1); printf("%7d%7d", x_coord, y_coord);} //========================== void move_pixel (void) {putpixel (x1, y1, color); putpixel (x_coord, y_coord, 15); x1=x_coord; y1=y_coord;}    
Basic (альтернативное) 5 REM Задача61 7 DEFINT X,Y,K,A,I : DEFSTR J 10 SCREEN 12 : CLS : K=1 : A=0 : X=255 : Y=127 : LOCATE 30,1,0 : PRINT X,Y 15 REM начало 20 J=INKEY$ : A=-7*(J=".")-A*((J<>".")*(J<> "0")) : K=-(A=7)-(K+1)*(A=0) 30 I=VAL(J) : L=(I<1)+(I>9)+(I=5) : IF L THEN K=0 : GOTO 20 40 X=-(X-K)*((I=1)+(I=4)+(I=7))- (X+K)*((I=3)+(I=6)+(I=9))- X*((I=2)+(I=8))- 640*(X<=0)+ X*(X=>640) 50 Y=-(Y-K)*((I=7)+(I=8)+(I=9))- (Y+K)*((I=1)+(I=2)+(I=3))- Y*((I=4)+(I=6))- 480*(Y<=0)+ Y*(Y=>480) 60 PSET (X1,Y1),A : PSET(X,Y),7-A : X1=X: Y1=Y : CLS : LOCATE 30 ,1,0 : PRINT X,Y: GOTO 20 С (альтернативное) /* Задача 61 - альтернативное решение */ #include <stdio.h> #include <conio.h> #include <graphics.h> #include <bios.h> #include <stdlib.h> #define ESC 283 #define LEFT 19200 #define RIGHT 19712 #define UP 18432 #define DOWN 20480 void test_graphics ( void ); void change_xy_coord ( int keypressed ); void test_color ( void ); void control_border ( void ); void print_xy_coord ( void ); void move_pixel ( void ); int x_coord=320, y_coord=240, x1=x_coord, y1=y_coord, color=15; main () { int keypressed; clrscr (); test_graphics ();cleardevice (); while (1) {while (!bioskey (1)); keypressed=bioskey (0); if (keypressed==14624) test_color (); change_xy_coord (keypressed); control_border (); print_xy_coord ();move_pixel ();} return 0; } //========================== void test_graphics (void) {int gdriver = DETECT, gmode, errorcode; initgraph(&gdriver, &gmode, ""); errorcode = graphresult(); if (errorcode != grOk) {printf("Graphics error :%s\n",grapherrormsg(errorcode)); puts("Press any key to EXIT"); getch(); exit(1);}} //========================== void change_xy_coord ( int keypressed ) {x_coord=x_coord-(keypressed==19200); x_coord=x_coord+(keypressed==19712); y_coord=y_coord-(keypressed==18432); y_coord=y_coord+(keypressed==20480); if (keypressed==283) {setcolor (0); cleardevice (); closegraph (); exit (0);}} //========================== void control_border ( void ) {x_coord=(x_coord+(x_coord<0)*640)+ (x_coord-(x_coord>640)*640); y_coord=(y_coord+(y_coord<0)*480)+ (y_coord-(y_coord>480)*480);} //========================== void test_color ( void ) {color=(color==15)*0+(color==0)*15;} //========================== void print_xy_coord (void) {gotoxy (60,1); printf("%7d%7d", x_coord, y_coord);} //========================== void move_pixel (void) {putpixel (x1, y1, color); putpixel (x_coord, y_coord, 15); x1=x_coord; y1=y_coord;}

 

В программе на Basic’е 40 и 50 строки заменяют строки с 60 по 150 предыдущего решения: из всех ветвлений осталось лишь одно. Для наглядности расшифруем предикат 40 строки:

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

 

IV.4. ЛОГИЧЕСКИЕ ЗАДАЧИ.

 

Вернемся к логическим величинам. В примечании к задачам 50 и 51 были приведены исследовательские таблицы истинности.

 

задача 62: исследовать функцию not(a or (not b)) and c, где под a, b, c понимают логические величины.

Решение:

Basic 5 REM Задача62 10 DEFINT A,B,C,F 15 REM начало 20 FOR A=0 TO -1 STEP -1 30 FOR B=0 TO -1 STEP -1 40 FOR C=0 TO -1 STEP -1 50 F=(NOT(A+(NOT B)))*C 60 PRINT A;B;C,F 70 NEXT C,B,A 80 END С /* Задача 62 */ #include <stdio.h> #include <conio.h> main() { int a, b, c, f; clrscr (); for (a=0; a<=1; a++) {for (b=0; b<=1; b++) {for (c=0; c<=1; c++) {f=!(a || (!b)) && c; printf ("%2d%2d%2d\t%2d\n", a, b, c, f); } // for c } // for b } // for a getch ();return 0; }

 

Это является преддверием очень сложных логических задач, суть которых заключается в правильном представлении истинных условий. Задачи 62 и 63 взяты из книги: В.Н.Касаткин Через задачи к программированию, Киев: "Радянська школа", 1989. Решение обеих задач не повторено, а изложено в совершенно новом стиле, предложенном Вашему вниманию.

задача 63: шесть спортсменов - Адамов, Белов, Ветров, Глебов, Дронов и Ершов - в проходившем соревновании заняли первые шесть мест, причем ни одно место не было разделено между ними. О том, кто какое место занял, были получены такие высказывания:

1. "Кажется, первым был Адамов, а вторым Дронов".

2. "Нет, на первом месте был Ершов, а на втором Глебов".

3. "Вот так болельщики! Ведь Глебов был на третьем месте, а Белов - на четвертом".

4. "И вовсе было не так: Белов был пятым, а Адамов - вторым".

5. "Вы все перепутали: пятым был Дронов, а перед ним Ветров".


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

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