Добавление 2d массива

0

Эта программа добавляет две матрицы, но она дает слишком много ошибок, и я не могу их решить.

Ошибки:

НЕИСПРАВНОСТЬ МАССОВЫХ БОЛОНОВ

и

СИНТАКСИС ЭКСПРЕССИИ

Любые идеи?

#include<stdio.h>
#include<conio.h>

#define ROW=3
#define COL=3

int result[][COL];
void input(int arr[][COL]);
void add(int mat1[][COL],mat2[][COL]);
void print(int result[][COL]);

void main(void)
{
    int mat1[ROW][COL],mat2[ROW][COL];
    input(mat1);
    input(mat2);
    add(mat1,mat2);
    print(result);
    getch();
}

void input(int arr[][COL]);
{
    for(int i=0;i<row;i++)
        for(int j=0;j<col;j++)
        {
            printf("Enter element");
            scanf("%d",&arr[i][j]);
        }
}

void add(int mat1[][COL],int mat2[][COL])
{
    for(int i=0;i<row;i++)
        for(int j=0;j<col;j++)
        {
            result[i][j]=mat1[i][j]+mat2[i][j];
        }
}

void print(int result[][COL])
{
    for(int i=0;i<row;i++)
        for(int j=0;j<col;j++)
            printf("%d",result[i][j]);
}
Теги:

3 ответа

13
Лучший ответ

Это не плохая первая попытка. По крайней мере, вы пробовали, прежде чем попросили о помощи, что больше, чем некоторые из них. У вас есть следующие проблемы:

  • Ваши настройки неправильного формата.
  • Вы используете нестандартные материалы (conio).
  • Для констант используются строчные row и col.
  • Ваша функция input имеет постороннюю точку с запятой.
  • Вы не правильно определяете result.
  • Основная функция должна всегда возвращать int.

Подробнее:

(1) Ваши настройки неправильного формата.

Вы не используете = в определении, поскольку они должны быть относительно простыми текстовыми заменами. Поэтому строка #define ROW=3 не хочет, чтобы вы хотели, так как в основном пытались определить символ ROW=3 для пустого значения.

Чтобы получить символ row со значением 3, вам нужно использовать #define ROW 3.

Конечно, в более современном коде вы бы использовали static const int ROW = 3;, поскольку это дало бы вам первоклассный символ компилятора, а не просто замену текста. На самом деле нет необходимости использовать предварительные определения процессоров для констант (используйте const) или функции (используйте inline) в настоящее время.

(2) Вы используете нестандартные материалы (conio).

ISO C (стандарт) не включает заголовочный файл conio.h. Я понимаю, что вы используете его, чтобы использовать функцию getch, но ISO C обеспечивает вполне адекватную функцию getchar, которая здесь служит той же цели.

Хорошо использовать расширения для языка, просто имейте в виду, что они, как правило, делают ваш код менее портативным.

(3) Для констант используются строчные row и col.

Поскольку вы использовали прописные буквы row и col для своих констант строк и столбцов, вы должны использовать прописные буквы в операторах for. C - язык, чувствительный к регистру, и использование row и col заставит компилятор жаловаться, что они не существуют.

(4) Ваша функция input имеет постороннюю точку с запятой.

Это просто неуместное ; в первой строке этой функции, в конце строки, содержащей функцию devclaration.

(5) Вы не правильно определяете result.

Переменная result должна иметь определенный размер. Определение int result[][10]; - это то, что известно как неполный тип, поскольку размер не может быть известен.

(6) Основная функция должна всегда возвращать int.

Существуют две стандартные формы основной функции в C. Это:

int main(void);
int main (int c, char *v[]);

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


Это избавит вас от всех ваших синтаксических ошибок, теперь вы можете работать над тем, чтобы сделать интерфейс менее уродливым: -)

#include<stdio.h>

#define ROW 3
#define COL 3

int result[ROW][COL];
void input(int arr[][COL]);
void add(int mat1[][COL],int mat2[][COL]);
void print(int result[][COL]);

int main(void)
{
    int mat1[ROW][COL],mat2[ROW][COL];
    input(mat1);
    input(mat2);
    add(mat1,mat2);
    print(result);
    getchar();
    return 0;
}
void input(int arr[][COL])
{
    for(int i=0;i<ROW;i++)
        for(int j=0;j<COL;j++)
        {
            printf("Enter element");
            scanf("%d",&arr[i][j]);
        }
}
void add(int mat1[][COL],int mat2[][COL])
{
    for(int i=0;i<ROW;i++)
        for(int j=0;j<COL;j++)
            result[i][j]=mat1[i][j]+mat2[i][j];
}
void print(int result[][COL])
{
    for(int i=0;i<ROW;i++)
        for(int j=0;j<COL;j++)
            printf("%d",result[i][j]);
}

Некоторые предложения по улучшению работы:

  • Сделайте более очевидным значение, которое вы вводите, показывая номер и координаты матрицы.
  • Сделать печать между выходными номерами.
  • Сделать печать новой строки между выходными линиями.
  • Сделайте печать строк фиксированной ширины (чтобы выстроились хорошо).
  • Прокомментируйте свой код (я не могу это подчеркнуть).
  • 0
    • Вы используете нестандартные вещи (conio): что я буду использовать? я имею ввиду какой заголовок? почему использовали return 0?
  • 1
    Вы также никогда не должны использовать void main() . main ВСЕГДА, по стандарту, имеет тип возвращаемого значения int .
Показать ещё 5 комментариев
3
#define ROW=3
#define COL=3

неверен для препроцессора C. Попробуйте:

#define ROW 3
#define COL 3

Подробнее о том, как использовать препроцессор, см. эту страницу.

  • 0
    не #define ROW [3]?
  • 0
    Нет, потому что тогда будут дополнительные скобки.
Показать ещё 1 комментарий
1

Первое, что появляется, когда код отформатирован:

#define ROW=3
#define COL=3

должен быть

#define ROW 3
#define COL 3

Ещё вопросы

Сообщество Overcoder
Наверх
Меню