Совет по оптимизации этой программы C?

интересно, есть ли способ уменьшить эту программу. Мне не нравится внешний вид 5 пар printf/scanf, но я не могу придумать, как использовать цикл for для их уменьшения. У меня проблемы с сопоставлением вызовов scanf с вызовами printf.

for(i = 1; i < 6; i++)
    printf("Enter row %d", i);

эта часть проста, однако вызовы scanf и назначения в массив меня сбивают с толку.

//Sums row and column
#include <stdio.h>

int main(void) {

    int a[5][5];
    int row[5] = {0}, col[5] = {0};
    int i, j;

    printf("\t--Enter a 5x5 chart--\n");
    printf("\tEnter row #1: ");
    scanf("%d %d %d %d %d", &a[0][0], &a[0][1], &a[0][2], &a[0][3], &a[0][4]);

    printf("\tEnter row #2: ");
    scanf("%d %d %d %d %d", &a[1][0], &a[1][1], &a[1][2], &a[1][3], &a[1][4]);

    printf("\tEnter row #3: ");
    scanf("%d %d %d %d %d", &a[2][0], &a[2][1], &a[2][2], &a[2][3], &a[2][4]);

    printf("\tEnter row #4: ");
    scanf("%d %d %d %d %d", &a[3][0], &a[3][1], &a[3][2], &a[3][3], &a[3][4]);

    printf("\tEnter row #5: ");
    scanf("%d %d %d %d %d", &a[4][0], &a[4][1], &a[4][2], &a[4][3], &a[4][4]);

    for(i = 0; i < 5; i++) {
            for(j = 0; j < 5; j++) {
                    row[j] += a[j][i];
                    col[j] += a[i][j];
            }
    }

    printf("\tRow sums: %d %d %d %d %d\n", row[0], row[1], row[2], row[3], row[4]);
    printf("\tColumn sums: %d %d %d %d %d\n", col[0], col[1], col[2], col[3], col[4]);

    return 0;
}

person Bowlslaw    schedule 28.03.2011    source источник
comment
И в чем проблема иметь функцию input_row (с циклом for или без него для сканирования ячеек) и вызывать ее N раз?   -  person khachik    schedule 28.03.2011
comment
Пользовательский ввод чрезвычайно трудно предсказать. Возможно, вы захотите убедиться, что получили то, что ожидали: if (scanf(...) != 5) /* user is being creative */;   -  person pmg    schedule 29.03.2011


Ответы (4)


Заменять:

printf("\tEnter row #1: ");
scanf("%d %d %d %d %d", &a[0][0], &a[0][1], &a[0][2], &a[0][3], &a[0][4]);         
...
printf("\tEnter row #5: ");
scanf("%d %d %d %d %d", &a[4][0], &a[4][1], &a[4][2], &a[4][3], &a[4][4]);

с:

for (i = 0; i < 5; i++) {
    printf("\tEnter row #%d: ", i+1);
    scanf("%d %d %d %d %d", &a[i][0], &a[i][1], &a[i][2], &a[i][3], &a[i][4]);
}
person typo.pl    schedule 28.03.2011
comment
... и переименуйте переменные i и j в j и k соответственно. +1. - person Fred Foo; 28.03.2011
comment
После того, как я нажал на сообщение, я увидел объявление для i в исходном коде и отредактировал свой ответ, чтобы удалить объявление i в моем новом коде. - person typo.pl; 28.03.2011
comment
Спасибо. Оглядываясь назад, это кажется очевидным, и я чувствую себя немного глупо, потому что сам не заметил этого раньше. - person Bowlslaw; 28.03.2011
comment
@Bowlslaw Немного сложно понять, как кто-то не может придумать способ, когда операторы printf так просто связаны с операторами scanf. Возможно, вы можете сказать что-то о своем мыслительном процессе и о том, чего вам не хватало или что мешало. Кстати, scanf также должен быть выражен как цикл: for(j = 0; j < COLS; ++j) scanf("%d", &a[i][j]); ... и все эти 5 должны быть заменены константами манифеста, такими как ROWS и COLS. Кроме того, для ясности рассмотрите возможность использования r и c или row и col вместо i и j. - person Jim Balter; 29.03.2011

Как насчет следующего, чтобы прочитать ввод:

for (int i = 0; i < 5; ++i) {
   printf("\tEnter row #%i: ", i+1);
   scanf("%d %d %d %d %d", &a[i][0], &a[i][1], &a[i][2], &a[i][3], &a[i][4]);
}
person MacGucky    schedule 28.03.2011

Вы можете сделать что-то вроде этого:

int rowIndex;

... 

for(rowIndex = 0; rowIndex < 5; rowIndex++)
{
   printf("\tEnter row #%d: ", rowIndex+1);
    scanf("%d %d %d %d %d", &a[rowIndex][0], &a[rowIndex][1], &a[rowIndex][2], &a[rowIndex][3], &a[rowIndex][4]);
}
person Will Dean    schedule 28.03.2011

@ Джим Балтер уже упомянул об этом в своем комментарии к принятому в настоящее время ответу, но он заслуживает публикации в качестве ответа, поскольку это лучшее и более удобное решение.

for (i = 0; i < ROWS; i++) 
{
    printf("\tEnter row #%d: ", i+1);

    for( j = 0; j < COLUMNS; j++ )
    {
        scanf("%d", &a[i][j] ) ;
    }
}

Обратите внимание, что scanf() использует любые пробелы в качестве разделителя, поэтому «строку» не нужно вводить в одном вызове scanf().

person Clifford    schedule 28.03.2011