问题描述:建立一个简单的学生成绩表,要求能够完成学生成绩的录入,总成绩的计算,学生成绩的查询,学生成绩表的排序
算法分析:
创建一个线性表来储存学生成绩,每个学生成绩信息作为一个数据元素
确立线性表的长度,录入学生信息
通过学号对学生信息进行查询,遍历学号,如果没有找到提示输入信息出错
排时,先确立对那个科目进行排序,基本方法:冒泡排序法,通过交换相邻元素的位置将较低成绩的数据元素前移
具体代码如下:
STEP1:完成数据元素和线性表的定义
注意:对学号用的是字符串的数组的定义,方便之后的字符串的比较(查找算法时)
//定义结构体类型 typedef struct { char no[10]; //学号 char name[10]; int score[5]; int totol; //总成绩 }student; typedef struct{ student stu[MAXSIZE]; int len; //线性表的实际长度 }SqList;
STEP2:完成数据的输入
用到了结构体数组中,及数据元素中的数组(score[])输入使用两重for循环完成
void creat(SqList &L,int &n){ printf("请输入学生的人数:\n"); scanf("%d",&n); L.len=n; printf("输入学生的学号,姓名,数学,英语,政治,专业课1,专业课2成绩\n"); for(int i=0;i<n;i++){ scanf("%s",&L.stu[i].no); scanf("%s",&L.stu[i].name); L.stu[i].totol=0; for(int j =0;j<5;j++){ scanf("%d",&L.stu[i].score[j]); L.stu[i].totol +=L.stu[i].score[j]; } } }
STEP3:完成查询算法
注意:用到字符串比较函数strcmp()还有return;的位置,就是找到之后直接结束,如果不加这一句话,在找到元素打印完毕之后,会多出来一句“输入学号有误”
void search_Sq(SqList &L){ char tno[10]; int i; printf("请输入学生学号\n"); scanf("%s",&tno); for( i = 0; i < L.len; i++){ if(strcmp(tno,L.stu[i].no)==0){ printf("查询结果如下:\n"); printf("%s,%s\n",L.stu[i].name,L.stu[i].no); for(int j=0;j<5;j++){ printf("%d ",L.stu[i].score[j]); } printf("%d\n",L.stu[i].totol); return ; } } if(i = L.len) printf("输入学号有误!\n"); }
STEP4:完成排序算法
void sort_Sq(SqList &L,int k){ int i,j; student p; if(k>=0 && k <6){ printf("按照score[%d]进行排序",k); for(i=0; j<L.len-1;j++){ for(j=i;j<L.len-1;j++) if(L.stu[i].score[k]>=L.stu[j].score[k]){ p = L.stu[i]; L.stu[i]=L.stu[j]; L.stu[j]= p; } } } else{ printf("按照TOTOL进行升序排列\n"); for(i=0; j<L.len-1;j++){ for(j=i;j<L.len-1;j++) if(L.stu[i].totol>=L.stu[j].totol){ p = L.stu[i]; L.stu[i]=L.stu[j]; L.stu[j]= p; } } } printf("排序后的成绩表如下:\n"); for(int i=0;i<L.len; i++){ printf("%s,%s\n",L.stu[i].name,L.stu[i].no); for(int j=0; j<5; j++) printf("%d ",L.stu[i].score[j]); printf("%d\n",L.stu[i].totol); } }
冒泡排序的变量控制i,j还没有完全明白,存疑!!
主函数
int main(){ SqList l; int n,k; creat(l,n); search_Sq( l); printf("将学生成绩按照第几门排序\n"); scanf("%d",&k); sort_Sq(l,k); }
测试成功