GotAI.NET

Форум: Проблемы искусственного интеллекта

 

Регистрация | Вход

 Все темы | Новая тема Стр.1 (6)След. > >>   Поиск:  
 Автор Тема: SRC: здесь можно выкладывать исходники
IvanVlaskin1976
Сообщений: 9071
SRC: здесь можно выкладывать исходники
Добавлено: 09 ноя 21 1:14
Игра Крестики-Нолики написанная на спор за несколько часов

#include<stdio.h>
void main(void) {
int x,y,i;
char MaccuB[3][3];
a01:
for(x=0;x<3;x++) {
for(y=0;y<3;y++) {
MaccuB[x][y]=' ';
}
}
i=0;
a02:
printf("BBeguTe X(1-3) u Y(1-3):\n");
scanf("%d %d",&x,&y);
if((x!=1&&x!=2&&x!=3)||(y!=1&&y!=2&&y!=3)||MaccuB[x-1][y-1]!=' ') {
printf("HeBepHblij xog\n");
goto a02;
}
i++;
MaccuB[x-1][y-1]='X';
printf("+-+-+-+\n");
for(y=0;y<3;y++) {
printf("|%c|%c|%c|\n",MaccuB[0][y],MaccuB[1][y],MaccuB[2][y]);
printf("+-+-+-+\n");
}
for(x=0;x<3;x++) if(MaccuB[x][0]=='X'&&MaccuB[x][1]=='X'&&MaccuB[x][2]=='X') goto a03;
for(y=0;y<3;y++) if(MaccuB[0][y]=='X'&&MaccuB[1][y]=='X'&&MaccuB[2][y]=='X') goto a03;
if(MaccuB[0][0]=='X'&&MaccuB[1][1]=='X'&&MaccuB[2][2]=='X') goto a03;
if(MaccuB[2][0]=='X'&&MaccuB[1][1]=='X'&&MaccuB[0][2]=='X') goto a03;
printf("Komn xoguT KaK\n");
a04:
x=rand()%3;
y=rand()%3;
if(MaccuB[x][y]!=' ') goto a04;
i++;
MaccuB[x][y]='O';
printf("+-+-+-+\n");
for(y=0;y<3;y++) {
printf("|%c|%c|%c|\n",MaccuB[0][y],MaccuB[1][y],MaccuB[2][y]);
printf("+-+-+-+\n");
}

for(x=0;x<3;x++) if(MaccuB[x][0]=='O'&&MaccuB[x][1]=='O'&&MaccuB[x][2]=='O') goto a05;
for(y=0;y<3;y++) if(MaccuB[0][y]=='O'&&MaccuB[1][y]=='O'&&MaccuB[2][y]=='O') goto a05;
if(MaccuB[0][0]=='O'&&MaccuB[1][1]=='O'&&MaccuB[2][2]=='O') goto a05;
if(MaccuB[2][0]=='O'&&MaccuB[1][1]=='O'&&MaccuB[0][2]=='O') goto a05;
if(i>=9) goto a06;
goto a02;
a03:
printf("Bbl no6eguJlu\n");
goto a07;
a05:
printf("Bbl npou7paJlu\n");
goto a07;
a06:
printf("Hu4b9l\n");
a07:
printf("CHoBa?(1-Yes 0-No)\n");
scanf("%d",&x);
if(x==1) goto a01;
}
[Ответ][Цитата]
IvanVlaskin1976
Сообщений: 9071
На: SRC: здесь можно выкладывать исходники
Добавлено: 09 ноя 21 1:20
Изменено: 09 ноя 21 1:21
случайное число на бесконечности

#include<stdio.h>
int main(void) {
int i;
a01:
i=rand()%11
if(i==10) goto 02;
printf("%d");
goto a01;
a02:
printf("\n");
printf("CHoBa?(1-Yes 0-No)\n");
scanf("%d",&x);
if(x==1) goto a01;
return 0
}

[Ответ][Цитата]
гость
23.129.64.*
На: SRC: здесь можно выкладывать исходники
Добавлено: 10 ноя 21 9:39
Не очень качественный код.

