2017-02-17 1 views
1

Я здесь довольно новый, и в этом году я впервые изучаю c. У меня возникла проблема с 2D-массивами и т. Д. Возможен вопрос: Напишите программу, которая найдет сумму двух 2D-матриц.Как добавить целые числа из двух 2-мерных массивов в новый массив 2d с указанной длиной пользователем?

Я могу сделать это довольно легко, но есть проблема, с которой я сталкиваюсь. Например, я дам первый набор массивов длиной 3х3.

Если моя первая 2D массив и второй массив имеет:

  • {1,2,3; 4,5,6; 7,8,9} (1-й массив)
  • {0,0,0; 0,0,0; 0,0,0} (2-й массив)

Мне также присвоено количество строк и столбцов. (Пользовательские входы 3x2), то он должен выглядеть как

  • {1,2; 3,4; 5,6} (ВЫХОД)

но я получаю

  • {1,2; 3,5; 6,8}

Другой пример

  • входы пользователя 2x4 ВЫХОД должно быть {1,2,3,4; 5,6,7,8}

Что я здесь делаю неправильно?

#include <stdio.h> 
#include <stdlib.h> 

#define MAXROW 3 
#define MAXCOL 3 

int main() { 
    int ray1[MAXROW][MAXCOL], ray2[MAXROW][MAXCOL]; 
    int r, c; 
    printf("Enter the number of ROWS: "); 
    scanf("%d", &r); 
    printf("Enter the number of COLUMNS: "); 
    scanf("%d", &c); 

    int sumRay[r][c]; 

    printf("\n"); 

    printf("Input integers for Array %d.\n", 1); 
    arrayIN(ray1); 

    printRay(ray1); 
    printf("Input integers for Array %d.\n", 2); 
    arrayIN(ray2); 

    printRay(ray2); 
    arraySUM(ray1, ray2, r, c, sumRay); 
    printSumRay(r, c, sumRay); 

    //printRay(sumRay); 
} 

void arrayIN(int ray[MAXROW][MAXCOL]) { 
    int r, c; 
    for (r = 0; r < MAXROW; r++) { 
     for (c = 0; c < MAXCOL; c++) { 
      printf("Enter Number for [ROW:%d COL:%d]: ", r, c); 
      scanf("%d", &ray[r][c]); 
     } 
    } 
} 

void arraySUM(int ray1[MAXROW][MAXCOL], int ray2[MAXROW][MAXCOL], 
       int r, int c, int sumRay[r][c]) { 
    int i, j; 
    int x, y; 
    i = j = 0; 
    int sum; 
    for (x = 0; x <= r; x++, i++) { 
     if (i < MAXROW) { 
      for (y = 0; y <= c; y++, j++) { 
       if (j < MAXCOL) { 
        sum = ray1[i][j] + ray2[i][j]; 
        sumRay[x][y]= sum; 
       } else { 
        j = 0; 
       } 
      } 
     } else { 
      i = 0; 
     } 
    } 
    printf("\n"); 
} 

void printSumRay(int r, int c, int sumRay[r][c]) { 
    int i, j; 
    for (i = 0; i < r; i++) { 
     printf("\n"); 
     for (j = 0; j < c; j++) { 
      printf("%d\t", sumRay[i][j]); 
     } 
    } 
} 

void printRay(int ray[MAXROW][MAXCOL]) { 
    int i, j; 
    for (i = 0; i < 3; i++) { 
     printf("\n"); 
     for (j = 0; j < 3; j++) { 
      printf("%d\t", ray[i][j]); 
     } 
    } 
    printf("\n"); 
} 
+2

Хммм я бы ожидать, '<', а не '<=' 'в течение (х = 0, х <= г; х ++ ++ я) ' – chux

ответ

0

Во-первых, вам нужно поставить прототипы функций, прежде чем main() или, по крайней мере, переместить определения функций перед тем main(). Мне совершенно не понятно, почему вы используете VLA для sumRay[][], но массивы с постоянными размерами для ray1[][] и ray2[][]. Если у вас нет веских оснований для этого, лучше будет использовать VLA.

Вы должны использовать тип size_t для переменных, содержащих индексы массива. Операторы scanf() и printf(), которые обрабатывают переменные size_t, затем должны быть изменены для использования спецификатора преобразования %zu.

Функция arraySum() выполняет итерацию по двум парам повторяющихся индексов массива по причинам, которые неясны. Логика здесь сложна и чрезмерно сложна. Поддельный вывод, о котором вы сообщали, можно проследить до этой функции; его трудно читать и понимать, что должно быть признаком того, что его нужно переписать. И если ваше намерение заключается в добавлении входных массивов только частично, это имя не отражает это намерение. Я упростил эту функцию, ужесточил логику и устранил дублирование. См. Обновление ниже для версии, которая добавляет частичный массив.

printSumRay() функция кажется излишним, так как функция printRay() может выполнять ту же работу, так что я удалил его, переписав printRay() использовать VLA-х и затягивание код.Исходный код использовал магическое число 3 в контрольных выражениях здесь, вместо того, чтобы использовать MAXROW и MAXCOL. Но даже если вы не используете VLA, лучше использовать размеры для любой функции, которая будет работать с массивом.

Вот модифицированная версия исходного кода:

#include <stdio.h> 
#include <stdlib.h> 

void arrayIN(size_t r, size_t c, int ray[r][c]); 
void arraySUM(size_t r, size_t c, int ray1[r][c], int ray2[r][c], int sumRay[r][c]); 
void printRay(size_t r, size_t c, int ray[r][c]); 

int main(void) 
{ 

    size_t r,c; 

    printf("Enter the number of ROWS: "); 
    scanf("%zu", &r); 
    printf("Enter the number of COLUMNS: "); 
    scanf("%zu", &c); 

    int ray1[r][c], ray2[r][c], sumRay[r][c]; 

    printf("\n"); 

    printf("Input integers for Array %d.\n", 1); 
    arrayIN(r, c, ray1); 
    putchar('\n'); 

    printRay(r, c, ray1); 
    putchar('\n'); 

    printf("Input integers for Array %d.\n", 2); 
    arrayIN(r, c, ray2); 
    putchar('\n'); 

    printRay(r, c, ray2); 
    putchar('\n'); 

    arraySUM(r, c, ray1, ray2, sumRay); 
    printRay(r, c, sumRay); 
    putchar('\n'); 

    return 0; 
} 

void arrayIN(size_t r, size_t c, int ray[r][c]) 
{ 
    for(size_t i = 0; i < r; i++) { 
     for(size_t j = 0; j < c; j++) { 
      printf("Enter Number for [ROW:%zu COL:%zu]: ", i, j); 
      scanf("%d", &ray[i][j]); 
     } 
    } 
} 

void arraySUM(size_t r, size_t c, int ray1[r][c],int ray2[r][c], int sumRay[r][c]) 
{ 
    for(size_t i = 0; i < r; i++) { 
     for(size_t j = 0; j < c; j++) { 
      sumRay[i][j] = ray1[i][j] + ray2[i][j]; 
     } 
    } 
} 

void printRay(size_t r, size_t c, int ray[r][c]) 
{ 
    for(size_t i = 0; i < r; i++) { 
     for(size_t j = 0; j < c; j++) { 
      printf("%8d",ray[i][j]); 
     } 
     putchar('\n'); 
    } 
} 

В качестве следующего шага, вы можете добавить некоторые проверки ошибок на вход кода, проверка возвращаемых значений из вызовов scanf(). И, как бы то ни было, неудобно вводить числа для массивов, запрашивая каждый элемент. Вы можете поэкспериментировать с способами улучшения этого.

Update

Если ваша истинная цель состоит в том, чтобы объединить только начальные строки и столбцы ваших массивов, приведенный выше код работает только с незначительной модификацией. Вы все равно должны использовать VLA, но вместо определения глобальных констант MAXROW и MAXCOL определите const size_t maxrow и const size_t maxcol в теле main(). В любом случае вы должны передавать эти размеры массива в функции, не полагаясь на глобальные значения.

Добавлена ​​функция, partArraySUM(), с именем, которое более точно отражает его назначение. Только разница между этой функцией и arraySUM() заключается в том, что входные массивы ray1[][] и ray2[][] имеют разные размеры, чем массив sumRay[][], который содержит результаты. Для этого нет необходимости хранить отдельные индексы.

#include <stdio.h> 
#include <stdlib.h> 

void arrayIN(size_t r, size_t c, int ray[r][c]); 
void arraySUM(size_t r, size_t c, int ray1[r][c], int ray2[r][c], int sumRay[r][c]); 
void partArraySUM(size_t r_sz, size_t c_sz, int ray1[r_sz][c_sz], int ray2[r_sz][c_sz], size_t r, size_t c, int sumRay[r][c]); 
void printRay(size_t r, size_t c, int ray[r][c]); 

