2d массив и для циклов - PullRequest
1 голос
/ 03 апреля 2020

Я сделал этот код, чтобы опробовать основные c операции над двумерными массивами (2d-массивами), но он не выводит на экран букву «А». Может ли кто-нибудь помочь мне понять это? Спасибо

#include <stdio.h>

#define ROWS  2
#define COLS  3

int main()
{
    int x; 
    int y; 
    int i; 
    int j;
    int Field[ROWS][COLS];

    printf("Enter two values: ");
    scanf("%d %d", &x, &y);
    Field[y][x] = 1;

    for(i = ROWS - 1; i > 0; i--){
        for(j = 0; j < COLS; j++){
            if(Field[i][j] == 1){
            printf("A");
            }
        }
    }
    return 0;

}

Ответы [ 4 ]

1 голос
/ 03 апреля 2020

как уже упоминалось i>0 должно быть i>=0, иначе вы не пройдете массив полностью.

также обратите внимание, что даже после того, как вы исправили это утверждение, лучше проверить входные данные x и y, потому что, если они больше или равны ROWS и COLS, чем при прохождении границ вашего массива здесь Field[y][x] = 1; ваша программа приведет к неопределенному поведению.

, поэтому я предлагаю это

    scanf("%d %d", &x, &y);
    if (x < ROWS && y < COLS)
    Field[y][x] = 1;
    else
    return 0;
//rest of your code with i>=0 in this loop for(i = ROWS - 1; i >= 0; i--)
1 голос
/ 03 апреля 2020

Во внешнем l oop

for(i = ROWS - 1; i > 0; i--){

диапазон индексов (в порядке убывания) [ROWS-1, 1], поэтому индекс 0 в этом l * 1017 не обрабатывается *.

Лучше всего так oop написать следующим образом

for ( i = ROWS; i != 0; i-- ){
    for(j = 0; j < COLS; j++){
        if(Field[i-1][j] == 1){
        printf("A");
        }
    }
}

В этом случае переменная i может иметь даже целочисленный тип без знака, как, например, size_t и код будет действителен, даже если ROWS равно 0. В противном случае выражение ROWS - 1 может привести к максимальному значению типа без знака, если ROWS равно 0.

1 голос
/ 03 апреля 2020

Это: for(i = ROWS - 1; i > 0; i--){ не может пройти через необходимое расположение массива и не дает четкой информации будущим разработчикам вашего программного обеспечения о том, что именно имеет в виду.

Однако, чтобы сделать то, что вы описали в описании проблемы, если только нет веских причин для установки убывающего индекса (--), обычный инкрементный (++) набор для циклов адекватные и более идиоматические c:)

for(i = 0; i < ROWS; i++)
{
    for(j = 0; j < COLS; j++)
    {
        if(Field[i][j] == 1)
        {
            printf("A");
        }
    }
}
0 голосов
/ 03 апреля 2020

Этот код добавляет некоторые меры защиты для массивов за пределами границ и печатает «A». Должна быть хорошей отправной точкой для вас.

#include <stdio.h>

#define ROWS  2
#define COLS  3
int main()
{
    int x,y,i,j = 0;
    int Field[ROWS][COLS]; // 2 Rows 3 Column array

    printf("\nEnter row value less than %i: ",ROWS); 
    scanf("%d", &y);

    printf("\nEnter column value less than %i: ",COLS); 
    scanf("%d", &x);

    if(x >= COLS || y>= ROWS)
    {
        printf("\nOut of bounds inputs!");
        return 0;
    }

    Field[y][x] = 1;

    for(i = ROWS - 1; i > 0; i--)
    {
        for(j = 0; j < COLS; j++)
        {
            if(Field[i][j] == 1)
            {
                printf("A");
            }
        }
    }
    return 0;
}

Output

...