• 締切済み

プログラムが間違っているようなのですが

ファイルからデータを読み込み、そのファイル内のデータの最大値・最小値を求めるプログラムを作ろうとしているのですが、実行結果が 最大値:0 最小値:0 となり、max2とmin2にうまく値が入っていないようなのです。 main関数にsub_main;を追記してみたりと色々試しているのですが、うまくいきません。 ファイルの読み込みがうまくいっていないのでしょうか。 もしくはポインタの使い方がまずいのでしょうか。 ファイルの内容は 20 40 30 ・ ・ ・ という感じの、不規則な数字の羅列で、今は10個入っています(データ個数が分からない場合も考えているのですが・・・)。 プログラム初心者なので難しいことはあまり分からないですが、助言を頂ければ嬉しいです。 #include<stdio.h> int sub_main(int *tensu,int *max,int *min) { int i=0; FILE *fp; fp = fopen("11.txt","r"); while(fscanf(fp,"%d",&*tensu)!=EOF); { for(i=0;i<10;i++) { if(*tensu+i>*max) *max=*tensu+i; if(*tensu+i<*min) *min=*tensu+i; } } fclose(fp); } main() { int max2=0,min2=0; int *max=&max2; int *min=&min2; printf("最大値:%d\n最小値:%d\n",max2,min2); }

みんなの回答

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.5

>main関数にsub_main;を追記してみたりと色々試しているのですが、うまくいきません。  sub_main 関数は、呼ばれてなんぼ、のものです。   ☆とはいえ、そこ以外は大きくいじってません。  もうあと少し、試行錯誤?すれば・・完動(感動?)だったのに。 《小さく改良》  ・sub_main 関数が int 型なのに戻り値がないから、データ個数としました。  ・min2 の初期値。 《なお》  ・fscanf は、まっとう?なデータである限り10ケと言わず、読み込みます。 《使用データ》← No.2 さんのを流用 10 20 59 659 10 20 59 659 ----------------------------------- #include<stdio.h> int sub_main( int *max, int *min ) {  FILE *fp;  int tensu, iCnt = 0;  fp = fopen( "11.txt", "r" );  while( fscanf( fp, "%d", &tensu ) != EOF ){   iCnt++;   if( tensu > *max ) *max = tensu;   if( tensu < *min ) *min = tensu;  }  fclose( fp );  return( iCnt ); } void main() {  int max2 = 0, min2 = 100000, iRet;  int *max = &max2;  int *min = &min2;  iRet = sub_main( max, min );  printf( "個数 %d\n最大値:%d\n最小値:%d\n", iRet, max2, min2 ); } 注:インデントに全角空白を用いています。タブに一括変換して下さい。

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.4

ポインタの練習をしたいのであれば、sub_mainの 呼び出しをご自分で書いてアップしてみてください。 なお、&*は続けて使えません。コンパイルエラーくら いは取り除いて質問しましょう。 また、引数で受けた変数を作業領域にすべきではあり ません。そんな使い方をするなら関数にしない方が 100倍ましです。引数で値を返すのもどうかと思えます。 関数は関数値で値を返すものです。 関数を作るなら、データ読み込み専用関数。 これの関数値にデータ数、読込んだデータは仕方なしに 引数渡し。 MAX関数、MIN関数と3つに分けるべきでしょう。

  • softimage
  • ベストアンサー率61% (68/111)
回答No.3

はじめまして。私も素人ですが少しだけコメントします。 質問にあるプログラムではmain関数以外動きません。 なぜならmain関数からsub_main関数の呼び出しがないからです。 最大、最小値のみであれば特に関数化の必要はないと思います。 アドレスやポインタなどかえってわかりづらくなりますので。 こんな感じでしょうか。 コンパイルしていないので動くかはわかりませんがご参考まで。 #include<stdio.h> int main(void) { FILE *fp; int num,max,min; fp = fopen("11.txt","r"); fscanf(fp,"%d",&num); max=min=num; while(fscanf(fp,"%d",&num)!=EOF); { if(num>max) max=num; if(num<min) min=num; } fclose(fp); printf("最大値:%d\n最小値:%d\n",max,min); }

Eltanin
質問者

補足

説明不足ですみません、補足です。 ポインタと関数化なしでは動くプログラムを作れたので、今回はポインタを使ってデータの受け渡しなどの練習をしてみようかと思いました。 ちなみに回答して頂いたプログラムはちゃんと動きました。

回答No.2

規則違反している質問の恐れがありますが…。 とりあえず、 ファイル読み込みが間違っています。 あと、プログラムを見る限りポインタを理解できていないようにも思えます。 まずは、ポインタを使用しないでやってみましょう。 あとfscanf、fprintfなどのライブラリ関数についても理解不足の部分があります。 下記サイトでテキストファイルの読み書きを理解してみましょう。 http://www.geocities.jp/ky_webid/c/036.html データ個数が不明とかの場合のことは、いまは無視して、 とりあえず、10個のデータが書かれているテキストファイルを読み込める様にしましょう。 テキストファイルといっても 「10 20 59 659」と改行無しかもしれないですし、 「10  20  59  659」 のように改行がある場合がありますよね。 ↑ ファイル読み込みのヒントです。

  • ogohs
  • ベストアンサー率33% (5/15)
回答No.1

色々試してほしいのでヒントを^^ 上記のプログラムの場合、 main() { int max2=0,min2=0; int *max=&max2; int *min=&min2; printf("最大値:%d\n最小値:%d\n",max2,min2); } しか実行されません。 C言語で、mainの中から他の関数を呼ぶ場合は明確に明記して下さい。 #include <stdio.h> void print() { printf("Hello!\n"); } main() { print(); } 簡単に書けばこんな感じです。

関連するQ&A

専門家に質問してみよう