Как заменить goto в моем коде при поиске дороги в C - PullRequest
0 голосов
/ 29 ноября 2018
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SPECKLE '.'
#define WALL '#'


/*char a[1000][1000] = {
        {'#','.','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#'},
        {'#','.','.','.','#','.','.','.','.','.','.','.','.','.','.','.','#'},
        {'#','.','#','#','#','.','#','#','#','#','#','.','#','.','#','#','#'},
        {'#','.','.','.','.','.','.','.','.','.','#','.','#','.','.','.','#'},
        {'#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','.','#'},

};*/
#define SIZE 1000

void print_arr()
{
    char a[SIZE][SIZE];
    for (int i = 0; i < 5; ++i)
    {
        for (int j = 0; j < 7; ++j)
        {
            printf("%c",a[i][j]);
        }
        printf("\n");
    }

}


int main(int argc, char const *argv[])
{
    int x = 0, y = 1;
    char a[SIZE][SIZE];

    for(int i=0;i<SIZE;i++)
    {
        scanf("%s",&a[i]);
    }

    continue_in_road:
    while(1)
    {
        if(y == 16 && x == 4)
            break;
        if(a[x][y] == SPECKLE)
        {
            a[x][y] = '1';
            y++;
            continue;
        }
        else if(a[x][y] == WALL)
        {
            y--;
            goto go_back_and_check;
        }

        go_back_and_check:
        while(1)
        {
            if(a[x+1][y] == SPECKLE)
            {
                x++;
                goto continue_in_road;
            }
            else if(a[x-1][y] == SPECKLE)
            {
                x--;
                goto continue_in_road;
            }
            else if(a[x][y-1] == WALL)
            {
                a[x][y] = '2';
                x--;
                continue;
            }
            else if(a[x][y-1] == '1')
            {
                a[x][y] = '2';
                y--;
                continue;

            }
            else if(a[x][y-1] == SPECKLE)
            {
                y--;
                goto switch_to_left;
            }
        }

        switch_to_left:
        while(1)
        {
            if(a[x][y] == SPECKLE)
            {
                a[x][y] = '1';
                y--;
                continue;
            }
            else if(a[x][y] == WALL)
            {
                y++;
                goto go_back_and_check;
            }
        }

    }


    //print_arr();

    for (int i = 0; i < 5; ++i)
    {
        for (int j = 0; j < 18; ++j)
        {
            if(a[i][j] == '1')
                a[i][j] = '*';
            if(a[i][j] == '2')
                a[i][j] = '.';
            printf("%c",a[i][j]);
        }
        printf("\n\n");
    }

//  print_arr();

    return 0;
}

Код для поиска пути или дороги на графике, который выглядит следующим образом:

Ввод: The input

Вывод: The output

Я ищу альтернативу команде goto, поскольку я хотел бы научить больше, чем эта команда, прыжкам в циклах.Мне сказали, что команда goto безобразна и так далее, поэтому я буду рад, если кто-нибудь из вас поможет мне с этим.СПАСИБО ПАРНИ!

1 Ответ

0 голосов
/ 31 января 2019

Использование функций - лучший способ избавиться от этих 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...