Шаблон печатается странно при использовании в массиве в c - PullRequest
0 голосов
/ 01 декабря 2018

Я создал массив и несколько функций, которые печатают разные шаблоны каждый.Моя проблема в том, что они печатаются внутри массива странным образом.Ниже приведена основная часть кода и только одна функция для примера.

int castle(int patternWidth, int doorStart, int doorEnd, int N, int i, int j, int row, int col, char** array) 
    {
        if (N >= 3 && N <= 20) 
        {
            for (i = 1; i <= (N + 1); i++) 
            {
                array[row][col] = '*'; col++;
                array[row][col] = ' '; col++;
            }
            row++;

            patternWidth = (((N + 1) * 2) - 1);
            doorStart = (patternWidth - 3) / 2; 
            doorEnd = doorStart + 3; 


            for (i = 0; i < N; i++) 
            { 
                for (j = 1; j <= patternWidth; j++) 
                { 
                    if(N - i <= 2 && j > doorStart && j <= doorEnd)
                    {
                        array[row][col] = ' '; col++;
                    } 
                    else 
                    { 
                        array[row][col] = '*'; col++;
                    }
                }
                row++;
            }
        }
        return 0;
    }

    int main() 
        {
            int N = 0, M = 0, i = 0, j = 0, a = 0, b = 0, s = 0, width = 0, height = 0, patternWidth = 0, doorStart = 0, doorEnd = 0, option = 0, num = 3, col = 0, row = 0;
            char** array;

            printf("Give height board size:");
            scanf("%d", &height);
            printf("Give width board size:");
            scanf("%d", &width);

            array = (char**)malloc(height * sizeof(char*));
            for (i = 0; i < width; i++) 
            {
                array[i] = (char*)malloc(height * sizeof(char));
            }


            for (i = 0; i < height; i++) 
            {
                for (j = 0; j < width; j++) 
                {
                    array[i][j] = ' ';
                }
            }

            while (option != 6)
            {
                printf("\nOption: 1-5, 6 to exit\n"
                "1) Stairs and flag\n"
                "2) Castle\n"
                "3) Trap door\n"
                "4) Platform\n"
                "5) Obstacles\n"
                "Option:");
                scanf("%d", &option);
                if (option == 1) 
                {
                    printf("Valid values 6 - 20\n");
                    printf("Size:");
                    scanf("%d", &N);
                    printf("Height Position:");
                    scanf("%d", &row);
                    printf("Width Position:");
                    scanf("%d", &col);
                    stairs_flag(N, i, j, b, a, num, col, row, array);
                }
                else if (option == 2) 
                {
                    printf("Valid values 3 - 15\n");
                    printf("Size:");
                    scanf("%d", &N);
                    printf("Height Position:");
                    scanf("%d", &row);
                    printf("Width Position:");
                    scanf("%d", &col);
                    castle(patternWidth, doorStart, doorEnd, N, i, j, row, col, array);
                }
                else if (option == 3) 
                {
                    printf("Valid values 3 - 18\n");
                    printf("Size of N:");
                    scanf("%d", &N);
                    printf("Height Position:");
                    scanf("%d", &row);
                    printf("Width Position:");
                    scanf("%d", &col);
                    trap_door(N, patternWidth, i, j, col, row, array);
                }
                else if (option == 4) 
                {
                    printf("Valid values of N 3 - 20\n");
                    printf("Size of N:");
                    scanf("%d", &N);
                    printf("Valid values of M 6, 8, 10, 12, 14, 16, 18, 20\n");
                    printf("Size of M");
                    scanf("%d", &M);
                    printf("Height Position:");
                    scanf("%d", &row);
                    printf("Width Position:");
                    scanf("%d", &col);
                    platform(N, M, i, j, col, row, array);
                }
                else if (option == 5) 
                {
                    printf("Valid values 2 - 10\n");
                    printf("Size of N:");
                    scanf("%d", &N);
                    printf("Height Position:");
                    scanf("%d", &row);
                    printf("Width Position:");
                    scanf("%d", &col);
                    obstacles(N, i, s, j, patternWidth, row, col, array);
                }

            print_array(array, height, width);
            }       

            free(array);

            return 0;
        }

Ожидаемый и правильный результат таков:

 |------------------------------------------------------------|
 |                                                            |
 |                                                            |
 |                                                            |
 |                                                            |
 |                                                            |
 |                                                            |
 |                                                            |
 |                                                            |
 |                                                            |
 |                                                            |
 |          * * * * *                                         |
 |          *********                                         |
 |          *********                                         |
 |          ***   ***                                         |
 |          ***   ***                                         |
 |                                                            |
 |                                                            |
 |                                                            |
 |                                                            |
 |                                                            |
 |------------------------------------------------------------|

Но фактический результат таков:

 |------------------------------------------------------------|
 |                                                            |
 |                                                            |
 |                                                            |
 |                                                            |
 |                                                            |
 |                                                            |
 |                                                            |
 |                                                            |
 |                                                            |
 |                                                            |
 |          * * * * *                                         |
 |                    *********                               |
 |                             *********                      |
 |                                      ***   ***             |
 |                                               ***   ***    |
 |                                                            |
 |                                                            |
 |                                                            |
 |                                                            |
 |                                                            |
 |------------------------------------------------------------|

Например, в двухВ массивах выше, доска имеет ширину 60 и высоту 20, а для рисунка я дал 10 для высоты и ширины.Каждая строка шаблона должна быть под предыдущей и печатать шаблон, но в действительности она печатает каждую строку под предыдущей, но дальше, чем предыдущая.Как я могу это исправить?Есть ли ошибка в коде функции.Для каждой функции я сделал то же самое.Я поставил array[row][col] = '*'; col++; для звездочек и array[row][col] = ' '; col++; для пробелов и row++; для печати каждой строки в новой строке.

Спасибо за ваше время

1 Ответ

0 голосов
/ 01 декабря 2018

Кажется, проблема в том, что индекс вашей колонки col продолжает увеличиваться во всей функции castle().Если вы хотите, чтобы звездочки были выровнены друг относительно друга, вам нужно вернуть индекс столбца к его первоначальному значению в начале цикла for.

Например, вы можете сделать его

int castle(int patternWidth, int doorStart, int doorEnd, int N, int i, int j, int row, int col, char** array) 
    { 
        int column_index = col;
        if (N >= 3 && N <= 20) 
        {
            for (i = 1; i <= (N + 1); i++) 
            {
                array[row][col] = '*'; col++;
                array[row][col] = ' '; col++;
            }
            row++;

            patternWidth = (((N + 1) * 2) - 1);
            doorStart = (patternWidth - 3) / 2; 
            doorEnd = doorStart + 3; 


            for (i = 0; i < N; i++) 
            { 
                for (j = 1; j <= patternWidth; j++) 
                { 
                    col = column_index;
                    if(N - i <= 2 && j > doorStart && j <= doorEnd)
                    {
                        array[row][col] = ' '; col++;
                    } 
                    else 
                    { 
                        array[row][col] = '*'; col++;
                    }
                }
                row++;
            }
        }
        return 0;
    }

, где я добавил команду int column_index = col;, которая сохраняет исходное значение в начале функции, и строку col = column_index; в начале внутреннего цикла for, возвращая сохраненное значение обратно в переменную.

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