• 締切済み

成績処理のプログラムについて・・・

成績処理のプログラムについて・・・ 先日、http://okwave.jp/qa/q5911162.htmlにて質問させていただいたのですが、今回は平均点の計算及び出力について教えていただければと思います。 #include "stdafx.h" void input(void); void calc(void); void edit(void); int gakusei=10,kamoku=5; /*学生数、科目数*/ char kamokumei[5][40]; /*科目名*/ char shimei[10][40]; /*氏名*/ int tennsuu[10][5]; /*点数*/ float heikin[10]; /*平均点*/ void main() { input(); calc (); edit (); } void input(void) /*データ入力(infile.d.txtから読み込む)*/ { FILE *fp; int m,n,k; fp=fopen("infile.d.txt","r"); if(fp==NULL) { printf("infile.d.txtが開けません\n"); } fscanf(fp,"%d %d\n",&gakusei,&kamoku); for(m=0; m<kamoku; m++) { fscanf(fp,"%s",kamokumei[m]); } for(n=0; n<gakusei; n++) { fscanf(fp,"%s",shimei[n]); } fscanf(fp,"%s %s・・・%s",&tennsuu[0][0],&tennsuu[1][0],・・・ ,&tennsuu[9][0]); ・・・ fscanf(fp,"%s %s・・・%s",&tennsuu[0][4],&tennsuu[1][4],・・・,&tennsuu[9][4]); fclose(fp); } void calc(void) /*各学生の平均点を計算、平均点の優秀者(80点以上)及び不合格者(60点未満)を摘出*/ { int n,k; float sum=0; for(n=0; n<gakusei; n++) { for(k=0; k<kamoku; k++) { sum+=(float)tennsuu[n][k]; } heikin[n]=sum/kamoku; } } void edit(void) /*平均点、優秀者及び不合格者の氏名を付加した成績表を出力(outfile.d.txtに書き込み)*/ { FILE *seiseki; int m,n,k; seiseki=fopen("outfile.d.txt","w"); fprintf(seiseki,"氏名"); for(m=0; m<kamoku; m++) { fprintf(seiseki," %s",kamokumei[m]); } fprintf(seiseki," 平均\n"); fprintf(seiseki,"%s %s %s・・・%s %d\n",shimei[0],&tennsuu[0][0],&tennsuu[1][0],・・・,&tennsuu[4][0],heikin[0]); ・・・ fprintf(seiseki,"%s %s %s・・・%s %d\n",shimei[9],&tennsuu[5][4],&tennsuu[6][4],・・・,&tennsuu[9][4],heikin[9]); fprintf(seiseki,"\n"); fprintf(seiseki,"平均点優秀者\n"); fprintf(seiseki,"平均点不合格者"); fclose(seiseki); } 上記のプログラムを"outfile.d.txt"に出力してみると、平均点が82となる部分が-1610612736、74となる部分が-1610612736と表示されたりしてしまいます。 平均点の計算部分が違うのか、出力の仕方が悪いのか色々試してみたのですが思うようにできません。 どのように直せばよいのでしょうか? よろしくお願いします。 また、平均点の優秀者・不合格者の摘出方法についてもどのようにすれば良いのか教えて頂けるとありがたいです。

みんなの回答

回答No.1

細かいとこをみれば他にもあるかもしれませんが、ちらっと眺めたところでおかしいのは ・tensuu[][]がint型なのに、fscanf, fprintfで%s指定で入出力してる。 ・入力データの点数は1行に2人分記載されているのに、計算処理部分でそれが考慮されていない。 ・heikin[]はfloat型なのに、fprintfで%dで出力してる。 優秀者、不合格者は単純にループで平均点を比較して該当の者だけ氏名を出力すれば良いだけです。(成績順とかいう条件が無ければ) fprintf(seiseki,"平均点優秀者 "); for (i=0; i<gakusei; i++) { if (heikin[i]>=80.0) fprintf(seiseki, " %s", shimei[i]); } fprintf(seiseki,"\n平均点不合格者"); for (i=0; i<gakusei; i++) { if (heikin[i]<60.0) fprintf(seiseki, " %s", shimei[i]); } fprintf(seiseki,"\n");

