• 締切済み

入力ファイルを読み込み,得点,データ数(N),得点の平均(mean)と

入力ファイルを読み込み,得点,データ数(N),得点の平均(mean)と標準偏差(stdev),偏差値,偏差値の最小値(min)と最大値(max)を出力ファイルに書き込むプログラムを作りなさい.ただし,以下を守ること. 1 入力と出力のファイル名はキーボードから与えるようにすること. 2 入力ファイルを開くのは1回だけとし,1次元配列に読み込んで処理すること. という課題なのですが、この課題でint型とdouble型とchar型は使うと思うのですが 最低限定義すべき変数定義ってなにがありますか? 結構定義するものが多いと聞いたのですが何が必要かよくわかりません。

みんなの回答

回答No.1

> 最低限定義すべき変数定義 用いるデータ種類の数だけ要ります ・入力ファイル名 (char *) ・入力ファイルポインタ (FILE *) ・出力ファイル名 (char *) ・出力ファイルポインタ (FILE *) ・得点の配列 (int []) ・データ数 (int) ・平均値 (double) ・標準偏差 (double) ・偏差値の配列 (double []) ・最小偏差値 (double) ・最大偏差値 (double) ・ループ処理のインデックスカウンタ (int) 他にも計算の中間値や、読み書きのバッファとかは場合によって必要になります。

