ここから本文です

以下のプログラムを実行したいんですが、構造体配列の入れ替えがうまくいきません...

ara********さん

2017/5/2800:56:38

以下のプログラムを実行したいんですが、構造体配列の入れ替えがうまくいきません。
void seiseki(Student seito[],int n)のところです。

/* 構造体を用いて学生の英語と数学の成績を管理する。
要素数10個の構造体配列を用意する。
構造体変数を関数へ渡し、すべての学生の平均を計算して返す。
構造体配列を平均成績による順並び関数を作成する。
*/
#include <stdio.h>
#include <stdlib.h>
#define N 10
typedef struct{
char name[20];
int math;
int eng;
float ave;
}Student;

void genstr(char [],int );
float scoreave(Student);
void seiseki(Student[],int);

void main(void){
Student seito[N];
float ave;
int i,n;
n=N;
for(i=0;i<n;i++){
genstr(seito[i].name,rand()%5+6);
seito[i].math=rand()%(100-60+1)+60;
seito[i].eng=rand()%(100-60+1)+60;
}
for(i=0;i<n;i++)
seito[i].ave=scoreave(seito[i]);
for(i=0;i<n;i++)
printf("%20s %4d %4d %f\n"
,seito[i].name,seito[i].math,seito[i].eng,seito[i].ave);
seiseki(seito,n);
return;
}
void genstr(char str[],int n)
{
int i;
for(i=0;i<n;i++)
str[i]=rand()%26+'a';
str[n]='\0';
}
float scoreave(Student seito)
{
float ave;
ave=(seito.math+seito.eng)/2.0;
return ave;
}
void seiseki(Student seito[],int n)
{
int i,j;
Student temp[N];
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){
if(seito[i].ave>seito[j].ave){
temp[n]=seito[i];
seito[i]=seito[j];
seito[j]=temp[n];
}
}
}
printf("変更後\n");
for(i=0;i<n;i++)
printf("%20s %4d %4d %f\n"
,seito[i].name,seito[i].math,seito[i].eng,seito[i].ave);
return;
}

閲覧数:
59
回答数:
1
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

tre********さん

2017/5/2802:14:41

まずおかしい部分です。★部

void seiseki(Student seito[], int n) {
int i, j;
Student temp[N];//★使用できるインデクス番号は0~(N-1)まで
for (i = 0; i < n; i++) {
for (j = i + 1; j < n; j++) {
if (seito[i].ave > seito[j].ave) {
temp[n] = seito[i];//★temp[n]は確保されている配列を越えたメモリを指しているため、隣接するメモリを破壊します
seito[i] = seito[j];
seito[j] = temp[n];
}
}
}
printf("変更後\n");
for (i = 0; i < n; i++)
printf("%20s %4d %4d %f\n", seito[i].name, seito[i].math, seito[i].eng,
seito[i].ave);
return;
}

  • tre********さん

    2017/5/2802:15:42

    修正案です。

    void seiseki(Student seito[], int n) {
    int i, j;
    Student temp; // ★配列ではなく1要素でOK
    for (i = 0; i < n; i++) {
    for (j = i + 1; j < n; j++) {
    if (seito[i].ave > seito[j].ave) {
    temp = seito[i]; // ★
    seito[i] = seito[j];
    seito[j] = temp; // ★
    }
    }
    }
    printf("変更後\n");
    for (i = 0; i < n; i++)
    printf("%20s %4d %4d %f\n", seito[i].name, seito[i].math, seito[i].eng,
    seito[i].ave);
    return;
    }

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この回答は投票によってベストアンサーに選ばれました!

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる