題目
分析
- 學生信息包括姓名、學號、成績,用結構體存儲
- 成績分爲數學、語文、物理、化學、英語五門成績,用數組處理
- 30名學生,用結構體數組存儲
定義結構體:
struct stu{
char name[30];
int num;
float score[5];
float all;
}a[N];
- 總分在前十名,選擇排序法
對數組a[]做簡單選擇排序,N爲數組長度
for(i=0;i<N-1;i++) //選擇排序,由大到小排列
{
k = i;
for(j=i+1;j<N;j++)
if(a[j]>a[k])
k=j;
if(k!=i){
temp = a[k];
a[k] = a[i];
a[i] = temp;
}
}
- 處理特別關注學生(低於80分)和並列排名學生
代碼
#include <stdio.h>
#define N 30
struct stu{
char name[30];
int num;
float score[5];
float all;
}a[N];
int main() {
int i,j,k;
struct stu temp;
printf("學號,輸入姓名,數學成績,語文成績,物理成績,化學成績,英語成績:\n");
for(i=0;i<N;i++) //輸入學生信息
scanf("%d%s%f%f%f%f%f",&a[i].num,a[i].name,&a[i].score[0],&a[i].score[1],&a[i].score[2],&a[i].score[3],&a[i].score[4]);
for(i=0;i<N;i++) //計算總分
a[i].all = a[i].score[0]+a[i].score[1]+a[i].score[2]+a[i].score[3]+a[i].score[4];
for(i=0;i<N-1;i++) //選擇排序,由大到小排列
{
k = i;
for(j=i+1;j<N;j++)
if(a[j].all>a[k].all)
k=j;
if(k!=i){
temp = a[k];
a[k] = a[i];
a[i] = temp;
}
}
int m = 10; //處理並列排名的情況
if(a[9].all == a[10].all)
m = 11;
for(i = 0;i<m;i++) { //輸出前10名
if(i == 10)
printf("第%d名:",i);
else
printf("第%d名:",i+1);
printf("%6d%8s %6.2f,", a[i].num,a[i].name, a[i].all);
for(j=0;j<5;j++)
if(a[i].score[j]<80) //找出低於80分的功課
switch (j){
case 0:printf("數學低於80分;");
break;
case 1:printf("語文低於80分;");
break;
case 2:printf("物理低於80分;");
break;
case 3:printf("化學低於80分;");
break;
case 4:printf("英語低於80分;");
break;
default:;
}
printf("\n");
}
return 0;
}
結果示例
由於30組數據太多,在此我只用了5組數據,選出前三名學生。這裏也體現出定義數組用#define N 30
來表示數組長度的好處。
並列第三情況: