Использование функций - лучший способ избавиться от этих goto
s.Однако не любите goto
с только потому, что кто-то вам так сказал.
Вот хорошее прочтение о goto
, которое вдохновило меня на goto
, когда учителя и интернет убедили меня, что онизло.Теперь я люблю goto
;у него просто есть свои приложения, в которых он является лучшим из доступных инструментов: https://koblents.com/Ches/Links/Month-Mar-2013/20-Using-Goto-in-Linux-Kernel-Code/
Великая сила приходит с большой ответственностью:)
Теперь ваш код:
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SPECKLE '.'
#define WALL '#'
#define SIZE 1000
#if 01
static char aa[1000][1000] = {
{'#','.','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#'},
{'#','.','.','.','#','.','.','.','.','.','.','.','.','.','.','.','#'},
{'#','.','#','#','#','.','#','#','#','#','#','.','#','.','#','#','#'},
{'#','.','.','.','.','.','.','.','.','.','#','.','#','.','.','.','#'},
{'#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','.','#'}
};
#endif
static int x, y;
static void print_arr(void);
static void continue_in_road(char a[SIZE][SIZE]);
static bool check(char a[SIZE][SIZE]);
static void switch_to_left(char a[SIZE][SIZE]);
/*
* Note that int main(void) is completely valid, and in fact is what you need,
* because you're not using the arguments.
*/
int main(void)
{
int i, j;
// char a[SIZE][SIZE];
x = 0;
y = 1;
// for (i = 0; i < SIZE; i++)
// scanf(" %s", &a[i]);
continue_in_road(aa);
print_arr();
for (i = 0; i < 5; i++) {
for (j = 0; j < 18; j++) {
if(aa[i][j] == '1')
aa[i][j] = '*';
if(aa[i][j] == '2')
aa[i][j] = '.';
printf("%c",aa[i][j]);
}
printf("\n\n");
}
print_arr();
return 0;
}
static void continue_in_road(char a[SIZE][SIZE])
{
bool initial_chk = true;
while (1) {
if (initial_chk) {
if ((y == 16) && (x == 4))
return;
if (a[x][y] == SPECKLE) {
a[x][y] = '1';
y++;
continue;
} else if (a[x][y] == WALL) {
y--;
}
}
if (check(a)) {
initial_chk = true;
continue;
}
initial_chk = false;
switch_to_left(a);
}
}
static bool check(char a[SIZE][SIZE])
{
while (1) {
if (a[x+1][y] == SPECKLE) {
x++;
return true;
} else if (a[x-1][y] == SPECKLE) {
x--;
return true;
} else if (a[x][y-1] == WALL) {
a[x][y] = '2';
x--;
} else if (a[x][y-1] == '1') {
a[x][y] = '2';
y--;
} else if (a[x][y-1] == SPECKLE) {
y--;
return false;
}
}
}
static void switch_to_left(char a[SIZE][SIZE])
{
while (1) {
if (a[x][y] == SPECKLE) {
a[x][y] = '1';
y--;
} else if(a[x][y] == WALL) {
y++;
return;
}
}
}
/* What is this supposed to do? */
static void print_arr(void)
{
char a[SIZE][SIZE];
int i, j;
for (i = 0; i < 5; ++i) {
for (j = 0; j < 7; ++j)
printf("%c",a[i][j]);
printf("\n");
}
}
Он запускается, если вы скомпилируете его просто так.Я прокомментировал цикл ввода, чтобы использовать созданный вами инициализатор массива static const
, чтобы его было легко проверить.
Однако я думаю, что вам следует пересмотреть вопрос об изменении структуры функций, потому что это сложночтобы понять, что он делает.Если бы я понял, что он делает, я мог бы улучшить код, но так как я не очень понимал это, я ограничился, чтобы избавиться от этих goto
s.