関連するQ&A

  • C++でfscanf関数・fprintf関数を利用した成績処理のプログ

    C++でfscanf関数・fprintf関数を利用した成績処理のプログラムを作成しています。 #include "stdafx.h" void input(void); void calc(void); void edit(void); int gakusei=10,kamoku=5; /*学生数、科目数*/ char kamokumei[5][40]; /*科目名*/ char shimei[10][40]; /*氏名*/ int tennsuu[10][5]; /*点数*/ float heikin[10]; /*平均点*/ void main() /*メイン関数*/ { input(); calc (); edit (); } void input(void) /*データ入力(infile.d.txtから読み込む)*/ { FILE *fp; int n,k; fp=fopen("infile.d.txt","r"); if(fp==NULL) { printf("infile.d.txtが開けません\n"); } printf("infile.d.txt\n\n"); fscanf(fp,"%d %d",&gakusei,&kamoku); printf("%d %d\n",gakusei,kamoku); fscanf(fp,"%s",kamokumei); printf("%s\n",kamokumei); fscanf(fp,"%s",shimei); printf("%s\n",shimei); while(fscanf(fp,"%s",tennsuu)!=EOF) { printf("%s\n",tennsuu); } printf("\n\n"); fclose(fp); } void calc(void) /*各学生の平均点を計算、平均点の優秀者(80点以上)及び不合格者(60点未満)を摘出*/ { int n,k; float sum; for(n=0; n<gakusei; n++) { sum=0; for(k=0; k<kamoku; k++) { sum+=(float)tennsuu[n][k]; } heikin[n]=sum/kamoku; } } void edit(void) /*平均点、優秀者及び不合格者の氏名を付加した成績表を出力(outfile.d.txtに書き込み)*/ { int n; FILE *seiseki; seiseki=fopen("outfile.d.txt","w"); printf("outfile.d.txt\n\n"); fprintf(seiseki,"氏名 %s 平均\n",kamokumei); printf("氏名 %s 平均\n",kamokumei); fprintf(seiseki,"%s\n",shimei); printf("%s\n",shimei); for(n=0; n<gakusei; n++) { fprintf(seiseki,"%s",tennsuu); printf("%s\n",tennsuu); } printf("\n"); fprintf(seiseki,"平均点優秀者\n"); printf("平均点優秀者\n"); fprintf(seiseki,"平均点不合格者"); printf("平均点不合格者\n"); fclose(seiseki); } 添付した画像のoutfile.d.txtのようなフォーマットで出力したいのですが、氏名がうまく出力できません。また、点数もinfile.d.txtの最後の行しか読み込んでくれません。 どのように書き換えればよいのでしょうか? よろしくお願いします。 *infile.d.txtについて 10 5 ⇒学生数と科目数 材料力学 熱力学 ・・・ ⇒科目名 石川 川上 佐藤 ・・・ ⇒学生の氏名 78 95 75 86 ・・・ ⇒各科目の点数(1行につき5科目×2人分の点数が書き込まれています。)

  • C言語を始めたばかりですが、なかなか難しいです。

    C言語を始めたばかりですが、なかなか難しいです。 下記のプログラムですが、誤りを指摘して頂けないでしょうか? /************************************************************************ 合計と平均を求める ************************************************************************/ #include <stdio.h> #define KAMOKU 3 main() { int ten[KAMOKU]={73,59,92}; /*得点*/ int goukei=0; /*合計点*/ double heikin; /*平均点*/ char shimei[20]="太郎"; /*氏名*/ char kamokuName[KAMOKU][10]={"国語","数学","英語"}; int i; /*科目数*/ /*合計点と平均点の算出*/ for(i = 0; < KAMOKU;i++) { goukei+=ten[i]; } heikin=(double)goukei / i; /*画面に表示*/ printf("氏名:%s\n",shimei); for(i = 0; < KAMOKU;i++) { printf("%-6s:%3d点\n",kamokuName[i],ten[i]); } printf("\n"); printf("%sさんの合計:%3d点 平均:%5.1f点\n",shimei,goukei,heikin); エラーメッセージは for.c: In function ‘main’: for.c:18: error: expected expression before ‘<’ token for.c:27: error: expected expression before ‘<’ token です。 どうぞ宜しくお願い致します。

  • フーリエ変換のC言語プログラムについて

    正弦波(およびガウス性雑音)をフーリエ変換(離散)→逆フーリエ変換するというプログラムを組みました。正弦波をフーリエ変換すると実部は2回ピークがくるはずなのですが、すべて「0.000000」または「-0.000000」と表示されてしまいます。虚部は正常なようで実装の仕方もさほど違わないので、何が問題なのかわからずにいます。念のためコードはすべて載せますが、該当箇所は関数Fourierの fp = fopen("reX.txt", "w"); //書き込む あたりです。問題点を教えていただけないでしょうか。お願いします。 //gauss.txt, sin.txt:発生させたガウス性雑音&正弦波 //reX, imX:フーリエ変換の実部と虚部 //re-1, im-1:逆フーリエ変換の実部と虚部 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #define PI 3.14159265358979323846 #define N 256 //n:長さ, w:角周波数, p:位相(phase), a:振幅 void SinCurve(int n, double w, double p, double a) { FILE *fp; double x; int t; fp = fopen("sin.txt", "w"); //書き込むので"w" if(fp == NULL) { printf("file open error\n"); } else { for(t = 0; t < n; t++) { x = a * sin( w*(double)t + p ); fprintf(fp, "%f\n", x); } } fclose(fp); } //n:長さ, s:分散, m:平均 void Gauss(int n, double s, double m) { FILE *fp; double x, x1, x2, y1; int t; srand((unsigned) time(NULL)); fp = fopen("gauss.txt", "w"); //書き込むので"w" if(fp == NULL) { printf("file open error\n"); } else { for(t = 0; t < n; t++) { x1 = ( (double)rand() + 1.0 ) / ( (double)RAND_MAX + 2.0); x2 = ( (double)rand() + 1.0 ) / ( (double)RAND_MAX + 2.0); y1 = pow(-2.0*log(x1), 0.5) * cos(2.0*PI*x2); y1 = s * y1 + m; fprintf(fp, "%f\n", y1); } } fclose(fp); } //ファイル名sのデータをフーリエ変換し、実部と虚部をreX, imXに保存 void Fourier(int num, char *s) { FILE *fp; int k, n; double largeX, x[N+100], t; fp = fopen(s, "r"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { // printf("%s\n", s); for(k = 0; k < num; k++) { fscanf(fp, "%lf", &x[k]); printf("x[%d]=%f\n", k, x[k]); } } fp = fopen("reX.txt", "w"); //書き込む if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { largeX = 0.0; t = 2.0*PI*(double)k / (double)N; for(n = 0; n < num; n++) { largeX += x[n] * cos((double)n*t); // printf("%f\n", largeX); } fprintf(fp, "%f\n", largeX); printf("reX[%d]=%f\n", k, largeX); } } fp = fopen("imX.txt", "w"); //書き込む if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { largeX = 0.0; t = 2.0*PI*k / (double)N; for(n = 0; n < num; n++) { largeX -= x[n] * sin(n*t); } fprintf(fp, "%f\n", largeX); } } fclose(fp); } void InverseFourier(int num) { FILE *fp; int k, n; double a[N+100], b[N+100], x, t; //a:reX, b:imX fp = fopen("reX.txt", "r"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { fscanf(fp, "%lf", &a[k]); // printf("a[%d]=%f\n", k, a[k]); } } fp = fopen("imX.txt", "r"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { fscanf(fp, "%lf", &b[k]); // printf("b[%d]=%f\n", k, b[k]); } } fp = fopen("re-1.txt", "w"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(n = 0; n < num; n++) { x = 0.0; t = 2.0*PI*(double)n / (double)N; for(k = 0; k < num; k++) { x +=a[k] *cos(k*t) - b[k] *sin(k*t); } x /= (double)N; fprintf(fp, "%f\n", x); // printf("x[%d]=%f\n", n, x); } } /* fp = fopen("im-1.txt", "w"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(n = 0; n < num; n++) { x = 0.0; for(k = 0; k < num; k++) { t = 2.0*PI*(double)k / (double)N; x = x + a[k] *sin(n*t) + b[k] *cos(n*t); } x /= (double)N; fprintf(fp, "%f\n", x); } } */ fclose(fp); } int main(void) { SinCurve(N, PI/8.0, 0.0, 1.0); // Gauss(N, 1.0, 0.0); Fourier(N, "sin.txt"); // Fourier(N, "gauss.txt"); InverseFourier(N); return 0; }

  • fscanf関数について

    -------------------------------------------------- #include<stdio.h> #include<stdlib.h> int main() { FILE*fp; int ch,dt; char ss[80]; if((fp=fopen("bbb.txt","w"))==NULL){ printf("出力ファイルをオープンできません.\n"); exit(1); } fprintf(fp,"%c",'A'); fprintf(fp,"%s\n","abcdeABCDE"); fprintf(fp,"%d\n",1234); fclose(fp); if((fp=fopen("bbb.txt","r"))==NULL){ printf("入力ファイルをオープンできません.\n"); exit(1); } ch=fgetc(fp); printf("ch=%c\n",ch); fscanf(fp,"%s",ss); printf("ss=%s\n",ss); fscanf(fp,"%d",&dt); printf("dt=%d\n",dt); fclose(fp); return 0; } -------------------------------------------------- 以上のプログラムで、プログラムの通り「bbb.txt」は、 AabcdeABCDE 1234 となっております。 そこで疑問なのですが、「ch=fgetc(fp);」は1文字読み込みなので、'A'だけと分かるのですが、「fscanf(fp,"%s",ss);」はfpからの読み込みで何故、 AabcdeABCDE 1234 の全部を読み込まず、'A'を抜かした、「abcdeABCDE」だけを読み込んでくれるのか? 後、「fscanf(fp,"%d",&dt);」は何故「AabcdeABCDE」を抜かした、「1234」だけを読み込んでくれるのかが分かりません。 「fscanf(fp,"%d",&dt);」については数値だけを読み込んでくれるのかと思い、 ch=fgetc(fp); printf("ch=%c\n",ch); fscanf(fp,"%s",ss); printf("ss=%s\n",ss); の部分を無くせば、「1234」だけを読み込んでくれるのかと思ったのですが、数値は正しく表示されません。 以上教えていただければ嬉しいです。

  • プログラムについて質問です。

    プログラム初心者なのですが最短経路を探すプログラムを書きました。実行もできるのですが時間がかなりかかるので時間を短縮したいのですがどうすればいいでしょうか。環境はvisualC++2008を使ってます。 #include<stdio.h> #include<limits.h> #include<stdlib.h> #include<time.h> #define N 1000 #define E 3998 int e[N+1][N+1]; int w[N+1][N+1]; int s, sink; int minLen;//始点sからどの点に移るか決める int j; int m; int u[N+1];//距離 int f[N+1]={0}; int prev[N+1];//通ったノード int start = 1; int goal = 4; void tansaku(int start) { for ( j=0 ; j<=N ; j++ ){ u[j] = 1000; } //始点s=0とする s = start; f[s] = 1; u[s] = 0; for( m=1 ; m<=N ; m++ ){ printf("現在位置[%d]\n", s); //点sは最短経路決定 for( j=1 ; j<=N ; j++ ){ printf("e[%d][%d]=%d \nw[%d][%d]=%d\n\n", s, j, e[s][j], s, j, w[s][j]); if( e[s][j] != 1 ){ //printf("[%d]には繋がってない\n", j); //printf("-----------------------------------------\n"); continue; //枝(s,j)が存在しなければ以下の処理をスキップする } printf("[%d]に繋がってる→", j); if( u[s]+w[s][j] < u[j] ){ printf("重み更新!\n"); u[j]=u[s]+w[s][j]; prev[j]=s; //点jへの経路長を更新、最短経路規定の点は除外 printf("u[%d] = %d\n", j, u[j]); printf("prev[%d] = %d\n", j, prev[j]); }else{ printf("重み更新なし...\n"); } printf("-----------------------------------------\n"); } /***************** 点sからどの点に移るか決める工程*******************/ minLen = 1000; for( j=1 ; j<=N ; j++ ){ if( f[j] == 1 ){ printf("%dは通過済み\n", j); continue; } printf("u[%d] = %d\n", j, u[j]); if( u[j] < minLen ){ //点sは経路長が最短 minLen = u[j]; f[j] = 1; s = j; } //ヒープを使う } if(s == goal){ printf("到着!!!!!\n"); minLen = 0; printf("[経路]:"); while(s != start){ printf("%d ←", s); s = prev[s]; } printf("%d\n距離=%d\n", start, u[goal]); exit(1); } printf("次は%dです。\n", s); } printf("%d\n", prev[N]); } int main(void) { FILE *fp; fopen_s(&fp, "text2.txt","r"); while ((fscanf_s(fp, "%d %d %d", &s, &j, &minLen)) != EOF){ printf("read\n"); e[s][j] = 1; //以下は1→2と2→1を同一に見なす w[s][j] = minLen; e[j][s] = 1; w[j][s] = minLen; } fclose(fp); tansaku(1); return 0; }

  • 行列の積を計算するプログラムがうまくいきません

    どこが間違っているのかわかる方お願いします ・行列A,Bはファイルから読み込む ・行列A,Bの積Cの計算には関数を用いる #include<stdio.h> #define ROW 10 #define COL 10 void MatrixProduct(int a[][COL],int b[][ROW],int c[][ROW],int n,int m ) { int i,j,k; for(i=0;i<n;i++){ for(j=0;j<n;j++){ c[i][j]=0; } } for(i=0;i<n;i++){ for(j=0;j<n;j++){ for(k=0;k<m;k++){ c[i][j]=c[i][j]+a[i][k]*b[k][j]; } } } } int main(void) { FILE *fp1,*fp2; char fname1[64],fname2[64]; int a[ROW][COL],b[ROW][COL],c[ROW][COL],n,m; int i,j,k; printf("Input file name ?"); scanf("%s",fname1); printf("Output file name ?"); scanf("%s",fname2); fp1=fopen(fname1,"r"); fp2=fopen(fname2,"w"); fscanf(fp1,"%d %d",&n,&m); MatrixProduct(a,b,c,n,m); for(i=0;i<n;i++){ for(j=0;j<n;j++){ fprintf(fp2,"%3d",c[i][j]); } fprintf(fp2,"\n"); } fclose(fp1); fclose(fp2); return(0); } fp1 3 4 1 2 3 4 2 3 4 5 3 4 5 6 1 2 3 2 3 4 3 4 5 4 5 6

  • ファイルをオープンするときのエラー

    C言語であるファイルにある数値を100ごとに合計して,ほかのファイルに書き出す。しかし,実行するとエラーでてきます。原因はわからないです。因みに,オープンしたいファイルをほかのディレクリに置いたら,ファイルが見付かりませんとのエラーがありました、WindowsのC言語でカレントディレクトリを探すときは何の関数を使えばいいでしょうか? int main(void) { int i,k; int num; char filename[64],fileread[64],filewrite[64]; FILE *fp0,*fp1; double sum1,sum2,sum3; int *ch[3]; sum1=sum2=sum3=0.0; printf("ファイル名を入力ください!\n"); scanf("%s",filename); fprintf(stderr,"\n%s\n",filename); sprintf(fileread,"C:\\%s.txt",filename); fprintf(stderr,"%s\n",fileread); sprintf(filewrite,"C:\\%s.csv",filename); for (i=0;i<3;i++) { if ( (ch[i]=(int *)malloc(4*30))==NULL ) { fprintf(stderr,"Cannot get memory <ch[%d]>.",i); return -1; } } fprintf(stderr,"%s\n",filewrite); if ((fp0=fopen(fileread,"rb"))==NULL) { fprintf(stderr,"Cannot open file %s\n",fileread); return 0; } fscanf(fp0,"%d", &num); if((fp1=fopen(filewrite,"wb"))==NULL) { fprintf(stderr,"Cannot open file!%s\n",filewrite); return 0; } for(i=0;i<50;i++) { fscanf(fp0,"%d %d %d",*(ch[0]),*(ch[1]),*(ch[2])); } for(i=0;i<num/100;i++) { for (k=0;k<100;k++) { fscanf(fp0,"%d %d %d",*(ch[0]),*(ch[1]),*(ch[2])); if ( feof(fp0) != 0 ) break; sum1=sum1+*(ch[0]); sum2=sum2+*(ch[1]); sum3=sum3+*(ch[2]); } fprintf(fp1,"%d %d %d\n",sum1,sum2,sum3); } fclose(fp0); fclose(fp1); return 0; }

  • 至急!教えてください。

    #include <stdio.h> #include <windows.h> #define COUNT (3) struct Seiseki{ char name[20]; int score1; int score2; int score3; int score4; int score5; int average; }; int getValue(char str[], char temp[], int n){ memset(temp, 0, 19); while(*(str+n) == ' '){ n++; } int i = 0; while(*(str+n) != ' ' && *(str+n) != 0){ temp[i] = *(str+n); i++; n++; } return n; } void getAverage(Seiseki *seiseki){ int total = seiseki->score1 + seiseki->score2 + seiseki->score3 + seiseki->score4 + seiseki->score5; seiseki->average = total / 5; } void getSeiseki(Seiseki seiseki[]){ char temp[20]; char str[256]; for(int i = 0; i < COUNT; i++){ printf_s("%d 人目の点数と名前 > ", i+1); memset(str, 0, 255); gets(str); int n = 0; n = getValue(str, temp, n); strcpy(seiseki[i].name, temp); n = getValue(str, temp, n); seiseki[i].score1 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score2 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score3 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score4 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score5 = atoi(temp); getAverage(&seiseki[i]); } } void showSeiseki(Seiseki seiseki[]){ for(int i = 0; i < COUNT; i++){ printf("%d %s %d %d %d %d %d\n", i+1, seiseki[i].name, seiseki[i].score1, seiseki[i].score2, seiseki[i].score3, seiseki[i].score4, seiseki[i].score5, seiseki[i].average); } } void showScoresAverage(Seiseki seiseki[]){ int total1 = 0; int total2 = 0; int total3 = 0; int total4 = 0; int total5 = 0; for(int i = 0; i < COUNT; i++){ total1+=seiseki[i].score1; total2+=seiseki[i].score2; total3+=seiseki[i].score3; total4+=seiseki[i].score4; total5+=seiseki[i].score5; } int ave1 = total1 / COUNT; int ave2 = total2 / COUNT; int ave3 = total3 / COUNT; int ave4 = total4 / COUNT; int ave5 = total5 / COUNT; printf_s("\naverage %d %d %d %d %d\n",ave1, ave2, ave3, ave4, ave5); } void main(){ Seiseki seiseki[COUNT]; printf_s("生徒 %d 名分の成績を入力してください:\n", COUNT); getSeiseki(seiseki); printf_s("\n成績表\n# NAME #1 #2 #3 #4 #5 average\n"); showSeiseki(seiseki); showScoresAverage(seiseki); } 間違っている点がありますか? ありましたらどこに入れるか教えてください。 改良点などありましたらお願いします。

  • fprint()とfscanf()を用いたプログラムについて

    テキストファイルへの出力はきちんとできているのですが、 得点・合計得点出力のところでつまづいてしまいます。 どうすればいいでしょうか? #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct{ char name[20]; int ten[3]; }RECORD; void csv(char *); void display_csv_file(char *); FILE *fpcsv; void main(int argc, char **argv) { csv(argv[1]); /* キーボード ⇒ CSV(テキスト)ファイル */ display_csv_file(argv[1]); /* CSV(テキスト)ファイル ⇒ ディスプレィ */ } void csv(char *filename) { RECORD seiseki; int i; fpcsv = fopen(filename,"w+"); while(printf("name(Ctrl + Z終了) >"),gets(seiseki.name) != NULL){ if(seiseki.name != NULL){ for(i = 0; i < 3;i++){ printf("得点%d >", i + 1); scanf("%d", &seiseki.ten[i]); } fprintf(fpcsv,"%s, %d, %d, %d, ", seiseki.name, seiseki.ten[0],seiseki.ten[1],seiseki.ten[2]); } rewind(stdin); } fclose(fpcsv); } void display_csv_file(char *filename) { char buf[255]; int i, sum, tokkuten[3]; fpcsv = fopen(filename,"r+"); while(fscanf(fpcsv,"%s%d%d%d", buf, tokkuten[0],tokkuten[1],tokkuten[2]) != EOF){ /*名前表示*/ strtok(buf,","); printf("name:%s ",buf); /*得点表示&合計計算*/ printf("得点1:%d 得点2:%d 得点3:%d", tokkuten[0],tokkuten[1],tokkuten[2]); sum = tokkuten[0] + tokkuten[1] + tokkuten[2]; /*合計表示*/ printf(" 合計得点: %d\n", sum); } fclose(fpcsv); }

  • 44行目: パラメータ '__format' は const signed char * 型として定義されているので int は渡せない(関数 main )

    ☆--------------ソース--------------☆ #include <stdio.h> struct seiseki { int no; char fname[20]; char lname[20]; int val[3]; }seito; int main(void) { int i,total; FILE *fp; FILE *file; struct seiseki seito[20]; char buf[1024]; fp = fopen("in.txt", "r"); i=0; while( fgets(buf, sizeof(buf), fp) ){ struct seiseki tmp; sscanf(buf,"%d %s %s %d %d %d",&tmp.no,tmp.lname,tmp.fname,&tmp.val[0],&tmp.val[1],&tmp.val[2]); seito[i++] = tmp; } printf("ID / NAME / 数(1) / 数(2) / 数(3) \n"); for(i = 0; i < 3; i++) { printf("%d / %s %s / %d / %d / %d\n", seito[i].no,seito[i].lname,seito[i].fname, seito[i].val[0], seito[i].val[1], seito[i].val[2]); } file = fopen("output.html","w"); fprintf(file ,"<HTML><HEAD></HEAD><BODY><table border=1 bodercolor=black cellspacing=0 width=700>\n"); fprintf(file ,"<tr bgcolor=#FF7575><td>ID</td><td>氏名</td><td>数(1)</td><td>数(2)</td><td>数(3)</td><td>合計点</td><td>平均点</td><td>偏差値</td><td>順位</td></tr>\n"); for(i = 0; i < 3; i++) { fprintf(file ,seito[i].lname); fprintf(file ,seito[i].fname); ☆省略☆ fprintf(file ,seito[i].val[0]); ☆省略☆ } fprintf(file ,"\n</table></BODY></HTML>\n"); return 0; }

専門家に質問してみよう