以下、番号と点数を入力して構造体配列に入力し、番号に0が入力されたら、入力処理をやめ、平均点を表示するプログラムです。
今のコードでは、最初から番号に0を入力すると、0除算になりエラーになります。どうすれば良いのでしょうか?
#include <stdio.h>
#define MAX 50//配列の要素数を定義
int count=0;//グローバル変数
struct data {//構造体の定義
int num;//メンバの宣言
int ten;
};
void nyuryoku(struct data *);//プロトタイプ宣言
float heikin(struct data *);//プロトタイプ宣言
void main()
{
struct data score[MAX];//構造体の宣言
printf("**学生番号/点数入力**\n");
printf("\n");
nyuryoku(score);//nyuryoku関数呼び出し
printf("\n**以上%d名の平均点:%0.1f点**\n",count,heikin(score));
//heikin関数の戻り値表示
}
//nyuryoku関数
//機能:構造体配列にデータを入力する
void nyuryoku(struct data *pd)//仮引数pdに構造体ポインタが渡る
{
int i;
for(i=0;i<MAX;i++){
printf("学生番号>>");
scanf("%d",&pd->num);
if(pd->num==0){//学生番号に0を入力するとループを抜ける
break;
}
printf("点 数>>");
scanf("%d",&pd->ten);
count++;//人数のカウント
pd++;//構造体配列を一つずらす
}
}
//heikin関数
//機能:構造体配列の点数の平均を計算、戻り値として返す
float heikin(struct data *pd)//仮引数pdに構造体ポインタが渡る
{
int i;
int sum=0;
float ave=0;
for(i=0;i<MAX;i++){
if(pd->num==0){
break;
}
else{
sum+=pd->ten;//点数を加算
pd++;
}
}
ave=(float)sum/count;//平均値を求める
return(ave);//平均値を戻り値として返す
}
No.3
- 回答日時:
>まだ私も初心者です。
・これだけ書ければ、「初心者」ではないと・・。
★総じて、「判り易い」ソースと思いました。
------------------------------------------------
☆暇な年寄りが、僭越にもちょっと添削させて頂きました。
・「骨組み」はそのままで、◆は、やや(?)変更。
・後は、同じ「学生番号」が入れられた時の処理?
→ 構造体を「ポインタ」で扱うより、「配列の添え字」での
方が簡単そう。
例)sScore[ i ].iTen
#include <stdio.h>
#define MAX 50 // 配列の要素数を定義
int igCount = 0; // グローバル変数
typedef struct{ // 構造体の定義
int iNum; // メンバの宣言
int iTen;
}DATA;
void Nyuryoku( DATA * ); // プロトタイプ宣言
float Heikin( DATA * ); // プロトタイプ宣言
void main()
{
DATA sScore[MAX]; // 構造体の宣言
printf( "**学生番号/点数入力**\n\n" );
Nyuryoku( sScore ); // Nyuryoku関数呼び出し
// Heikin関数の戻り値表示
printf( "\n**以上 %d 名の平均点:%0.1f点**\n", igCount, Heikin( sScore ) );
}
void Nyuryoku( DATA *pScore )
// 機能:構造体配列にデータを入力する
// 仮引数pScoreに構造体ポインタが渡る
{
int i;
for( i = 0; i < MAX; i++ ){
printf( "学生番号(0:終了)>>" );
scanf( "%d", &pScore->iNum );
if( 0 == pScore->iNum ) break; // 学生番号に0を入力するとループを抜ける
printf( "点 数>>" );
scanf( "%d", &pScore->iTen );
igCount++; // 人数のカウント
pScore++; // 構造体配列を一つずらす
}
}
float Heikin( DATA *pScore )
// 機能:構造体配列の点数の平均を計算、戻り値として返す
// 仮引数pScoreに構造体ポインタが渡る
{
int i;
int iSum = 0;
float dAve; // 初期化不要
if( 0 == igCount ) return( -99.9 ); // ◆ご質問主旨
for( i = 0; i < igCount; i++ ){ // ◆ MAX → igCount
iSum += pScore->iTen; // 点数を加算
pScore++;
}
dAve = (float)iSum / (float)igCount; // 平均値を求める
return( dAve ); // 平均値を戻り値として返す
}
注:インデントに全角空白を用いています。
タブに一括変換して下さい。
No.2
- 回答日時:
はっきりいって、相当にダメなプログラムですね。
アマチュアの手習いだと思って、指導します。
ダメなところ。
a)nyuryoku を抜けた状態での状態管理が出来ていない。
しいていえば、countがそうなのであろうが、これが、グローバル変数である必要はない。nyuryokuでの状態管理として、もっとも大事なのは、有効なレコードが、何件いれられたかであるから、それを、返り値としてかえす。
b)学生番号入力ゼロは、入力終了の入力なので、breakではなく、終了処理を書いて、returnする。
c)mainで、nyuryokuの返り値を、処理して、構造体トップアドレスと有効データ数を、heikinに渡すようにする。そして、heikinでは、有効データ数のチェックなどの論理は含まない。
もちろん、ゼロ除算は、今は、count==0で、nyuryokuを抜けているから。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
c言語
-
C言語の課題が出たのですが自力...
-
C言語において、 配列要素をひ...
-
配列の要素数に変数を入れたい...
-
define で 配列
-
C言語の2次元配列 容量が大き...
-
C#で構造体の配列を持った構造...
-
c言語プログラミング 等差数列...
-
構造体の配列 char *' 型は 'ch...
-
int i, int i[1];
-
構造体のextern方法
-
C言語 ビットフィールドについて
-
fclose()でセグメンテーション違反
-
2番目の最大値を求める
-
AfxBeginThread の引数について
-
char型配列をint型に代入するには
-
Cのエラー
-
配列のNULL初期化について
-
C言語 配列の長さの上限
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
define で 配列
-
c言語
-
C#で構造体の配列を持った構造...
-
構造体のextern方法
-
C言語において、 配列要素をひ...
-
C#でのフィボナッチ数列
-
C言語の2次元配列 容量が大き...
-
C#で配列が空かを判定するには?
-
配列のアドレス部
-
char型配列をint型に代入するには
-
C言語の課題が出たのですが自力...
-
2番目の最大値を求める
-
C言語についてです 5人のテスト...
-
C言語から質問です。
-
C言語 ファイルの指定された行...
-
c言語 構造体
-
コンボボックスでデフォルト値...
-
MFCのCArrayを使った二次元配列
おすすめ情報