int main(void) 
{ 
    const size_t maxrow = 3; 
    const size_t maxcol = 3; 
    size_t r,c; 

    printf("Enter the number of ROWS: "); 
    scanf("%zu", &r); 
    printf("Enter the number of COLUMNS: "); 
    scanf("%zu", &c); 

    int ray1[maxrow][maxcol], ray2[maxrow][maxcol], sumRay[r][c]; 

    printf("\n"); 
    printf("Input integers for Array %d.\n", 1); 
    arrayIN(maxrow, maxcol, ray1); 
    putchar('\n'); 

    printRay(maxrow, maxcol, ray1); 
    putchar('\n'); 

    printf("Input integers for Array %d.\n", 2); 
    arrayIN(maxrow, maxcol, ray2); 
    putchar('\n'); 

    printRay(maxrow, maxcol, ray2); 
    putchar('\n'); 

    partArraySUM(maxrow, maxcol, ray1, ray2, r, c, sumRay); 
    printRay(r, c, sumRay); 
    putchar('\n'); 

    return 0; 
} 

void arrayIN(size_t r, size_t c, int ray[r][c]) 
{ 
    for(size_t i = 0; i < r; i++) { 
     for(size_t j = 0; j < c; j++) { 
      printf("Enter Number for [ROW:%zu COL:%zu]: ", i, j); 
      scanf("%d", &ray[i][j]); 
     } 
    } 
} 

void arraySUM(size_t r, size_t c, int ray1[r][c],int ray2[r][c], int sumRay[r][c]) 
{ 
    for(size_t i = 0; i < r; i++) { 
     for(size_t j = 0; j < c; j++) { 
      sumRay[i][j] = ray1[i][j] + ray2[i][j]; 
     } 
    } 
} 

void partArraySUM(size_t r_sz, size_t c_sz, int ray1[r_sz][c_sz], int ray2[r_sz][c_sz], size_t r, size_t c, int sumRay[r][c]) 
{ 
    for(size_t i = 0; i < r; i++) { 
     for(size_t j = 0; j < c; j++) { 
      sumRay[i][j] = ray1[i][j] + ray2[i][j]; 
     } 
    } 
} 

void printRay(size_t r, size_t c, int ray[r][c]) 
{ 
    for(size_t i = 0; i < r; i++) { 
     for(size_t j = 0; j < c; j++) { 
      printf("%8d",ray[i][j]); 
     } 
     putchar('\n'); 
    } 
} 

Пример взаимодействие: нужно

Enter the number of ROWS: 2 
Enter the number of COLUMNS: 2 

Input integers for Array 1. 
Enter Number for [ROW:0 COL:0]: 1 
Enter Number for [ROW:0 COL:1]: 2 
Enter Number for [ROW:0 COL:2]: 3 
Enter Number for [ROW:1 COL:0]: 4 
Enter Number for [ROW:1 COL:1]: 5 
Enter Number for [ROW:1 COL:2]: 6 
Enter Number for [ROW:2 COL:0]: 7 
Enter Number for [ROW:2 COL:1]: 8 
Enter Number for [ROW:2 COL:2]: 9 

     1  2  3 
     4  5  6 
     7  8  9 

Input integers for Array 2. 
Enter Number for [ROW:0 COL:0]: 1 
Enter Number for [ROW:0 COL:1]: 1 
Enter Number for [ROW:0 COL:2]: 1 
Enter Number for [ROW:1 COL:0]: 1 
Enter Number for [ROW:1 COL:1]: 1 
Enter Number for [ROW:1 COL:2]: 1 
Enter Number for [ROW:2 COL:0]: 1 
Enter Number for [ROW:2 COL:1]: 1 
Enter Number for [ROW:2 COL:2]: 1 

     1  1  1 
     1  1  1 
     1  1  1 

     2  3 
     5  6 
+0

@ CristianG-- Я добавил обновление к моему ответу с помощью новой функции, которая объединяет только начальные строки и столбцы входных массивов. –

+0

+1 Привет, похоже, я неправильно понял вопрос, указанный пользователем размер применим ко всем массивам, что было вашим первым ответом. В любом случае спасибо за помощь! Все еще изучаю причуды к C, так простите меня ха-ха. Еще раз спасибо! –

-1

Только незначительные изменения. В arraySUM(), внутри еще части вы повторно инициализирован

я = 0 и у = 0.

Но после повторной инициализации они увеличиваются. Таким образом, он станет 1, поэтому во время выполнения он будет читать луч [1], а не луч [0].

Просто повторно инициализируйте их до -1.

я = -1 и у = -1