みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語のプログラミングについて教えてください

課題で下記に示すのようなデータをファイル名を入力してのそのデータを読み込みyの最大値とそのときのxの値を表示するプログラムを作成しろと言われたのですが、僕はプログラミングが初心者でむしろ苦手でホント困ってます。だれか助けてください、お願いします!

データ 
  x  y
0.12132 3.45355
0.12353  3.415451
. .
. .
. .
のようにxとyの行列となっていて、その数は2000個を超えています。
自分なりにやってみたのですがデータをすべて読み込まないし、まずどのようにして、yの最大値をだし、なおかつそのxの値を表示させるのもわかんなくてホント困っています。
本末転倒になりますが、プログラムを書いていただけるとほんと助かります。よろしくお願いいたします。
ちなみにこれが自分で考えたプログラムです。とりあえず、yの値がでかいのでyの最大値だけだすつもりでやってみたけど駄目でした。
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
FILE *fin;
char *list[256];
char buf[1024];
char filename1[80];

printf("入力ファイル名");
gets(filename1);

fin=fopen(filename1,"r");
if (fin ==NULL) {
printf("%sをオープンできません\n",filename1);
exit(1);
}

while (fgets(buf, 1024, fin) !=NULL) {
printf("%s",buf);
}
static float max;
int x;
fscanf(fin,"%f",&x);
if(x>max){
max=x;

printf("yの最大値=%f\n",max);
}
fclose(fin);
}

投稿日時 - 2009-04-17 14:53:08

QNo.4886555

すぐに回答ほしいです

質問者が選んだベストアンサー

ファイルのyが全部負だと初期化時の0が最大値になってしまうんです
1個目を読み込んだ時にそれを仮の最大値にするのがいいでしょう
ついでにデータの個数を数えるカウンタでもつけて
int count = 0;

while (fgets(buf, 1024, fin) !=NULL) { //buf配列に1行読み込む
printf("%s",buf); //読み込んだ文字列を表示
sscanf(buf,"%f %f", &x, &y);//読み込んだ文字列から2個の小数を読み込む
//追加
if (count == 0) {
max_x = x;// 1個目の場合xとyを記憶
max_y = y;
}
count++;
//追加終わり
if(y > max_y){// 読み込んだyが記憶している値より大きい場合
max_x = x;// xとyを記憶しておく
max_y = y;
}
}
のようにしてみました

投稿日時 - 2009-04-17 16:35:39

お礼

なるほど!だいぶ理解できました。
とても丁寧に回答していただきありがとうございました!
今回初めてこのような場所で質問しましたが、こんなに丁寧に教えていただけるとは思っていなくて今すごく感謝の気持ちでいっぱいです!自分の専門はプログラミングとは違いますが、自分の専門を極めてこんな風に回答してあげれたらなと思えてきました。
今回はほんとありがとうございました。

投稿日時 - 2009-04-17 17:22:01

ANo.2

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

xとyをペアで扱うのでyの最大値を記憶する変数max_yとそのときのxの値を記憶する変数max_xを用意します。
ファイルから読み込むための変数もfloat型でxとyを用意します。
なおmain関数内で処理が完結するので自分で初期化すればstaticはいりません(あっても問題ではないですが)
処理はwhileループ内で1行ずつ行います。
scanfするのはファイルからではなく読み込んだchar buf[ ]になるのでfscanfではなくsscanfを使います。
float max_x = 0.0f, max_y = 0.0f;
float x, y;
while (fgets(buf, 1024, fin) !=NULL) { //buf配列に1行読み込む
printf("%s",buf); //読み込んだ文字列を表示
sscanf(buf,"%f %f", &x, &y);//読み込んだ文字列から2個の小数を読み込む
if(y > max_y){// 読み込んだyが記憶している値より大きい場合
max_x = x;// xとyを記憶しておく
max_y = y;
}
}
printf("yの最大値=%f x=%f\n", max_y, max_x);
正の数限定でいいんですよね

投稿日時 - 2009-04-17 15:21:42

お礼

回答ありがとうございます。丁寧に教えていただきありがとございます。
データのxは正のみでyの値は負の値もあります。
回答のプログラムを用いたらうまくできたのですが、プログラム上で正と負だと違いがあるのですか?
たびたびすみません。

投稿日時 - 2009-04-17 16:10:16

あなたにオススメの質問