qsortの利用
Posted: 2014年7月27日(日) 13:26
qsortで二次元配列を成績1の順に整列し,表示したいものです。
以下はエラーのあるプログラムです。
Windows 8 gcc でコンパイルしました。
何人めかの、得点の高い成績が後ろに表示されてしまいます。
整列前
番号 成績1 成績2 成績3 成績4
1 50 3012 62 33
整列後
1 33 50 62 3012
成績1の順に整列し,表示したいです。お返事お願いします。
以下はエラーのあるプログラムです。
Windows 8 gcc でコンパイルしました。
#include<stdio.h>
#include <stdlib.h>
double get_ave(int *);
void get_hyouka(double, char*);
void print_data(int, int* ,double,char);
int cmp( const void *p, const void *q ) {
return *(int*)p - *(int*)q;
}
int main (void)
{
int no[4],data[4][4];
double ave[4];
char hyouka[4];
int i;
printf("番号 成績1 成績2 成績3 成績4 入力:\n");
for(i=0;i<4;i++){
printf("%d人目\n",i+1);
scanf("%d %d %d %d %d",&no[i],&data[i][0],&data[i][1],
&data[i][2],&data[i][3]);
}
printf("番号 成績1 成績2 成績3 成績4 平均 評価\n");
for(i=0;i<4;i++){
ave[i]=get_ave(data[i]);
get_hyouka(ave[i],&hyouka[i]);
print_data(no[i],data[i],ave[i],hyouka[i]);
}
qsort( data[1], 4, sizeof(int), cmp );
for(i=0;i<4;i++){
printf("%d %d %d %d %d\n",no[i],data[i][0],data[i][1],
data[i][2],data[i][3]);;
}
}
double get_ave(int *p_ten){
int i;
double ave=0.0;
for(i=0;i<4;i++){
ave+=*p_ten;
}
ave/=4;
return(ave);
}
void get_hyouka(double ave,char *p_hyouka){
if(ave<60.0) *p_hyouka='D';
else if(ave<70.0)*p_hyouka='C';
else if(ave<80.0)*p_hyouka='B';
else *p_hyouka='A';
}
void print_data(int no,int *p_ten,double ave,char hyouka){
int i;
printf("%4d",no);
for(i=0;i<4;i++){
printf(" %6d",*p_ten++ );
}
printf("%6.2f %c\n",ave,hyouka);
}
整列前
番号 成績1 成績2 成績3 成績4
1 50 3012 62 33
整列後
1 33 50 62 3012
成績1の順に整列し,表示したいです。お返事お願いします。