質問編集履歴

1

プログラムの修正、前提への追記

2022/07/05 06:52

投稿

karintage
karintage

スコア5

test CHANGED
File without changes
test CHANGED
@@ -10,7 +10,11 @@
10
10
  0.7 0.8 0.9
11
11
 
12
12
  のように、1行目に行、列のサイズ、2行目以降が行列の内容となっています。
13
-
13
+ //追記
14
+ プログラム実行時に、以下のようにファイルを指定します。
15
+ ```ここに言語を入力
16
+ javau Matrix A.txt B.txt C.txt
17
+ ```
14
18
  ### 実現したいこと
15
19
  以下の例のように、3*3行列と指定されているのに対し、実際の行列が2*3であるように、指定されたサイズと入力されたサイズが異なる場合、その旨("M×Nと行列のサイズが一致しません")を出力したいです。
16
20
 
@@ -43,13 +47,19 @@
43
47
  ### 該当のソースコード
44
48
 
45
49
  ```Java
50
+ /**
51
+ プログラム:ファイルの値を読み込み二次元配列に格納する
52
+ 二次元配列を用いて行列積、和、差を計算する
53
+ */
46
54
  import java.io.*;
47
55
  import java.text.Format;/* フォーマットのため */
48
56
  import java.text.DateFormat;/* 日付のフォーマット用 */
57
+ import java.util.Calendar;
58
+ import java.text.SimpleDateFormat;
49
59
 
50
60
  public class Matrix{
51
-
61
+
52
- private double[][] m;//条件(1)行列をprivate名double型のメンバ変数とする
62
+ private double[][] m;//条件(1)行列をprivate名,double型のメンバ変数とする
53
63
  private int row, col;//行サイズと列サイズをprivateなint型のメンバー変数とする
54
64
 
55
65
  /*条件(2)Matrixクラスのコンストラクタとして、無引数のものpublic Matrix()を作成 */
@@ -74,17 +84,40 @@
74
84
  mat.m = new double[mat.row][mat.col];//配列のサイズを指定
75
85
 
76
86
  for (int row_read = 0; row_read < mat.row; row_read++) {//読み込む行を指定
77
-
78
87
  if(rowcol==null){
79
88
  System.err.println("M×Nと行列のサイズが一致しません");
80
89
  System.exit(1);
81
90
  }
82
91
  String[] record = br.readLine().split(" "); //(row_read)行の文字列を読み込み、空白で分割
83
92
  for (int col_read = 0; col_read < mat.col; col_read++){//読み込む列を指定
93
+ if(record[col_read]==null){
94
+ System.err.println("M×Nと行列のサイズが一致しません");
95
+ System.exit(1);
96
+ }
84
97
  mat.m[row_read][col_read] = Double.parseDouble(record[col_read]);//読み込んだ値をdouble型に変換して二次元配列に格納
85
98
  }
86
99
  }
100
+ br.close();
87
- }
101
+ }
102
+ /*ファイルが存在しない場合、エラーを出力しプログラム終了 */
103
+ catch (FileNotFoundException e) {
104
+ e.printStackTrace();
105
+ System.exit(1);
106
+ }
107
+ /*フォーマットエラーの場合、エラーを出力しプログラム終了 */
108
+ catch (NumberFormatException e) {
109
+ e.printStackTrace();
110
+ System.exit(1);
111
+ }
112
+ /*stackした場合、エラーを出力しプログラム終了 */
113
+ catch (IOException e) {
114
+ e.printStackTrace();
115
+ System.exit(1);
116
+ }
117
+
118
+ return mat;//作成したオブジェクトを返り値とする
119
+ }
120
+
88
121
  /*条件:(5)Matrixクラスが保持するM×N行列の中身の要素をプリントするvoid型のprint()関数*/
89
122
  public void print(){
90
123
  System.out.printf("サイズ:(%d,%d)\n",row,col);//行列のサイズを出力
@@ -98,7 +131,60 @@
98
131
  }
99
132
  System.out.println();//改行
100
133
  }
134
+
135
+ /*条件(3) :行列の乗算を実行し、結果を別のMatrixクラスのオブジェクトとして返す関数*/
136
+ public Matrix multiply(Matrix B) {
137
+ /*行列A:M×K,行列B:K×NのKが一致していない場合エラー文を出力し、プログラムを終了*/
138
+ if (col != B.row){
139
+ System.err.print("Aの列サイズとBの行サイズが一致しません");
140
+ System.exit(1);
141
+ }
142
+ Matrix D = new Matrix(row, B.col);//乗算の結果を格納するオブジェクトDを作成
143
+ /*3重ループで行列積を計算 */
144
+ for (int i = 0; i < row; i++){
145
+ for (int j = 0; j < B.col; j++) {
146
+ for (int k = 0; k < B.row; k++){
147
+ D.m[i][j] += m[i][k] * B.m[k][j];
148
+ }
149
+ }
150
+ }
151
+ return D;//オブジェクトDを戻り値とする
152
+ }
153
+
154
+ /*条件(4):Matrixクラスの2つのサイズが一致するオブジェクトに対して、要素ごとの加算(add)を行う関数*/
155
+ public Matrix add(Matrix B){
156
+ /*条件(D):Matrixクラスの2つのサイズが一致しない場合プログラムを終了*/
157
+ if(row != B.row || col != B.col){
158
+ System.err.print("行列Cと行列Dの行、列のサイズが異なります");
159
+ System.exit(1);
160
+ }
161
+ Matrix E = new Matrix(row,col);//加算の結果を格納するオブジェクトEを作成
162
+ /*2重ループで加算を行う */
163
+ for(int i=0; i<row; i++){
164
+ for(int j=0; j<col; j++){
165
+ E.m[i][j]=m[i][j]+B.m[i][j];
166
+ }
167
+ }
168
+ return E;//オブジェクトEを戻り値とする
169
+ }
170
+
171
+ /*条件(4):Matrixクラスの2つのサイズが一致するオブジェクトに対して、要素ごとの減算(subtraction)を行う関数*/
172
+ public Matrix sub(Matrix B){
173
+ /*条件(D):Matrixクラスの2つのサイズが一致しない場合プログラムを終了*/
174
+ if(row != B.row || col != B.col){
175
+ System.exit(1);
176
+ }
177
+ Matrix F = new Matrix(row,col);//減算の結果を格納するオブジェクトFを作成
178
+ /*2重ループで加算を行う */
179
+ for(int i=0; i<row; i++){
180
+ for(int j=0; j<col; j++){
181
+ F.m[i][j]=m[i][j]-B.m[i][j];
182
+ }
183
+ }
184
+ return F;//オブジェクトFを戻り値とする
185
+ }
186
+
101
- /*main文 */
187
+ /*main文 */
102
188
  public static void main(String[] args){
103
189
  try {
104
190
  Matrix mat=new Matrix();//条件(A):main関数から無引数のMatrixのコンストラクタを呼び出し、Matrixオブジェクトを生成する
@@ -119,6 +205,36 @@
119
205
  Matrix C=mat.read(args[2]);//args[2]から作成した配列を配列Cとする
120
206
  System.out.print("入力行列C,");
121
207
  C.print();//配列Cを出力
208
+
209
+ /*条件(C):3=<M,N,K=<10を満たしていない場合は警告文を出力、プログラム終了*/
210
+ if(A.row<3||A.row>10||A.col<3||A.col>10||B.col<3||B.col>10){
211
+ System.err.println("3=<M,N,K=<10を満たしていません");
212
+ System.exit(1);
213
+ }
214
+ /*条件(C):M,N,Kがすべて同じ場合、警告文を出力、プログラム終了 */
215
+ if(A.row==A.col&&A.col==B.col&&A.row==B.row){
216
+ System.err.println("M,N,Kのどれか一つは他と違う値にしてください");
217
+ System.exit(1);
218
+ }
219
+ /*条件(C):乗算を実行する */
220
+ Matrix D=A.multiply(B);
221
+ System.out.print("出力 積行列 D=A×B,");
222
+ D.print();
223
+
224
+ /*条件(D):行列Cと行列Dの要素ごとの加算、結果を出力*/
225
+ Matrix E=C.add(D);
226
+ System.out.print("出力 要素和行列 E=C+(A×B),");
227
+ E.print();
228
+ /*条件(D):行列Cと行列Dの要素ごとの減算、結果を出力*/
229
+ Matrix F=C.sub(D);
230
+ System.out.print("出力 要素差行列 F=C-(A×B),");
231
+ F.print();
232
+
233
+
234
+ }
235
+ catch (Exception e) { e.printStackTrace(); }
236
+ }
237
+ }
122
238
  ```
123
239
 
124
240
  ### 試したこと