ページ 11

並びかえ

Posted: 2011年1月27日(木) 14:51
by さき
ファイルの入出力をやっているのですが
以下のプログラムを作ってみました.

すると最高気温だけは表示されるのですが
最低気温と日付はエラーが発生して
上手く表示できません.

どこがおかしいのかわからないんで教えていただけないでしょうか?

コード:

#include<stdio.h>
#include<stdlib.h>

main(int ac,char *av[]){
  FILE *fp;
  int n[10];
  int a=0;
  float low[10],high[10];
  float min,max;
  int day,d1,d2;

  fp = fopen(av[1],"r");
  if(fp == NULL){
    printf("%sファイルが開けません\n",av[1]);
    exit(1);
  }
  while((fscanf(fp,"%d %g %g",&(n[a]),&(low[a]),&(high[a]))) != EOF){
    int day,d1,d2;
    if(low[a] <= min){
      min=low[a];
      d1=n[a];
    }
    if(high[a] >= max){
      max=high[a];
      d2=n[a];
    }
    a++;
  }
   printf("日付:%d, 最低気温: %g度 \n",d1,min);
   printf("日付:%d, 最高気温: %g度 \n",d2,max);
   fclose(fp);
}
[\code]

Re: 並びかえ

Posted: 2011年1月27日(木) 15:13
by bitter_fox
さき さんが書きました:ファイルの入出力をやっているのですが
以下のプログラムを作ってみました.

すると最高気温だけは表示されるのですが
最低気温と日付はエラーが発生して
上手く表示できません.

どこがおかしいのかわからないんで教えていただけないでしょうか?

コード:

  while((fscanf(fp,"%d %g %g",&(n[a]),&(low[a]),&(high[a]))) != EOF){
    int day,d1,d2;
  }
   printf("日付:%d, 最低気温: %g度 \n",d1,min);
   printf("日付:%d, 最高気温: %g度 \n",d2,max);

エラーが発生してというのはどういったエラーでしょうか?フォーラムルールには
フォーラムルール さんが書きました:3. どのようなエラーやトラブルで困っていて
とありますのでこれに従っていただきますようにお願いします。

また、int day, d1, d2;がループの中にあり、ループ毎に宣言されるので値の保持が出来ていません。
ループの外に出すなどしてください。

Re: 並びかえ

Posted: 2011年1月27日(木) 15:15
by さき
以下の様に実行結果がでました.

日付:-1074478712, 最低気温: 3.99103e-34度
日付:7, 最高気温: 30.1度

Re: 並びかえ

Posted: 2011年1月27日(木) 15:49
by bitter_fox
よく見れば、ループ外で既に宣言されてますね。
ですので、ループ内の
int day, d1, d2;
は不要です。

また、max及びminが初期化されていません。

ですので、ループは次のようにすると良いでしょう。

コード:

while((fscanf(fp,"%d %g %g",&(n[a]),&(low[a]),&(high[a]))) != EOF){
	if(low[a] <= min || a == 0){
	min=low[a];
	d1=n[a];
	}

	if(high[a] >= max || a == 0){
	max=high[a];
	d2=n[a];
	}

	a++;
}

Re: 並びかえ

Posted: 2011年1月27日(木) 17:56
by さかまき
http://dixq.net/forum/viewtopic.php?f=3&t=7680
こちらにお友達がいます。
入力ファイルの書式は向こうで見ているのでわかりましたが
普通はその書式もちゃんとかいて欲しいですね。
やはり構造体は使わなくてよいみたいですね。

それと、min、max という変数は使わないほうがよいですよ。
あと、変数dayは使われていません。