Совет на будущее, безусловный переход(goto) лучще не применять без необходимости, в вашем случае можно было использовать циклы и условные переходы.
[Ответ][Цитата]
IvanVlaskin1976
Сообщений: 9071
На: SRC: здесь можно выкладывать исходники
Добавлено: 10 ноя 21 9:44
ну и чем он не качественный?
по мне так он идеальный по лаконичности
а goto дают ему наглядность, сразу всё ясно что и зачем
не даром в ассемблере до сих пор есть условные и безусловные переходы
Чтобы проверить код на правильность, его надо переводить в программирование автоматов, а там без переходов не обойтись
даже когда рисуют структуру алгоритмов используют переходы
[Ответ][Цитата]
гость
23.129.64.*
На: SRC: здесь можно выкладывать исходники
Добавлено: 10 ноя 21 10:04
Ну такая есть традиция, "хороший стиль", это связанно с тем что goto при злоупотреблении может сильно запутать код, сложно читать такой код, "спагетти-код" говорят.

Асемблер там по другому никак, а на Си можно обойтись вообще без goto, разве что иногда в многоуровневых циклах с условиями можно иногда согрешить, но и то даже это типа считается "слабостью". Советую почитать книжку "Совершенный код"))
[Ответ][Цитата]
гость
23.129.64.*
На: SRC: здесь можно выкладывать исходники
Добавлено: 10 ноя 21 10:09
[Ответ][Цитата]
IvanVlaskin1976
Сообщений: 9071
На: SRC: здесь можно выкладывать исходники
Добавлено: 10 ноя 21 10:17
при выборе как програмировать, с использованием goto или без goto надо выбирать из следующих факторов -
структурное программирование -
позволяет:
1.возможность легкого заимстования кода в другие программы
2.возможность легкого мелкого улучшения программ
создает проблемы:
1.при большой вложенности циклов теряется читабельность программы
2.при большой вложенности циклов неудобно редактировать программу в связи с большим количеством символов отступов показывающих степень вложенности команд в ядре цикла


программирование с goto -
позволяет:
1.возможность блочного программирования и как подраздел его - программирование автоматов
2.быструю скорость программирования
3.легкость понимания алгоритма кода
4.легкость проверки кода на корректность работы алгоритмов
5.возможность масштабных переходов, когда можно перейти сразу в конец программы без учета всяких закрывающих ковычек, слабую возможность этого делает break
создает проблемы:
1.можно потерять данные
2.можно потерять указатели
3.можно перепутать переменную изза использования одной и той же переменной для разных задач
[Ответ][Цитата]
Сергей Гаврилов
Сообщений: 197
На: SRC: здесь можно выкладывать исходники
Добавлено: 11 ноя 21 4:56
Цитата:
Автор: IvanVlaskin1976


программирование с goto -
позволяет:
3.легкость понимания алгоритма кода
4.легкость проверки кода на корректность работы алгоритмов

Это вряд ли
[Ответ][Цитата]
гость
178.176.213.*
На: SRC: здесь можно выкладывать исходники
Добавлено: 11 ноя 21 5:18
Цитата:
Автор: Сергей Гаврилов
Это вряд ли

вообще чуток проще с goto выглядит код, главное не злоупотреблять. Например как условие выхода из вложенных циклов можно использовать, а не лепить ещё одни скобки с while
[Ответ][Цитата]
Сергей Гаврилов
Сообщений: 197
На: SRC: здесь можно выкладывать исходники
Добавлено: 11 ноя 21 6:34
Цитата:
Автор: гость


вообще чуток проще с goto выглядит код, главное не злоупотреблять. Например как условие выхода из вложенных циклов можно использовать, а не лепить ещё одни скобки с while
Согласен, иногда бывает с goto выходит проще и логичнее, но обычно его стараются избегать, чаще всего им злоупотребляют новички и код такой как раз таки на много сложнее понять.
[Ответ][Цитата]
гость
139.28.252.*
На: SRC: здесь можно выкладывать исходники
Добавлено: 11 ноя 21 17:52
Ой, да ладно - никакого злоупотребления, одно доброупотребление:

FUNCTION IN_12(PROVERJAEMOE_CISLO64,Q64,W64,E64,R64,T64,Y64,U64,I64,O64,P64,A64,S64: INT64): BOOLEAN;//Ž‚…Š€ €‚…‘’‚€ €ƒ“Œ…’€ ˆ „‚…€„–€’ˆ —ˆ‘…‹
LABEL
100;
BEGIN
IN_12:=TRUE;
IF PROVERJAEMOE_CISLO64=Q64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=W64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=E64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=R64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=T64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=Y64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=U64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=I64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=O64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=P64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=A64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=S64 THEN GOTO 100;
IN_12:=FALSE;
100:
END;


А вот тут, функция для чтения конфига из файла, вообще сама няшность:

FUNCTION CITALNIK(IMJA_FAILA_SOHRANKI5: ANSISTRING;VAR S5: ARRAY OF STRING; VAR Z5: ARRAY OF ANSISTRING;LIMIT: LONGINT): BOOLEAN;
VAR
DLINA_A2: LONGINT=1000;
QQ3,ADRESA3: ARRAY OF BYTE;
ADRESA2: ARRAY OF LONGINT;
M2,E2,C2,I2,R2,Y2,T2: LONGINT;
KOLP: LONGINT;
X64: INT64;
{$IFNDEF LINUX}
Z64: SYSUTILS.THANDLE;
{$ENDIF}
{$IFDEF LINUX}
Z64: INT64;
{$ENDIF LINUX}
LABEL
1,2,5, 99,100,101;
BEGIN
CITALNIK:=FALSE;
IF PADLOFAIL(IMJA_FAILA_SOHRANKI5)=FALSE THEN GOTO 101;
KOLP:=LENGTH(S5);
Z64:=SYSUTILS.FILEOPEN(IMJA_FAILA_SOHRANKI5, fmOpenRead);
IF Z64=VINDOFAILOBAG THEN GOTO 100; //ŠŽ‘’€’€ …‘’œ „‹Ÿ ‹ˆ“Š‘€, ‚ˆ32 ˆ ‚ˆ64
X64:=SYSUTILS.FILESEEK(Z64,0,2);
SYSUTILS.FILESEEK(Z64,0,0);
IF X64>LIMIT THEN X64:=LIMIT;
IF X64<1 THEN GOTO 99;
SETLENGTH(QQ3,X64+200);
FOR M2:=X64 TO X64+200-1 DO QQ3[M2]:=0;
M2:=X64;
E2:=0;
SYSUTILS.FILEREAD(Z64,QQ3[1],X64);
SETLENGTH(ADRESA2,DLINA_A2+2);
SETLENGTH(ADRESA3,DLINA_A2+2);
ADRESA2[0]:=1;
ADRESA2[1]:=X64;
ADRESA3[1]:=0;
C2:=0;
FOR E2:=1 TO X64 DO BEGIN
IF QQ3[E2] IN [10,13]=FALSE THEN GOTO 5;
IF QQ3[E2+1]<>36 THEN GOTO 5;
INC(C2);
IF C2>DLINA_A2 THEN BEGIN
DLINA_A2:=DLINA_A2+2000;
SETLENGTH(ADRESA2,DLINA_A2+2);
SETLENGTH(ADRESA3,DLINA_A2+2);
END;
ADRESA2[0]:=C2;
ADRESA2[C2]:=E2;
ADRESA3[C2]:=0;
5:
END;

FOR I2:=0 TO KOLP-1 DO BEGIN
Z5[I2]:='';
FOR C2:=1 TO ADRESA2[0] DO BEGIN
IF ADRESA3[C2]=1 THEN GOTO 2;
E2:=ADRESA2[C2];
FOR R2:=1 TO LENGTH(S5[I2]) DO BEGIN
IF QQ3[E2+R2+1]<>ORD(S5[I2,R2]) THEN GOTO 2;
IF QQ3[E2+R2+1]=39 THEN BEGIN
Y2:=1;
ADRESA3[C2]:=1;
FOR T2:=R2+1 TO X64 DO BEGIN
IF QQ3[E2+T2+1] {=10} IN [10,13] THEN GOTO 1;
Z5[I2]:=Z5[I2]+CHR(QQ3[E2+T2+1]);
IF QQ3[E2+T2+1]=39 THEN GOTO 1;
INC(Y2);
END;
GOTO 1;
END;
END;
2:
END;
1:
END;
99:
CITALNIK:=TRUE;
100:
SYSUTILS.FILECLOSE(Z64);
101:
END;

poleznosti.pp

