• 締切済み

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

ファイルからデータを読み込み、そのファイル内のデータの最大値・最小値を求めるプログラムを作ろうとしているのですが、実行結果が 最大値: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

  • C言語 最大値と最小値を求めて表示するプログラム

    はじめまして。 C言語を学習中です。 下記の問題演習の解答として記載されているプログラムがどうしても理解できません。 特にプログラムの最後の方のwhile文で最大値と最小値の判定をしているのかと思いますが、どのような計算をして判定しているのでしょうか。 while (array[i] != -1) { if (array[i] > *max) *max = array[i]; if (array[i] < *min) *min = array[i]; i++; 具体的に教えてください。 よろしくお願い致します。 ●問題 0~100の範囲で入力された複数の数値の中から、 最大値と最小値を求めて表示するプログラムを作成せよ。 -1が入力された場合は入力の終わりと判定する。 ただし、最大値と最小値はmain関数以外の一つの関数の中で求める。 また、入力された数値を記憶する配列の要素数は10とし、 それ以上入力された場合はエラーが起きても仕方ないこととする。 ヒント:配列の中に -1 があればデータの終わりだと判断できる。 ヒント:最小値を探すには、最大値を記憶した変数との比較を繰り返せば良い。 ●解答 #include <stdio.h> void maxmin(int array[],int *max,int *min); int main(void) { int i = 0,array[10],max,min; do { printf("%d 番目の数:",i + 1); scanf("%d",&array[i]); i++; } while (array[i - 1] != -1); maxmin(array,&max,&min); printf("最大値 %d : 最小値 %d\n",max,min); return 0; } void maxmin(int array[],int *max,int *min) { int i = 0; *max = 0; *min = 100; while (array[i] != -1) { if (array[i] > *max) *max = array[i]; if (array[i] < *min) *min = array[i]; i++; } }

  • cプログラム

    次の10人の身長を入れ、最大と最小を配列を使って求めるプログラムなんですが、この場合だと一人の身長データしか入力できません どのように直せばいいでしょうか? #include <stdio.h> main () { float h[10],max,min; int i; max=-999; min=999; for(i=0;i<=9;i=i+1){ printf("%d番目の身長を入力してください\n",i+1); scanf("%5.1f",&h[i]); if(h[i]>max){ max=h[i]; } if(h[i]<min){ min=h[i]; } } printf("最大の身長は%5.1f,最小の身長は%5.1fです。\n",max,min); return(0); }

  • javaプログラムについて

    コマンドライン引数から複数の値を受け取り、それらの最大と最小を表示する、というプログラムなのですが。 class Maxmin{   public static void main (String[] args) {    int max=Integer.MIN_VALUE;    int min=Integer.MAX_VALUE;    for (int i=0; i<args.length; i++){     int num= Integer.parseInt(args[i]);     if(num>max)     max=num;     if(num<min)     min=num;    }    System.out.println("最大値は" + max + "です。");    System.out.println("最小値は" + min + "です。");  } } このプログラムでも問題なく表示されるのですが、MIN_VALUEとMAX_VALUEを使用せずに表示する事、と指摘を受けました。自分の中でぱっと思いついたのがこれだったのですが、他にはどのような方法があるのでしょうか?

    • ベストアンサー
    • Java
  • プログラミング(C言語)についての質問です

    3つの整数の入力を受け付け、最大と最小を求める関数を作成し得られた結果を表示するプログラミングを作成したつもりなのですが、うまく作動しません。(コンパイルはできますが、結果が無茶苦茶になります。) ご教授宜しくお願いします。 それと、課題文にはポインタを使って最大値と最小値を同時に求めるようにと書いてあったのですが、それもよくわからないです。 今回初めてポインタと配列の受け渡しについて習ったのでよくわかっていない部分も多いと思うのですが、何卒宜しくお願いします。 ちなみに関数の形自体は void minmax(int data[],int *min,int *max){} で決まっています。 #include <stdio.h> void minmax(int data[],int *min,int *max){ int i; *min=*max=data[0]; printf("1st intenger:"); scanf("%d",&data[0]); printf("2st intenger:"); scanf("%d",&data[1]); printf("3st intenger:"); scanf("%d",&data[2]); for(i=1;i<3;i++){ if(*max<data[i]){ *max=data[i]; } if(*min>data[i]){ *min=data[i]; } } } int main(void){ int data[3],min,max; minmax(data,&min,&max); printf("最小値は%dで最大値は%dです",min,max); return 0; }

  • 処理の流れの説明のしかたがわかりません。

    プログラムの課題が出たのですがソースコードはなんとか穴埋めでできたのですが説明文を簡単につけなければならないのですがあんまり理解してないのでどのように説明したら良いかよくわかりません。お願いします。 10個の整数を配列し保存しそのデータのうちから最大値と最小値を表示するプログラムです。 #include <stdio.h> void main(void) { int data[10]; int i; int max,min; for(i=0;i<10;i++){ printf("input data No. %d ->",i+1); scanf("%d",&data[i]); } max=data[0]; min=data[0]; for(i=1;i<10;i++){ if(data[i]>max){ max=data[i]; } if(data[i]<min){ min=data[i]; } } printf("MAX = %d\n",max); printf("MIN = %d\n",min); } .

  • C言語から質問です。

    C言語から質問です。 /* main関数の中で初期化した配列 data[10]={60,30,70,25,20,9,92,55,20,10}; を関数 keisan() に引数として渡して、関数keisan()内で 平均値、最大値,最小値 を求め、その結果をmain関数に戻し、main関数内で 平均値、最大値,最小値を表示させるプログラムを作成せよ。 int keisan(const int data[], int data_kosuu, double answer[]) { return 0; } とする。 (注) プロトタイプ宣言を用いよ。 ヒント:平均値,最大値,最小値の3つの値を main関数に戻すやり方として、配列answer[]を使うとよい。 data_kosuu は、配列の要素数を与えるものです。 ヒント: (int型の変数)/(int型の変数)=int型の値です。 int型同士の割り算の答えANSWERをdoubleにしたい場合は、  ANSWER=(double)(int型の変数)/(int型の変数);    と(double) キャストという操作をする必要がある */ #include <stdio.h> int keisan(const int data[], int data_kosuu, double answer[]); int main(void) { int i; int a[10]={60,30,70,25,20,9,92,55,20,10}; // この値を使ってください double ans[3]; keisan(a,10); /* keisan関数に配列と配列要素数を引数で与える */ for(i=0; i<10 ; i++) printf("a[%d]=%d\n",i,a[i]); printf("平均=%lf 最小値=%d 最大値=%d\n",ans[0],ans[1],ans[2]); return 0; } /* 合計・最大値・最小値を求める関数 */ int keisan(const int data[], int data_kosuu, double answer[]) { int i; int sum; int min,max; min=10; /* min の初期化 */ max=10; /* max の初期化 */ sum=0; /* 合計値の初期化 */ for (i=0; i<10 ; i++){ sum = sum+data[i]; if(data[i] > max) max=data[i]; if(data[i] < min) min=data[i]; } sum=sum/10; answer[0]=sum; answer[1]=min; answer[2]=max; } エラー error C2198: 'keisan' : 呼び出しに対する引数が少なすぎます。 とでて先に進めません。 教科書などを見ても間違いがわかりません; 虫食いになってるところを自分なりにやってみたため、 根本的に間違ってるかもしれませんが、 どうかアドバイスや指摘などをお願いします。

  • C言語のプログラムを見てください

    ある100行の値がx列、y列の2列あるファイルを読み込んでそれを配列に入れ、yの最小値及びそれと同じ行にあるxの値を表示するプログラムを書きたいのですがy列の最小値を表示するプログラムを書き終えた所でコンパイルして実行してみると正しく値が表示されませんでした。それどころか実行するたびに値が変わってしまいます。どこがおかしいのかわからないため、ご指摘のほどよろしくお願いします。また、できれば同じ行にあるx列の値も表示させるプログラムを教えてください。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #define N 100 int main(void) { int x[N],i; double y[N],min; FILE *fp; fp=fopen("book.dat","r"); if(fp==NULL){ puts("can't open file!"); exit(-1); } for(i=0;i<N;i++){ fscanf(fp,"%d %lf", &x[N],&y[N]); printf("x=%d\n y=%lf\n",x[N],y[N]); } min=y[0]; for(i=1;i<N;i++){ if(y[i]<min) min=y[i]; } fclose(fp); printf("最小値:%lf\n",min); return 0; }

  • 入力された入力値と最大値、最小値を表示させるプログラムで、最大値と最小

    入力された入力値と最大値、最小値を表示させるプログラムで、最大値と最小値のプログラムを下記に作成してみたら最小値が0になりました。そして、もう一つ繰り返し文を作ってみたら、最大値・最小値がうまく表示されました。この違いはどうしてですか?教えてください。 import java.io.*; class Hairetu1 { public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("データはいくつですか?"); String str = br.readLine(); int num = Integer.parseInt(str); int a[]=new int[num]; int i; int max=0; int min=a[0]; for(i=0; i<a.length; i++){ System.out.print((i+1)+"番目は?"); str = br.readLine(); int tmp = Integer.parseInt(str); a[i] = tmp; if(max<tmp){ max=tmp; } if(min>tmp){ min=tmp; } } System.out.println("入力した値は"+test.length); System.out.println("最大は"+max); System.out.println("最小は"+min); } }

    • ベストアンサー
    • Java
  • プログラムが動きません。

    以前動いていたプログラムが動かなくなりました。 プログラムは3個のtxtファイル(2×2のデータ)で第1列の絶対値和、第2列の絶対値和を求め、1つのtxtファイルとして出力するものです。 #include <stdio.h> #define DATA_MAX 4 #define CH 2 static double data[CH][DATA_MAX]; int read_data(fp) FILE *fp;{ int i,j=0; while(1){ for(j=0;j<DATA_MAX;j++){ for(i=0;i<CH;i++){ fscanf(fp,"%lf",&data[i][j]); } if(feof(fp)!=0) break; } return j; } } void ecg_rr(fp,data_max) FILE *fp; { int i=0; char fname[64]; char fname1[64]; for(i=0;i<3;i++) { sprintf(fname1,"k%d.txt",i+1); fp = fopen(fname1,"r"); read_data(fp); fclose(fp); sprintf(fname,"sum.txt"); fp = fopen(fname,"a"); if(data[0][0]<0){data[0][0]=-data[0][0];} else{data[0][0]=data[0][0];} if(data[0][1]<0){data[0][1]=-data[0][1];} else{data[0][1]=data[0][1];} if(data[1][0]<0){data[1][0]=-data[1][0];} else{data[1][0]=data[1][0];} if(data[1][1]<0){data[1][1]=-data[1][1];} else{data[1][1]=data[1][1];} data[0][i]=data[0][0]+data[0][1]; data[1][i]=data[1][0]+data[1][1]; fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); fclose(fp); } } メイン関数には問題がないので省略しましたが、ここまでで問題というところはあるでしょうか?

  • なんらかの原因でtxtにデータを入力できない

    こんにちは。 C言語初心者です。 まずこのようなデータを用意しました。 kus1.txt 89 65 37 44 51 30 20 10 そして、このようなプログラムをし、ビルトしました。 #include <stdio.h> #define NUM 8 int main(void) { FILE *fp; int kusa[NUM]; int max,min; int i,k; fp = fopen("kus1.txt","r"); if(fp == NULL){ printf("ファイルオープン失敗\n"); return 1; } for(i=0; i<NUM; i++){ fscanf(fp, "%d", &kusa[i]); } max = kusa[0]; min = kusa[0]; for(k=0; k<NUM; k++){ if(max < kusa[k]) max = kusa[k]; if(min > kusa[k]) min = kusa[k]; printf("NO.%-5d%d\n", k+1, kusa[k]); } printf("最高は%d。\n", max); printf("最低は%d。\n", min); fclose(fp); return 0; } その後、コマンドプロンプトでこれを実行したところ、 ファイルオープン失敗 とでてきました。つまりなんらかの原因で失敗しました。 どうしたら成功できるのでしょうか。教えてください。

専門家に質問してみよう