2016-03-18 2 views
-4

Попросите пользователя ввести целое число «n» на консоли. Ваша программа создаст две n x n матрицы случайных ints между 0 и 1023 (включительно), затем умножьте, добавьте и вычтите их вместе. Матрицы должны быть представлены в виде двумерных массивов. Ваша программа должна отображать результат каждой операции матрицы (умножение, вычитание и добавление).C Матричные операции

(Для части вычитания нужна ли мне третья нулевая матрица для указания?) Не получилось.

Вот мой код ниже. Это не работает. Мое умножение массива кажется правильным, однако, после того, как я попал в компиляцию и запуск, он просто застревает после ввода пользователем ввода. Это как вы пишете матрицы в C? Спасибо,

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

int main() { 
    int number; 

    //ask for interger 
    printf("\nEnter and interger: "); 
    scanf("%d", &number); 

    int Array1[number][number]; 
    int Array2[number][number]; 
    int Array3[number][number]; 
    int i,j, r; 

    //populate array 
    for(i = 0; i < number; i++) { 
      for(i = 0; j < number; j++) { 
        r = rand() % 1023; 
        Array1[i][j] = r; 
        Array2[i][j] = r; 
      } 
    } 

    //calutate array 
    //multiplication 
    for(i = 0; i < number; i++) { 
      for(i = 0; j < number; j++) { 
        Array3[i][j] = 
         Array1[i][j] * Array2[i][j] + Array1[i][j+1] * Array2[i+1][j]; 
      } 
    } 

    return 0; 

}

+0

Вы должны динамически выделять массивы. То, как вы их используете, неверно. http://www.programiz.com/c-programming/c-dynamic-memory-allocation в качестве примера. – rlib

+0

Отличное форматирование кода, двойной палец вверх, чтобы не скрывать, что это ваша домашняя работа. – RhinoDevel

+0

@Born никогда не выходит из этих циклов? Кроме того, любая другая ошибка (есть), а также внутренняя переменная цикла внутреннего цикла сбрасывается в ноль, каждый раз. Я бы сказал, что проблема заключается в том, что очень короткий отладочный сеанс может помочь решить (это даже быстрее, чем задавать вопрос!) –

ответ

0

При использовании VLA упростить менеджер памяти, вы должны по крайней мере проверить, если размер вводимых пользователем является действительным.

В коде есть некоторые ошибки, но с математической точки зрения худшим является то, как вы вычисляете произведение двух матриц. Учитывая С = АВ правильная формула:

С I, J = Σ к A I, K Аргументы B K, J

Попробуйте этот фрагмент кода, где я комментировал и исправлял проблемы Я нашел:

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

// Declarations of functions which calculate the matrix product and print out 
// the results. I assume square matrices stored as variable length arrays 
void matrix_product(int width, int a[][width], int b[][width], int c[][width]); 
void print_array(char *msg, int width, int arr[][width]); 

int main() { 
    int number = 0, rs; 

    //ask for an integer 
    printf("\nEnter and interger: "); 
    // It's good practice to check the return value of scanf 
    while ((rs = scanf("%d", &number)) != 1 || number < 1) { 
     if (rs == EOF) { 
      printf("\nFatal Error: No input\n"); 
      return EXIT_FAILURE; 
     } 
     printf("\nPlease, enter a positive integer: "); 
     // clear input buffer reading whatever left on the line till a newline 
     // "[^\n]", without storing it anywhere "*" 
     scanf("%*[^\n]"); 
    } 

    int Array1[number][number]; 
    int Array2[number][number]; 
    int Array3[number][number]; 
    int i, j, r; 

    // populate array 
    srand(time(NULL)); 
    for(i = 0; i < number; i++) { 
     for(j = 0; j < number; j++) { 
     // ^^^ it was i in your code  
      r = rand() % 1024; 
      // note that 1024 % 1024 = 0 while 1023 % 1024 = 1023 
      Array1[i][j] = r; 
      // I guess that the two matrices are intended to be different 
      r = rand() % 1024; 
      Array2[i][j] = r; 
     } 
    } 

    // print the original arrays 
    print_array("\nArray 1:", number, Array1); 
    print_array("\nArray 2:", number, Array2); 

    // print the result of calculations 
    matrix_product(number, Array1, Array2, Array3); 
    print_array("\nArray 3, result of multiplication:", number, Array3); 

    return EXIT_SUCCESS; 

} 

// print out the elements of a square matrix stored as a 2D VLA 
// preceded by an informative string 
void print_array(char *msg, int width, int arr[][width]) { 
    int i, j; 
    printf("%s\n", msg); 
    for(i = 0; i < width; i++) { 
     for(j = 0; j < width; j++) { 
      printf("%8d", arr[i][j]); 
     } 
     printf("\n"); 
    } 
} 

// Calculate the matrix product c = a * b assuming square matrices 
// stored as 2D VLA 
void matrix_product(int width, int a[][width], int b[][width], int c[][width]) { 
    int i, j, k, sum; 
    for(i = 0; i < width; ++i) { 
     for(j = 0; j < width; ++j) { 
      sum = 0; 
      for (k = 0; k < width; ++k) { 
       sum += a[i][k] * b[k][j]; 
      } 
      c[i][j] = sum; 
     } 
    } 
} 
+0

Большое вам спасибо за то, что нашли время, чтобы разобраться с наиболее очевидными. – BornToBeAGamer

+0

@BornToBeAGamer перефразировал и добавил больше объяснений. –