Черепаха Графическая программа. Почему это не работает? - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь выполнить упражнение, которое здесь (стр. 246, номер 6.23) http://index -of.es / C ++ / C% 20How% 20to% 20Program.pdf . Мой код печатает квадрат 12x12, но вместо этого мой код печатает квадрат 25x25, но с левой стороной, образованной наполовину 1, а другая половина - 0. Почему?

#include <stdio.h>
#include <stdlib.h>
#define SIZE 50

int main(){
    int lifted=1, floor[50][50]={0}, commands[7]={1,2,3,4,5,6,9}, spaces, command, north=1, south=0, east=0, west=0, row=25, column=25, i, max=1;


    while(command!=9){
        printf("Enter a command: ");
        scanf("%d",&command);
        switch(command){
            case 1:
                lifted=1;
                break;
            case 2: 
                lifted=0;
                break;
            case 3:
                if(north==1){
                    north=0;
                    east=1;
                }else if(south==1){
                    south=0;
                    west=1;
                }else if(west==1){
                    north=1;
                    west=0;
                }else if(east==1){
                    south=1;
                    east=0;
                }
                break;
            case 4:
                if(north==1){
                    north=0;
                    west=1;
                }else if(south==1){
                    south=0;
                    east=1;
                }else if(west==1){
                    west=0;
                    south=1;
                }else if(east==1){
                    north=1;
                    east=0;
                }
                break;
            case 5:
                printf("Enter a number of spaces: ");
                scanf("%d",&spaces);
                max=spaces;
                break;
            case 6:
                for(i=0; i<50; i++){
                    for(int j=0; j<50; j++){
                        printf("%d ",floor[i][j]);
                    }
                    printf("\n");
                }
                break;
            case 9:
                exit(0);

        }
        if(lifted==0){
            for(i=0; i<max; i++){
                if(north==1){
                    row--;
                }else if(south==1){
                    row++;
                }else if(east==1){
                    column++;
                }else if(west==1){
                    column--;
                }
                floor[row][column]=1;
            }
        }
    }

    return 0;

}

На выходе не отображается квадрат 12х12. Зачем? Пожалуйста, помогите мне. По сути, я не знаю, что делать. Может кто-нибудь найти ошибку? Я был на этом упражнении уже более суток. Спасибо.

1 Ответ

0 голосов
/ 27 августа 2018

Вывод не печатает квадрат 12x12, потому что следующий код печатает 50 строк с 50 числами на каждой.

            for(i=0; i<50; i++){
                for(int j=0; j<50; j++){
                    printf("%d ",floor[i][j]);
                }
                printf("\n");
            }

Причина явно испорченного вывода, который вы описываете в исходном вопросе, вероятно, связана с этим кодом:

    if(lifted==0){
        for(i=0; i<max; i++){
            if(north==1){
                row--;
            }else if(south==1){
                row++;
            }else if(east==1){
                column++;
            }else if(west==1){
                column--;
            }
            floor[row][column]=1;
        }
    }

При этом выполняется доступ к массиву unchecked , что может привести к неопределенному поведению, включая перезапись фрагментов памяти, которые не должны записываться этим кодом. Это может объяснить всевозможные странные результаты. Чтобы защититься от этого, вам нужно добавить четыре проверки, по одной для каждого края сетки 50x50. Например:

if(north==1){
    if(--row < 0){
        row = 0;
    }
}else if(south==1) ...
...