Как бы вред гото давно преодолён с появлением железа, которое его не боится. Теперь от него польза. Главное метки писать цифрами, хотя бы в левой части и писать их строго по левому краю текста, чтобы было хорошо видно. А там, где непонятно, метка это или другой код, писать комментарий //метка
[Ответ][Цитата]
IvanVlaskin1976
Сообщений: 9071
На: SRC: здесь можно выкладывать исходники
Добавлено: 11 ноя 21 18:26
я ж вроде расписал особенности использования goto
так о чём сыр бор
[Ответ][Цитата]
гость
139.28.252.*
На: SRC: здесь можно выкладывать исходники
Добавлено: 12 ноя 21 0:15
Ты не видел как реагируют на подобный код фанатики готофобы, пишущие код, в котором его можно избежать - их задачи и фреймворки позволяют. И на основании этого сделавшие вывод что этот оператор и другим в любом коде не нужен - математики же доказали, что гото можно заменить простыней других операторов, значит надо заменять и точка Такие личности не везде встречаются. Здесь не встретились, потому лулзов с фонтанами кирпичей не случилось...
[Ответ][Цитата]
гость
178.176.213.*
На: SRC: здесь можно выкладывать исходники
Добавлено: 12 ноя 21 1:05
Цитата:
Автор: гость

Ой, да ладно - никакого злоупотребления, одно доброупотребление:

FUNCTION IN_12(PROVERJAEMOE_CISLO64,Q64,W64,E64,R64,T64,Y64,U64,I64,O64,P64,A64,S64: INT64): BOOLEAN;//Ž‚…Š€ €‚…‘’‚€ €ƒ“Œ…’€ ˆ „‚…€„–€’ˆ —ˆ‘…‹
LABEL
100;
BEGIN
IN_12:=TRUE;
IF PROVERJAEMOE_CISLO64=Q64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=W64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=E64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=R64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=T64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=Y64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=U64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=I64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=O64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=P64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=A64 THEN GOTO 100;
IF PROVERJAEMOE_CISLO64=S64 THEN GOTO 100;
IN_12:=FALSE;
100:
END;


не знаю на каком это языке, но я бы за повторяющиеся конструкции (if-ы) руки бы оторвал. Язык для того и придуман, чтобы их избежать. Массив со значениями, цикл и условие, и код сразу сокращается в три раза. Тут на форуме был уже сторож, который не мог циклами пользоваться, типа "ученый" какой-то, "биолог", так он 500 значений массива проставлял вручную, а не в цикле, вот так:

a[0]=0;
a[1]=0;
a[2]=0;
....
a[498]=0;
a[499]=0;
a[500]=0;

пятьсот строк вместо одной строки:
for (i=0;i<500;i++){a[i]=0;}



[Ответ][Цитата]
гость
23.129.64.*
На: SRC: здесь можно выкладывать исходники
Добавлено: 12 ноя 21 4:50
Цитата:
Автор: гость

Ты не видел как реагируют на подобный код фанатики готофобы, пишущие код, в котором его можно избежать - их задачи и фреймворки позволяют. И на основании этого сделавшие вывод что этот оператор и другим в любом коде не нужен - математики же доказали, что гото можно заменить простыней других операторов, значит надо заменять и точка Такие личности не везде встречаются. Здесь не встретились, потому лулзов с фонтанами кирпичей не случилось...
Для машины goto – вполне адекватен, для человека нет, человек мыслит линейно, нелинейность даётся с большим трудом(деньгами). Если вы пишите код не большого объёма(менее 10к строк) для себя лично и не собираетесь его поддерживать\редактировать затем через год(ы), вы вольны как угодно извращаться, лишь бы был результат. Но это редкое явление, обычно даже маломальски осмысленный код реюзается и десятки раз редактируется в последствии.

Но даже если ваш код никто не будет читать кроме вас, через пол года — год если вам понадобится использовать ваш же спагетти-код, вы проклянёте самого себя и вероятно проще будет переписать его заново чем разбираться в работе такого кода чтобы поправить и это не преувеличение.

Поэтому есть ряд принципов которые облегчают понимание и сопровождение кода, для себя лично и других членов команды. Эти принципы конечно немного раздувают объём кода(на 20-30%), но следуя им вы облегчаете себе жизнь и коллегам. Один из них отказ от goto в высокоуровневых ЯП.

Вообще все ЯП придумали ТОЛЬКО для человека, чтобы упростить жизнь, машина жрёт двоичные команды, пишете в машинных кодах тогда, нафиг вам функции и ООП? Сплошное полотно команд с прыжками туда-сюда и круто! Только вот хеловорлд будете писать неделю а цсв парсер 10 лет.
[Ответ][Цитата]
 Стр.1 (6): [1]  2  3  4  5  6След. > >>