🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

2回答

1874閲覧

各列の最大値を求めて、そこから最小値を求めるプログラム

YAT

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/12/25 06:16

昨日から丸一日考えてわからなかったので、質問お願いします。

テキストファイルから、各列の最大値を読み込み、その読み込んだ最大値の中から最小値を読み込んで出力するプログラムを作成したいのですが、どうすればいいのかがわかりません。

今回のテキストファイルと、現時点でのプログラム、コンパイル結果を以下に示します。

<テキストファイル(center.txt)>

4 0.0 4.0 5.0 7.0 4.0 0.0 3.0 3.0 5.0 3.0 0.0 4.0 7.0 3.0 4.0 0.0

<プログラム>

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> const int FNLEN = 50; /* ファイル名の長さ */ const int MAX_N = 100; /* ノード数最大値 */ int main() { FILE *fp; int i, j, nnode; double dem[MAX_N], dist[MAX_N][MAX_N], wdist[MAX_N][MAX_N],dist2[MAX_N]; char file_name[FNLEN]; /* データファイル名 */ printf("Data file name: "); scanf("%s", file_name); if ((fp = fopen(file_name,"r")) == NULL){ /* ファイルオープンに失敗した場合は終了 */ printf("%s: ファイルをオープンできません!\n", file_name); return -1; } printf("データファイル名: %s\n", file_name); fscanf(fp,"%d",&nnode); /* ノード数の読み込み */ if (nnode < 1 || nnode > MAX_N) { printf("ノードの数は1以上%3d以下にしてください!\n", MAX_N); return -1; } for (i = 0; i < nnode; i++){ /* 距離行列の読み込み */ for (j = 0; j < nnode; j++){ fscanf(fp, "%lf", &dist[i][j]); } } fclose(fp); /* ファイルクローズ */ for (i = 0; i < nnode; i++) { // 行 for (j = 0; j < nnode; j++) { // 列 printf("%.3f ", dist[i][j]); } printf("\n"); } int max1_index=0,max2_index=0;//各列の最大値 for (j = 0; j < nnode; j++) { for (i = 0; i < nnode; i++) { if(dist[i][j]>dist[max1_index][max2_index]){ max1_index=i; max2_index=j; } } } int min_index = 0;//各列の最大値の中の最小値(最大値の最小値) for (j = 0; j < nnode; j++) { if (dist[min_index] > dist[j]) { max1_index = j; } } printf("\n\nノードの列番号は %dで、その値は %.3f\n", min_index + 1, dist[max1_index][min_index]); /* 結果の出力 */ return 0; }

<現時点の実行結果>

$ ./a.out Data file name: center.txt データファイル名: center.txt 0.000 4.000 5.000 7.000 4.000 0.000 3.000 3.000 5.000 3.000 0.000 4.000 7.000 3.000 4.000 0.000 ノードの列番号は 1で、その値は 7.000

<期待する結果>

$ ./a.out Data file name: center.txt データファイル名: center.txt 0.000 4.000 5.000 7.000 4.000 0.000 3.000 3.000 5.000 3.000 0.000 4.000 7.000 3.000 4.000 0.000 ノードの列番号は 2で、その値は 4.000

実行結果を見ていて感じたことは、左から一列目の最大値を求められていることから、あとはすべての列の最大値を求め、そのすべての列の最大値の中の最小値を求めるプログラムを作成したいのですが、どうすればいいのかがわかりませんでした。

どのように実装すればいいのでしょうか。回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuma-s

2020/12/28 04:33

center.txt の入力データが対象行列になっていますが、そういう制約があるんでしょうか?
guest

回答2

0

C

1// foo.c 2#include <stdio.h> 3 4int main() { 5 int n; 6 scanf("%d", &n); 7 int row, col; 8 double max; // 各行の最大値 9 double min_of_max; // 最小の最大値 10 int min_index; 11 double value; 12 for ( row = 0; row < n; ++row ) { 13 for ( col = 0; col < n; ++col ) { 14 scanf("%lf", &value); 15 if ( col == 0 || max < value ) { 16 max = value; 17 } 18 } 19 if ( row == 0 || min_of_max > max ) { 20 min_of_max = max; 21 min_index = row; 22 } 23 } 24 printf("%d %.3f\n", min_index+1, min_of_max); 25 return 0; 26}

実行結果:

./a.out < center.txt 2 4.000

[追記] 行/列を入れ替えたやつ:

C

1#include <stdio.h> 2#include <stdlib.h> 3 4int main() { 5 int n; 6 scanf("%d", &n); 7 int row, col; 8 double* max; 9 double min_of_max; 10 int min_index; 11 double value; 12 13 max = (double*)malloc(sizeof(double)*n); 14 for ( row = 0; row < n; ++row ) { 15 for ( col = 0; col < n; ++col ) { 16 scanf("%lf", &value); 17 if ( row == 0 || max[col] < value ) { 18 max[col] = value; 19 } 20 } 21 } 22 for ( col = 0; col < n; ++col ) { 23 if ( row == 0 || min_of_max > max[row] ) { 24 min_of_max = max[col]; 25 min_index = col; 26 } 27 } 28 free(max); 29 printf("%d %.3f\n", min_index+1, min_of_max); 30 return 0; 31}

投稿2020/12/26 11:29

編集2020/12/29 02:50
episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAT

2020/12/27 03:56

回答ありがとうございます。 とても助かりました!!
episteme

2020/12/27 04:28

こんなんでいいんですか? あなたの元コードをガン無視してるんですけど。
fana

2020/12/28 04:09

求めたいのは > 列の最大値の中の最小値 だったのではないのだろうか? これだと "行"の最大値の中の最小値 なのでは…?
episteme

2020/12/28 04:31

↑ あらホント。 そーなると、僕のコードで要求を満たすには一旦行列を転置せんならんか(たいしたことないけど) 。
fana

2020/12/29 01:32

> if ( col == 0 || max[col] < value ) 各 col の最大値を求めるなら,ここは row==0 なのではないでしょうか. (あと,後段のforのループに使う変数名も col にしたい感)
episteme

2020/12/29 02:00

そっか、そだね。
fana

2020/12/29 02:46

(私が余計なことを言ったせいで…)後段ループ内に "row" が残ってしまっておりまする.
episteme

2020/12/29 02:51

あ、こちらこそお手数かけますぅ _o/L
guest

0

このプログラムそのままを活かすとして
各列の最大値のループでその最大値を入れる変数(配列)の作成
後はその配列から最小値を取得でいけるのでは?

投稿2020/12/25 07:08

ardin

総合スコア555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAT

2020/12/27 03:56 編集

だから、それをどのように実装すればいいのかと聞いているのです。
fana

2020/12/25 10:35

マルチポスト先でご丁寧に1から10まで説明されてるんだから,その通りにやればよいのでは?????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問