お礼
ご回答ありがとうございます。確かにc[jisu][jisu]は変でした。
説明
returnを使って配列は返せないのですね。実は関数の項目を勉強していまして、それで配列を返して具体的にコードを組んでみようとしたのですが、ポインタを使うことでうまくいきました。malloc関数を使えば一般化はできそうですし、構造体(?)という手段もあると調べてみたサイトで書かれていましたが、またポインタや構造体を勉強する際に一般化にリベンジしようと思います。
修正後のコード
C
1 # include <stdio.h>
2
3 int jisu ;
4
5 int ( * mult2 ( int a [ ] [ 2 ] , int b [ ] [ 2 ] ) ) [ 2 ] ;
6 int ( * mult3 ( int a [ ] [ 3 ] , int b [ ] [ 3 ] ) ) [ 3 ] ;
7 int ( * mult4 ( int a [ ] [ 4 ] , int b [ ] [ 4 ] ) ) [ 4 ] ;
8 int ( * mult5 ( int a [ ] [ 5 ] , int b [ ] [ 5 ] ) ) [ 5 ] ;
9 void disp ( int a [ ] [ jisu ] , int b [ ] [ jisu ] , int c [ ] [ jisu ] ) ;
10
11 int main ( void )
12 {
13 do
14 {
15 printf ( "Enter the dimension.\n" ) ;
16 scanf ( "%d" , & jisu ) ;
17 } while ( jisu < 2 || jisu > 5 ) ;
18
19 int a [ jisu ] [ jisu ] ;
20 int b [ jisu ] [ jisu ] ;
21
22 printf ( "\ndefine matrix A." ) ;
23 for ( int m = 0 ; m < jisu ; m ++ )
24 {
25 for ( int n = 0 ; n < jisu ; n ++ )
26 {
27 printf ( "\nEnter a[%d][%d]\n" , m , n ) ;
28 scanf ( "%d" , & a [ m ] [ n ] ) ;
29 }
30 }
31
32 printf ( "\ndefine matrix B." ) ;
33 for ( int m = 0 ; m < jisu ; m ++ )
34 {
35 for ( int n = 0 ; n < jisu ; n ++ )
36 {
37 printf ( "\nEnter b[%d][%d]\n" , m , n ) ;
38 scanf ( "%d" , & b [ m ] [ n ] ) ;
39 }
40 }
41 if ( jisu == 2 )
42 {
43 int ( * c ) [ 2 ] = mult2 ( a , b ) ;
44 disp ( a , b , c ) ;
45 }
46 else if ( jisu == 3 )
47 {
48 int ( * c ) [ 3 ] = mult3 ( a , b ) ;
49 disp ( a , b , c ) ;
50 }
51 else if ( jisu == 4 )
52 {
53 int ( * c ) [ 4 ] = mult4 ( a , b ) ;
54 disp ( a , b , c ) ;
55 }
56 else if ( jisu == 5 )
57 {
58 int ( * c ) [ 5 ] = mult5 ( a , b ) ;
59 }
60 else
61 {
62 printf ( "Error.\n" ) ;
63 }
64 }
65
66 int ( * mult2 ( int a [ ] [ 2 ] , int b [ ] [ 2 ] ) ) [ 2 ]
67 {
68 static int d [ 2 ] [ 2 ] ;
69 for ( int i = 0 ; i < 2 ; i ++ )
70 {
71 for ( int j = 0 ; j < 2 ; j ++ )
72 {
73 d [ i ] [ j ] = 0 ;
74 }
75 }
76
77 for ( int i = 0 ; i < 2 ; i ++ )
78 {
79 for ( int j = 0 ; j < 2 ; j ++ )
80 {
81 for ( int n = 0 ; n < 2 ; n ++ )
82 {
83 d [ i ] [ j ] += a [ i ] [ n ] * b [ n ] [ j ] ;
84 }
85 }
86 }
87
88 return d ;
89 }
90
91 int ( * mult3 ( int a [ ] [ 3 ] , int b [ ] [ 3 ] ) ) [ 3 ]
92 {
93 static int d [ 3 ] [ 3 ] ;
94 for ( int i = 0 ; i < 3 ; i ++ )
95 {
96 for ( int j = 0 ; j < 3 ; j ++ )
97 {
98 d [ i ] [ j ] = 0 ;
99 }
100 }
101
102 for ( int i = 0 ; i < 3 ; i ++ )
103 {
104 for ( int j = 0 ; j < 3 ; j ++ )
105 {
106 for ( int n = 0 ; n < 3 ; n ++ )
107 {
108 d [ i ] [ j ] += a [ i ] [ n ] * b [ n ] [ j ] ;
109 }
110 }
111 }
112
113 return d ;
114 }
115
116 int ( * mult4 ( int a [ ] [ 4 ] , int b [ ] [ 4 ] ) ) [ 4 ]
117 {
118 static int d [ 4 ] [ 4 ] ;
119 for ( int i = 0 ; i < 4 ; i ++ )
120 {
121 for ( int j = 0 ; j < 4 ; j ++ )
122 {
123 d [ i ] [ j ] = 0 ;
124 }
125 }
126
127 for ( int i = 0 ; i < 4 ; i ++ )
128 {
129 for ( int j = 0 ; j < 4 ; j ++ )
130 {
131 for ( int n = 0 ; n < 4 ; n ++ )
132 {
133 d [ i ] [ j ] += a [ i ] [ n ] * b [ n ] [ j ] ;
134 }
135 }
136 }
137
138 return d ;
139 }
140
141 int ( * mult5 ( int a [ ] [ 5 ] , int b [ ] [ 5 ] ) ) [ 5 ]
142 {
143 static int d [ 5 ] [ 5 ] ;
144 for ( int i = 0 ; i < 5 ; i ++ )
145 {
146 for ( int j = 0 ; j < 5 ; j ++ )
147 {
148 d [ i ] [ j ] = 0 ;
149 }
150 }
151
152 for ( int i = 0 ; i < 5 ; i ++ )
153 {
154 for ( int j = 0 ; j < 5 ; j ++ )
155 {
156 for ( int n = 0 ; n < 5 ; n ++ )
157 {
158 d [ i ] [ j ] += a [ i ] [ n ] * b [ n ] [ j ] ;
159 }
160 }
161 }
162
163 return d ;
164 }
165
166 void disp ( int a [ ] [ jisu ] , int b [ ] [ jisu ] , int c [ ] [ jisu ] )
167 {
168 printf ( "matrix A\n" ) ;
169 for ( int i = 0 ; i < jisu ; i ++ )
170 {
171 printf ( "|" ) ;
172 for ( int j = 0 ; j < jisu ; j ++ )
173 {
174 printf ( "%6d" , a [ i ] [ j ] ) ;
175 }
176 printf ( " |\n" ) ;
177 }
178
179 printf ( "matrix B\n" ) ;
180 for ( int i = 0 ; i < jisu ; i ++ )
181 {
182 printf ( "|" ) ;
183 for ( int j = 0 ; j < jisu ; j ++ )
184 {
185 printf ( "%6d" , b [ i ] [ j ] ) ;
186 }
187 printf ( " |\n" ) ;
188 }
189 printf ( "multiply A by B\n" ) ;
190 for ( int i = 0 ; i < jisu ; i ++ )
191 {
192 printf ( "|" ) ;
193 for ( int j = 0 ; j < jisu ; j ++ )
194 {
195 printf ( "%6d" , c [ i ] [ j ] ) ;
196 }
197 printf ( " |\n" ) ;
198 }
199 }
説明(5月18日14時30分追記)
ポインタを使わないといけないと書きましたが、そんなことありませんでした。
1要素ずつ計算する関数を作れば良いだけでした。
参考(追記についてのコード)
C
1 # include <stdio.h>
2
3 int jisu ;
4
5 int multij ( int fir [ ] [ jisu ] , int sec [ ] [ jisu ] , int i , int j ) ;
6 void disp ( int a [ ] [ jisu ] , int b [ ] [ jisu ] , int c [ ] [ jisu ] ) ;
7
8 int main ( void )
9 {
10 do
11 {
12 printf ( "Enter the dimension.\n" ) ;
13 scanf ( "%d" , & jisu ) ;
14 } while ( jisu < 2 || jisu > 6 ) ;
15
16 int a [ jisu ] [ jisu ] ;
17 int b [ jisu ] [ jisu ] ;
18 int c [ jisu ] [ jisu ] ;
19 printf ( "\ndefine matrix A." ) ;
20 for ( int m = 0 ; m < jisu ; m ++ )
21 {
22 for ( int n = 0 ; n < jisu ; n ++ )
23 {
24 printf ( "\nEnter a[%d][%d]\n" , m , n ) ;
25 scanf ( "%d" , & a [ m ] [ n ] ) ;
26 }
27 }
28
29 printf ( "\ndefine matrix B." ) ;
30 for ( int m = 0 ; m < jisu ; m ++ )
31 {
32 for ( int n = 0 ; n < jisu ; n ++ )
33 {
34 printf ( "\nEnter b[%d][%d]\n" , m , n ) ;
35 scanf ( "%d" , & b [ m ] [ n ] ) ;
36 }
37 }
38
39 for ( int m = 0 ; m < jisu ; m ++ )
40 {
41 for ( int n = 0 ; n < jisu ; n ++ )
42 {
43 c [ m ] [ n ] = multij ( a , b , m , n ) ;
44 }
45 }
46 disp ( a , b , c ) ;
47 }
48
49 int multij ( int fir [ ] [ jisu ] , int sec [ ] [ jisu ] , int i , int j )
50 {
51 int valueij = 0 ;
52 for ( int n = 0 ; n < jisu ; n ++ )
53 {
54 valueij += fir [ i ] [ n ] * sec [ n ] [ j ] ;
55 }
56
57 return valueij ;
58 }
59
60 void disp ( int a [ ] [ jisu ] , int b [ ] [ jisu ] , int c [ ] [ jisu ] )
61 {
62 printf ( "matrix A\n" ) ;
63 for ( int i = 0 ; i < jisu ; i ++ )
64 {
65 printf ( "|" ) ;
66 for ( int j = 0 ; j < jisu ; j ++ )
67 {
68 printf ( "%6d" , a [ i ] [ j ] ) ;
69 }
70 printf ( " |\n" ) ;
71 }
72
73 printf ( "matrix B\n" ) ;
74 for ( int i = 0 ; i < jisu ; i ++ )
75 {
76 printf ( "|" ) ;
77 for ( int j = 0 ; j < jisu ; j ++ )
78 {
79 printf ( "%6d" , b [ i ] [ j ] ) ;
80 }
81 printf ( " |\n" ) ;
82 }
83 printf ( "multiply A by B\n" ) ;
84 for ( int i = 0 ; i < jisu ; i ++ )
85 {
86 printf ( "|" ) ;
87 for ( int j = 0 ; j < jisu ; j ++ )
88 {
89 printf ( "%6d" , c [ i ] [ j ] ) ;
90 }
91 printf ( " |\n" ) ;
92 }
93 }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/18 04:17