学校の課題です

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
power

学校の課題です

#1

投稿記事 by power » 2年前

3人の名前、番号、点数をキーボード入力して評価する+平均点をファイルに出力するプログラムを作っています。
エラーは出てないのですが、2つ目のif文のBのところで「例外が発生しました」と出てきます。キーボード入力はできるのですがファイルに出力できません。どうすればいいでしょうか。
初心者であまり理解できてません。

コード:

#include <stdio.h>
#include <stdlib.h>
typedef struct 
{
    char name[21];
    char number;
    int scole;

}person;

int sum;
float ave;

void test( person p[ ], int n );


int main(void)
{
    int i;
    person p[ 3 ];
    FILE* fp;
	
    if((fp=fopen("input.txt","wt"))==NULL)
    {
        printf("ファイルオープンエラー\n");
        exit(0);
    }

    for( i=0; i<3; i++)
    {
        printf("名前 番号 点数>");
        scanf("%s %s %d", p[ i ].name, &p[ i ].number, &p[ i ].scole );
    }

	for( i = 0; i < 3; i++ )
	{
		if( p[ i ].scole >= 90 )
		{
			fprintf( fp,"A  %s %s %5.1d\n", p[ i ].name, p[ i ].number, p[ i ].scole );
		}
		if( p[ i ].scole <90 && p[ i ].scole>=80 )
		{
			fprintf( fp,"B  %s %s %5.1d\n", p[ i ].name, p[ i ].number, p[ i ].scole );
		}
        if( p[ i ].scole <80 && p[ i ].scole>=60 )
		{
			fprintf( fp, "C  %s %s %5.1d\n", p[ i ].name, p[ i ].number, p[ i ].scole );
		}
        if( p[ i ].scole <60)
		{
			fprintf( fp, "D  %s %s %5.1d\n", p[ i ].name, p[ i ].number, p[ i ].scole );
		}
	}
	test(p,3);
	fprintf(fp,"平均点は%f点",ave);

	fclose(fp);

	return 0;
}

void test( person p[ ], int n )
{
	int i;

	for( i = 0; i < n; i++ )
	{
		sum+=p[ i ].scole;
        ave=sum/3;
	}
} 

box
記事: 2002
登録日時: 13年前

Re: 学校の課題です

#2

投稿記事 by box » 2年前

main関数に何でもかんでもやらせない方がよいと思います。個人的には。
データの入力、評価、出力を適切に関数分けする方がよいのではないでしょうか。

コード:

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

#define N (3)
#define C (21)

typedef struct {
    char name[C];
    int number;
    int score;
    char class;
} person;

void inputData(person *p)
{
    int i;

    for (i = 0; i < N; i++) {
        printf("名前 番号 点数>");
        scanf("%s %d %d", p[i].name, &(p[i].number), &(p[i].score));
    }
}

double judgeData(person *p)
{
    double sum;
    int i;

    for (sum = i = 0; i < N; i++) {
        sum += p[i].score;
        if (p[i].score >= 90) p[i].class = 'A';
        else if (p[i].score >= 80) p[i].class = 'B';
        else if (p[i].score >= 60) p[i].class = 'C';
        else p[i].class = 'D';
    }
    return sum / N;
}

void outputData(person *p, double avg)
{
    FILE *fp;
    int i;

    fp = fopen("output.txt", "w");
    if (!fp) {
        fprintf(stderr, "file open error\n");
        exit(1);
    }
    for (i = 0; i < N; i++) {
        fprintf(fp, "%c %s %5d %3d\n", p[i].class, p[i].name, p[i].number, p[i].score);
    }
    fprintf(fp, "average is %f\n", avg);
    fclose(fp);
}

int main(void)
{
    person p[3];

    inputData(p);
    outputData(p, judgeData(p));
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: 学校の課題です

#3

投稿記事 by box » 2年前

コード:

    person p[3];

コード:

    person p[N];
とするべきですね。
なお、くだんのサンプルコードはご自由に改変してくださってかまいません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 学校の課題です

#4

投稿記事 by みけCAT » 2年前

%s は文字列を入出力するための書式なので、1文字分の領域しか無い char number; には使えません。
文字を入出力するには %c が使えます。

コード:

scanf("%s %s %d", p[ i ].name, &p[ i ].number, &p[ i ].scole );
のかわりに

コード:

scanf("%20s %c %d", p[ i ].name, &p[ i ].number, &p[ i ].scole );
(ついでに、文字列を読み込む時はバッファオーバーフローを防ぐため読み込む最大の長さを指定する)

コード:

fprintf( fp,"A  %s %s %5.1d\n", p[ i ].name, p[ i ].number, p[ i ].scole );
のかわりに

コード:

fprintf( fp,"A  %s %c %5.1d\n", p[ i ].name, p[ i ].number, p[ i ].scole );
(B~Dについても同様)

とすると改善するでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

power

Re: 学校の課題です

#5

投稿記事 by power » 2年前

 ご協力いただき、ありがとうございます。無事に完成することができました。

コード:

 #include <stdio.h>
#include <stdlib.h>
typedef struct 
{
    char name[21];
    char number;
    int scole;

}person;

int sum;
float ave;

void test( person p[ ], int n );


int main(void)
{
    int i;
    person p[ 3 ];
    FILE* fp;
	
    if((fp=fopen("input.txt","wt"))==NULL)
    {
        printf("ファイルオープンエラー\n");
        exit(0);
    }

    for( i=0; i<3; i++)
    {
        printf("名前 学籍番号 点数>");
        scanf("%20s %c %d", p[ i ].name, &p[ i ].number, &p[ i ].scole );
    }

	for( i = 0; i < 3; i++ )
	{
		if( p[ i ].scole >= 90 )
		{
			fprintf( fp,"A  %s %c %5.1d\n", p[ i ].name, p[ i ].number, p[ i ].scole );
		}
		if( p[ i ].scole <90 && p[ i ].scole>=80 )
		{
			fprintf( fp,"B  %s %c %5.1d\n", p[ i ].name, p[ i ].number, p[ i ].scole );
		}
        if( p[ i ].scole <80 && p[ i ].scole>=60 )
		{
			fprintf( fp, "C  %s %c %5.1d\n", p[ i ].name, p[ i ].number, p[ i ].scole );
		}
        if( p[ i ].scole <60)
		{
			fprintf( fp, "D  %s %c %5.1d\n", p[ i ].name, p[ i ].number, p[ i ].scole );
		}
	}
	test(p,3);
	fprintf(fp,"平均点は%f点",ave);

	fclose(fp);

	return 0;
}

void test( person p[ ], int n )
{
	int i;

	for( i = 0; i < n; i++ )
	{
		sum+=p[ i ].scole;
        ave=sum/3;
	}
} 

返信

“C言語何でも質問掲示板” へ戻る