関連するQ&A

  • ファイルのデータがうまく読み込まれません

    こんにちは。ファイルからデータを読み込んで、平均値と標準偏差を求めるプログラムを書いているんですが、計算結果がなぜか違う値になってしまいます。書いているプログラムは、 #include<stdio.h> #include<math.h> #define MAX 200 /* ファイル"sample.txt"から複数の値を入力し、それらの  平均値、標準偏差を出力する.  */ void main(void) { FILE *fp; char text[256],l[256]; int i, n; float a[MAX], sum,sum2,mean,sdev; fp = fopen("sample.dat","r"); /* sample.txt を開く */ if(fp == NULL){ printf("Error!\n");exit(0);}/* sample.txtがなければ停止 */ for(i = 1; i <= 3; i++) fscanf(fp, "%s\n",text); for(i = 0; i < MAX; i++) { if(fscanf(fp, "%s %f\n",l, a[i]) == EOF ) ; } n = i; sum = a[0]; sum2 = a[0]*a[0]; for(i = 0; i < n; i++) { sum += a [i]; sum2 += a[i]*a[i]; } mean = sum/n; /* 平均値の計算 */ sdev = sqrt(sum2/n - mean*mean); /* 標準偏差の計算 */ printf(" mean : %6.2f\n", mean); printf("standard dev.: %6.2f\n",sdev); } で、読み込むファイルは 平均値と標準偏差の計算 クラスA組み 氏名 身長(cm) 鈴木 175.54 佐藤 170.34 清水 165.29 徳田 185.23 赤木 178.61 と、長くなってしまいましたが、if文の中のfscanfの部分が違うんでしょうか?初心者でどこが違うのか分かりません。教えていただけないでしょうか?

  • 入力されたテキストの行の中から最も文字数の多い行を表示するプログラム

    学校の課題なのですが、どうにも正しくプログラムできません もしお分かりになる方がいらっしゃったらご回答よろしくお願いします 条件、注意書きはほとんど書いた通りです 申し訳ありませんが早めのご回答お願いいたします #include <stdio.h> #define MAXLINE 1000 int getl(char s[], int lim){           不明箇所 } void copy(char to[], char from[]) { int i;  i=0;  while ((to[i] = from[i]) != '/0') ++i; } int main() { int len; int max; char line[MAXLINE]; char longest[MAXLINE]; max=0; while((len = getl(line,MAXLINE)) > 0) if(len > max){            不明箇所 } if(max > 0) printf("%d: %s", max, longest); return(0); } getl  標準入力から1文字ずつ読み込み、配列の先頭から順に格納する     読み込んだ文字が改行(/n)なら行末。/nを格納した次の要素に/0を格納     読み込んだ文字数(改行コード含む)を関数の値(戻り値にする) char s[]  読み込んだ文字を格納する文字配列       行末に達したら直後に/0 int lim  仮引数s[]の要素数。読み込む行の文字数がlimの値を超えるとそこで行の入力を打ち切る len  getlで読み込んだ行の文字数 line  getlで読み込んだ行を格納 longest  一番長かった行を保持 max  一番長かった行の文字数を保持 while  作成する関数の戻り値がEOFでない限り繰り返す      今読み込んだ行がこれまで一番長かった行より長い場合にはmaxを更新し、読み込んだ行をcopyでlongest[]にコピーしておく mainの最後でmax>0ならば(有効な行を読み込んでいたら)最も長い行を%sで表示 例 入力 123      12345      12   出力 12345    

  • この問題を解きましたが解答があっているのかわかりません。また違う解答があれば参考に教えてください。

    ます目の表現に MAX_R x MAX_C の 2 次元配列を用いているが、この配列を初期化するとき、関数 initboard() では、 void initboard(int board[][MAX_C]) { ... } と引数を2次元配列として定義している。この引数の定義を void initboard(int brd[]) { ... } と定義したとすると、関数 initboard() はどのように書けばよいか答えよ。 解答には関数 initboard() のみを記述すること。 私の解答 void initboard(int brd[]) { int i,j; for(i=0;i<;i++) for(j=0;j<;j++) brd[i][j]=EMPTY; } です。

  • javaプログラムについて

    * クラスの出席番号順にString型配列nameに名前が、 * int型配列scoreにテストの点数が格納されています。 * * 出席番号1 大悟 74点 * 出席番号2 琴音 70点 * 出席番号3 勇輝 88点 *       ・ *       ・ *       ・ *       ・ *       ・ * * このクラスの最高得点者の名前と、最低得点者の名前を * 表示するメソッドを作成してください。 * */ public class MethodAdd8 { public static void main(String[] args){ String[] name = {"大悟", "琴音","勇輝","葵","綾乃","和樹","凛","愛花","結愛","孝太郎"}; int[] score = {74,70,88,82,96,64,80,61,72,79}; //メソッドの呼び出し int max=saikou(score); //最高得点メソッドへ System.out.println(max); int min=saitei(score); //最低得点メソッドへ System.out.println(min); } //ここにメソッドを追加してください public static int saikou(int[] score){ //最高得点者メソッド int max=score[0]; for(int i=1; i<score.length; i++){ if(score[i]>max) max=score[i]; } return max;//値を返す } public static int saitei(int[] score){ //最低得点メソッド int min=score[0]; for(int i=1; i<score.length; i++){ if(score[i]<min) min=score[i]; } return min;//値を返す } } これで最高得点と最低得点は表示されるのですが、ここからどうやって最高得点者「綾乃」と最低得点者「愛花」を表示するのか分かりません。どなたか御教授お願い致します。

    • ベストアンサー
    • Java
  • 数字の入った配列をファイルへ出力。

    今、hist[256]というint型の配列に数字が入っているとします。 これを、テキストファイルに出力して、 0 242 5654 232 3123 756 ・ ・ ・ こんな感じで、ファイルに出力したいです。 文字としての出力になるのでhist[256]配列を、int型からchar型に変換しないとダメでしょうか? また、変換するとしたら、char型だと unsigned char にしても 0~256の値までしか1つの配列に保存できませんよね? もっと大きい数字も入っているので何とかする方法も教えて下さい。 初歩的な質問で申し訳ありませんが、よろしくお願いします。

  • C言語の穴埋め問題です

    次のプログラムは、初期化により文字列を定義し、辞書式配列にしたとき、どの文字列が先頭にくるかを調べるプログラムなのですが。■■■を教えてください #include <stdio.h> #include <string.h> #define N 5 //関数のプロトタイプ宣言 char *min(char *p[] , int n); int main(void) { char *p[N] = {"Hello" , "Hi" , "Happy" , "HaHaHa" , "Heaven"}; printf("辞書式配列で先頭となる文字列は%s\n" , ■■■); } char *min(char *p[] , int n) { int min; //最小値のアドレス Int i; //カウンタ min = 0; for(i = 1; i < n; i++){ if (strcmp(■■■ , ■■■) > 0){ ■■■= ■■■; } } return ■■■; }

  • データ数の多い構造体配列

    メンバが配列である構造体配列を定義したいのですが、 struct hei { double *hight=(double*)malloc(sizeof(double) * 2*max + 1); }; int main() { struct hei h[10]; : : : という風にはできないのでしょうか。 「構文エラー : ';' が '=' の前にありません」とエラーが出てしまいます。

  • プログラミング(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; }

  • なんらかの原因で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; } その後、コマンドプロンプトでこれを実行したところ、 ファイルオープン失敗 とでてきました。つまりなんらかの原因で失敗しました。 どうしたら成功できるのでしょうか。教えてください。

  • ソート

    お世話になります。配列のソートなのですが、どうも思い通りの結果になりません。 配列の中から最大値と最小値を探し、最小値を配列0に、最大値を配列の最後に移動します。その2つ以外の数字の順番は変えません。 例) {4,3,2,0,1,2} 最小値は0、最大値は4なので→{0,3,2,1,2,4} {4,3,2,1} → {1,3,2,4} {1,3,2,4,} → {1,3,2,4} 流れとしては、まず最小値を求め配列0に移動させ、次に最大値を求め配列の最後に移動させようと思います。 プログラムは以下のように組みました。 public int[] sortOfSort(int[] array) { int count_min = 0; int min = array[0]; for (int i = 0; i < array.length-1; i++) { // 最小値を求める if (min > array[i + 1]) { min = array[i + 1]; count_min++; // 最小値の配列のインデックスを確保 } } for (int k = count_min; k > 0; k--) { // 最小値の移動 int temp_min = array[k - 1]; array[k - 1] = array[k]; array[k] = temp_min; } int count_max = 0; int max = array[0]; for (int j = 0; j < array.length-1; j++) { // 最大値を求める if (max < array[j + 1]) { max = array[j + 1]; count_max++; // 最大値の配列のインデックスを確保 } } for (int l = count_max; l < array.length-1; l++) { //最大値の移動 int temp_max = array[l + 1]; array[l + 1] = array[l]; array[l] = temp_max; } return array; } 間違っているところがわかりましたら宜しくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう