fork download
  1. /*
  2.   http://t...content-available-to-author-only...h.net/test/read.cgi/tech/1354070278/618
  3.   618 名前:デフォルトの名無しさん [sage]: 2012/12/28(金) 19:37:31.49
  4.   [1] 授業単元:プログラミング演習 2
  5.   [2] 問題文(含コード&リンク)
  6.   行列の積を計算する関数multの関数プロトタイプ宣言が以下のように記述されている
  7.   void mult(double *ma, double *mb, double *mc, int n);
  8.   いま、定数Nの値がmain関数の外で#define N 3 と定義されている。N×Nの正方行列maとmb,そしてmcはmain関数の中で
  9.   double ma[N][N];
  10.   double mb[N][N];
  11.   double mc[N][N] = { 0.0 } ;
  12.   と定義されている。このとき関数multを次のように呼び出して行列の積mc=ma • mb を計算したい。
  13.   mult((double *)ma, (double *)mb, (double *)mc, N);
  14.   関数multをブラケット演算子[]なしで書き上げなさい。
  15.   [3.1] OS: unix
  16.   [3.2] コンパイラ名とバージョン: gcc
  17.   [3.3] 言語: C
  18.   [4] 期限:1月まで(出来れば早めにお願いします)
  19. */
  20. #include<stdio.h>
  21.  
  22. #define N (3)
  23.  
  24. void mult(double *ma, double *mb, double *mc, int n)
  25. {
  26. int i, j, k;
  27. double sum;
  28. for (j = 0; j < n; j++) {
  29. for (i = 0; i < n; i++) {
  30. sum = 0.0;
  31. for (k = 0; k < n; k++) {
  32. sum += *(ma + j * n + k) * (*(mb + k * n + i));
  33. }
  34. *(mc + j * n + i) = sum;
  35. }
  36. }
  37. }
  38.  
  39. void print_matrix(double *x, char *s)
  40. {
  41. int i, j;
  42. printf("%s =\n", s);
  43. for (j = 0; j < N; j++) {
  44. printf(" | ");
  45. for (i = 0; i < N; i++) {
  46. printf("%f ", *(x + j * N + i));
  47. }
  48. printf("|\n");
  49. }
  50. }
  51.  
  52. int main()
  53. {
  54. double ma[N][N] = { {1.0, 2.0, -1.0}, {3.0, 2.0, 1.0}, {0.0, 1.0, 2.0} };
  55. double mb[N][N] = { {1.0, -2.0, -1.0}, {1.0, 2.0, 1.0}, {3.0, 1.0, 2.0} };
  56. double mc[N][N] = { 0.0 };
  57.  
  58. mult((double *) ma, (double *) mb, (double *) mc, N);
  59. print_matrix((double *) ma, "ma");
  60. print_matrix((double *) mb, "mb");
  61. print_matrix((double *) mc, "mc = ma * mb");
  62.  
  63. return 0;
  64. }
Success #stdin #stdout 0.01s 1720KB
stdin
Standard input is empty
stdout
ma =
  | 1.000000 2.000000 -1.000000 |
  | 3.000000 2.000000 1.000000 |
  | 0.000000 1.000000 2.000000 |
mb =
  | 1.000000 -2.000000 -1.000000 |
  | 1.000000 2.000000 1.000000 |
  | 3.000000 1.000000 2.000000 |
mc = ma * mb =
  | 0.000000 1.000000 -1.000000 |
  | 8.000000 -1.000000 1.000000 |
  | 7.000000 4.000000 5.000000 |