ここから本文です

プログラミング(c言語)について質問です

sen********さん

2020/7/722:52:25

プログラミング(c言語)について質問です

いまファイルの中身に学籍番号、氏名、点数がセットで複数名に渡り書かれているファイルがあり、この中身をクイックソートのアルゴリズムを用いて得点順(昇順)にソートし学籍番号、氏名、点数を表示し直すプログラムを作成しています
以下がそのソースコードです


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



typedef struct{
int num;
char name[16];
int score;
} student;

void Sort( student x[],int left,int right);
void Change(student x[],int i,int j);
void Show( student *p,int x);


void Change(student x[],int i,int j) //構造体配列の中身を入れ替える関数
{
student temp;

temp=x[i];
x[i]=x[j];
x[j]=temp;
}

void Sort( student x[],int left,int right) //クイックソートの方法に従いソートを行う関数
{
int i,j;
int p;


i=left;
j=right;



p=x[(left+right)/2].score; //基準点を中央付近に定める



while(1){
while(x[i].score<p)
i++;
while(x[i].score>p)
j--;


if(i>=j)
break;



Change(x,i,j);
i++;
j--;


}


if(left<i-1) //基準値の左に2以上要素があれば
Sort(x,left,i-1); //左側の配列をソート

if(j+1<right) //基準値の右に2以上要素があれば
Sort(x,j+1,right);//右側の配列をソート

}


void Show( student *p,int x)//構造体配列の中身を表示する関数
{

int i;
for(i=0;i<x;i++){

printf("%4d %-16s %3d\n",(p+i)->num,(p+i)->name,(p+i)->score);
}
}



int main(int argc, char *argv[]){

FILE *fp;
int j;



student date[100];



if( (fp=fopen( argv[1],"r"))==NULL) { //この場合ではargv[1]はsample.txt
printf( "ファイルがオープンできません\n");
exit( 1 );
}
for(j=0;j<100;j++) {
if( fscanf(fp,"%d %s %d\n",&date[j].num,date[j].name,&date[j].score)!=3){

break;
}

}
fclose(fp);
Show(date,j); //ソート前を表示 、jはデータの個数
Sort(date,0,j-1);
printf("/////\n");
Show(date,j); //ソート後


}

sample.txtの中身

///////
727 Abercrombie 12
945 Ackroyd 13
1885 Addinsell 65
444 Ager 14
1544 Allison 35
2163 Amherst 3
1139 Ainsworth 77
1861 Alcott 29

////////

コンパイル自体は成功するのですが、実行するとソート前の配列の中身が表示されるだけでその後が何も表示されません
//期待される実行結果//

727 Abercrombie 12
945 Ackroyd 13
1885 Addinsell 65
444 Ager 14
1544 Allison 35
2163 Amherst 3
1139 Ainsworth 77
1861 Alcott 29
////
2163 Amherst 3
727 Abercrombie 12
945 Ackroyd 13
444 Ager 14
1861 Alcott 29
1544 Allison 35
1885 Addinsell 65
1139 Ainsworth 77

プログラミング初心者なので原因や修正点がわかる方がいたら教えていただけると助かります

閲覧数:
22
回答数:
1

違反報告

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

nuooooonさん

2020/7/802:23:48

Sort関数の while (x[i].score > p)この部分が原因だと思います

iをjに変えてみてください

質問した人からのコメント

2020/7/8 12:45:37

直してみたら無事動きました!
ありがとうございます!

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

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

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

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

閉じる

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

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

閉じる