超好的学生成绩管理系统顺序表实现的代码含详细注释哦.docx
《超好的学生成绩管理系统顺序表实现的代码含详细注释哦.docx》由会员分享,可在线阅读,更多相关《超好的学生成绩管理系统顺序表实现的代码含详细注释哦.docx(18页珍藏版)》请在冰豆网上搜索。
超好的学生成绩管理系统顺序表实现的代码含详细注释哦
超好的学生成绩管理系统顺序表实现的代码含详细注释哦
#include
#include
#include
#defineLIST_INIT_SIZE4//线性表存储空间的初始分配量
#defineLISTINCREMENT10//线性表存储空间的分配增量
//学生的定义
typedeftruct
{
intnum;
charname[20];
floatenglih;
floatmath;
floatdatabae;
floatum;
floataverage;
}Student;
//顺序表的定义
typedeftruct
{
Student某tu;
intlength;
intlitize;
}qlit;
//函数1录入信息
intInput(qlit某L)
{
inti=1;//为了查找、排序的方便将第一个当哨兵
charflag='y';
//输入数据
while(flag=='Y'||flag=='y')
{
for(i=1;ilitize;++i)
{
printf("请输入第%d个同学的信息:
\n",L->length);
printf("学号:
");
ffluh(tdin);
canf("%d",&L->tu[L->length].num);
printf("姓名:
");
ffluh(tdin);
canf("%",L->tu[L->length].name);
printf("英语成绩:
");
ffluh(tdin);
canf("%f",&L->tu[L->length].englih);
printf("高数成绩:
");
ffluh(tdin);
canf("%f",&L->tu[L->length].math);
printf("数据结构成绩:
");
ffluh(tdin);
canf("%f",&L->tu[L->length].databae);
L->tu[L->length].um=L->tu[L->length].englih+L->tu[L->length].math+L->tu[L->length].databae;
L->tu[L->length].average=L->tu[L->length].um/3;
L->length++;
printf("是否继续[Y/N]...");
ffluh(tdin);
flag=getchar();
if(flag=='N'||flag=='n')
break;
}
}
return0;
}
//函数2显示所有学生信息
intDiplay(qlit某L)
{
inti;
if(L->length<=1)
{
printf("请先输入数据!
\n");
return0;
}
printf("所有同学信息如下:
\n");
printf("学号\t姓名\t总分\t平均分\t英语成绩\t高数成绩\t数据结构成绩\n");for(i=1;ilength;i++)
printf("%d\t%\t%.2f\t%.2f\t%.2f\t\t%.2f\t\t%.2f\n",L->tu[i].num,L->tu[i].name,L->tu[i].um,L->tu[i].average,L->tu[i].englih,L->tu[i].math,L->tu[i].
databae);
return0;
}
//函数3插入一条记录到表尾
voidInert(qlit某L)
{
printf("学号:
");
canf("%d",&L->tu[L->length].num);
printf("姓名:
");
canf("%",L->tu[L->length].name);
printf("英语成绩:
");
canf("%f",&L->tu[L->length].englih);
printf("高数成绩:
");
canf("%f",&L->tu[L->length].math);
printf("数据结构成绩:
");
canf("%f",&L->tu[L->length].databae);
L->tu[L->length].um=L->tu[L->length].englih+L->tu[L->length].math+L->tu[L->length].databae;
L->tu[L->length].average=L->tu[L->length].um/3;
L->length++;
}
//函数4删除一条记录
intDelete(qlit某L)
{
char[20];
inti=1,j,ch,n;//第一个是哨兵
if(L->length<=1)
{
printf("请先输入数据!
\n");
return0;
}
printf("1.按姓名删除\n2.按学号删除\n请选择:
");
canf("%d",&ch);
if(ch==1)
{
printf("请输入姓名:
");
canf("%",);
while(trcmp(L->tu[i].name,)!
=0&&ilength)
i++;
}
ele
{
printf("请输入学号:
");
canf("%d",&n);
while(L->tu[i].num!
=n&&ilength)
i++;
}
if(i>=L->length)
{
printf("要删除记录不存在!
");
return0;
}
for(j=i;jlength;j++)
L->tu[j]=L->tu[j+1];
printf("删除成功!
\n");
L->length--;
return0;
}
//函数5统计成绩
intStatitic(qlit某L)
{
inti,j=1,j1=1,j2=1,j3=1,k=1,k1=1,k2=1,k3=1;//要算及格率两个整数相除可能会是0所以float型
float
aver,tuum=0,tuum1=0,tuum2=0,tuum3=0,count1=0,count2=0,count3=0;if(L->length<=1)
{
printf("请先输入数据!
\n");
return0;
}
for(i=1;ilength;i++)
{
//用于计算全班平均成绩
tuum+=L->tu[i].um;
//用于计算各科平均成绩
tuum1+=L->tu[i].englih;
tuum2+=L->tu[i].math;
tuum3+=L->tu[i].databae;
//查找总分最高分if(L->tu[j].umtu[i].um)j=i;//查找总分最低分if(L->tu[k].um>L->tu[i].um)k=i;//查找英语最高分if(L->tu[j1].englihtu[i].englih)j1=i;//查找高数最高分if(L->tu[j2].mathtu[i].math)j2=i;//查找数据结构最高分if(L->tu[j3].databaetu[i].databae)j3=i;//查找英语最低分if(L->tu[k1].englih>L->tu[i].englih)k1=i;//查找高数最低分if(L->tu[k2].math>L->tu[i].math)k2=i;//查找数据结构最低分if(L->tu[k3].databae>L->tu[i].databae)k3=i;//用于计算及格率if(L->tu[i].englih>=60)count1++;if(L->tu[i].math>=60)count2++;if(L->tu[i].databae>=60)count3++;}aver=tuum/L->length;printf("共有%d条记录.\n",L->length);printf("总分最高的记录:
\n");printf("学号\t姓名\t总分\t平均分\t英语成绩\t高数成绩\t数据结构成绩\n");
printf("%d\t%\t%.2f\t%.2f\t%.2f\t\t%.2f\t\t%.2f\n",L->tu[j].num,L->tu[j].name,L->tu[j].um,L->tu[j].average,L->tu[j].englih,L->tu[j].math,L->tu[j].databae);
printf("总分最低的记录:
\n");
printf("学号\t姓名\t总分\t平均分\t英语成绩\t高数成绩\t数据结构成绩\n");printf("%d\t%\t%.2f\t%.2f\t%.2f\t\t%.2f\t\t%.2f\n",L->tu[k].num,L->tu[k].name,L->tu[k].um,L->tu[k].average,L->tu[k].englih,L->tu[k].math,L->tu[k].databae);
printf("全体同学平均成绩:
%.2f\n",aver);
printf("英语及格率:
%.2f\n",count1/(L->length-1));
printf("高数及格率:
%.2f\n",count2/(L->length-1));
printf("数据结构及格率:
%.2f\n",count3/(L->length-1));
printf("英语最高分:
%.2f\n",L->tu[j1].englih);
printf("高数最高分:
%.2f\n",L->tu[j2].math);
printf("数据结构最高分:
%.2f\n",L->tu[j3].databae);
printf("英语最低分:
%.2f\n",L->tu[k1].englih);
printf("高数最低分:
%.2f\n",L->tu[k2].math);
printf("数据结构最低分:
%.2f\n",L->tu[k3].databae);
return0;
}
//函数6查找
intSearch(qlit某L)
{
charn[20];
inti=1,ch1,ch2,j,num,low,high,mid;
if(L->length<=1)
{
printf("请先输入数据!
\n");
return0;
}
printf("1.顺序查找\n2.二分查找\n请选择:
");
canf("%d",&ch1);
if(ch1==1){
printf("1.按学号查找\n2.按姓名查找\n请选择:
");
canf("%d",&ch2);
if(ch2==1)
{
printf("请输入学号:
");
canf("%d",&num);
while(L->tu[i].num!
=num&&ilength)
i++;
}
ele{
printf("请输入姓名:
");
canf("%",n);
while(trcmp(L->tu[i].name,n)!
=0&&ilength)
i++;
}
if(i>=L->length)
{
printf("查找失败!
");
return0;
}
printf("查找成功!
\n");
printf("学号\t姓名\t总分\t平均分\t英语成绩\t高数成绩\t数据结构成绩\n");printf("%d\t%\t%.2f\t%.2f\t%.2f\t\t%.2f\t\t%.2f\n",L->tu[i].num,L->tu[i].name,L->tu[i].um,L->tu[i].average,L->tu[i].englih,L->tu[i].math,L->tu[i].databae);
}
if(ch1==2){
printf("1.按学号查找\n2.按姓名查找\n请选择:
");
canf("%d",&ch2);
if(ch2==1)
{//二分查找,先按学号排序
for(i=2;ilength;i++)
if(L->tu[i].numtu[i-1].num)
{
L->tu[0]=L->tu[i];
L->tu[i]=L->tu[i-1];
for(j=i-2;L->tu[0].numtu[j].num;j--)
L->tu[j+1]=L->tu[j];
L->tu[j]=L->tu[0];
}
printf("请输入学号:
");
canf("%d",&num);
low=1;high=L->length-1;//置区间初值
while(low<=high)
{mid=(low+high)/2;
if(L->tu[mid].num==num){
printf("查找成功!
\n");
printf("学号\t姓名\t总分\t平均分\t英语成绩\t高数成绩\t数据结构成绩\n");printf("%d\t%\t%.2f\t%.2f\t%.2f\t\t%.2f\t\t%.2f\n",L->tu[mid].num,L->tu[mid].name,L->tu[mid].um,L->tu[mid].average,L->tu[mid].englih,L->tu[mid].math,L->tu[mid].databae);
return0;
}
ele
if(numtu[mid].num)high=mid-1;//继续在前半区间进行查找ele
low=mid+1;//继续在后半区间进行查找
}
printf("查找失败!
\n");
return0;
}
ele
{//二分查找,先按姓名排序
for(i=2;ilength;i++)
if(trcmp(L->tu[i].name,L->tu[i-1].name)<0)
{
L->tu[0]=L->tu[i];
L->tu[i]=L->tu[i-1];
for(j=i-2;trcmp(L->tu[0].name,L->tu[j].name)<0;j--)L->tu[j+1]=L->tu[j];
L->tu[j]=L->tu[0];
}
printf("请输入姓名:
");
canf("%",n);
low=1;high=L->length-1;//置区间初值
while(low<=high)
{
mid=(low+high)/2;
if(trcmp(L->tu[mid].name,n)==0){
printf("查找成功!
\n");
printf("学号\t姓名\t总分\t平均分\t英语成绩\t高数成绩\t数据结构成绩\n");
printf("%d\t%\t%.2f\t%.2f\t%.2f\t\t%.2f\t\t%.2f\n",L->tu[mid].num,L->tu[mid].name,L->tu[mid].um,L->tu[mid].average,L->tu[mid].englih,L->tu[mid].math,L->tu[mid].databae);
return0;
}
ele
if(trcmp(n,L->tu[mid].name)<0)high=mid-1;//继续在前半区间进行查找
ele
low=mid+1;//继续在后半区间进行查找
}
printf("查找失败!
\n");
return0;
}//ele
}//if(ch1==2)
}
//函数7排序
intSort(qlit某L)
{
inti,ch1,ch2,j,k;
intlow,high,mid;
if(L->length<=1)
{
printf("请先输入数据!
\n");
return0;
}
printf("1.直接插入排序\t2.折半插入排序\n3.冒泡排序\t4.直接选择排序\n请选择:
");
canf("%d",&ch1);
witch(ch1){
cae1:
printf("1.按学号排序\n2.按英语成绩排序\t3.按高数成绩排序\n4.按数据结构成绩排序\t5.按总分排序\n请选择:
");
canf("%d",&ch2);
witch(ch2){
cae1:
for(i=2;ilength;i++)
if(L->tu[i].numtu[i-1].num)
{
L->tu[0]=L->tu[i];
L->tu[i]=L->tu[i-1];
for(j=i-2;L->tu[0].numtu[j].num;j--)
L->tu[j+1]=L->tu[j];
L->tu[j]=L->tu[0];
}
break;
cae2:
for(i=2;ilength;i++)
if(L->tu[i].englihtu[i-1].englih)
{
L->tu[0]=L->tu[i];
L->tu[i]=L->tu[i-1];
for(j=i-2;L->tu[0].englihtu[j].englih;j--)L->tu[j+1]=L->tu[j];L->tu[j]=L->tu[0];}break;cae3:
for(i=2;ilength;i++)if(L->tu[i].mathtu[i-1].math){L->tu[0]=L->tu[i];L->tu[i]=L->tu[i-1];for(j=i-2;L->tu[0].mathtu[j].math;j--)L->tu[j+1]=L->tu[j];L->tu[j]=L->tu[0];}break;cae4:
for(i=2;ilength;i++)if(L->tu[i].databaetu[i-1].databae){L->tu[0]=L->tu[i];L->tu[i]=L->tu[i-1];for(j=i-2;L->tu[0].databaetu[j].databae;j--)L->tu[j+1]=L->tu[j];L->tu[j]=L->tu[0];}break;cae5:
for(i=2;ilength;i++)if(L->tu[i].umtu[i-1].um){L->tu[0]=L->tu[i];L->tu[i]=L->tu[i-1];for(j=i-2;L->tu[0].umtu[j].um;j--)L->tu[j+1]=L->tu[j];L->tu[j]=L->tu[0];}break;}//wich(ch2)break;cae2:
printf("1.按学号排序\n2.按英语成绩排序\t3.按高数成绩排序\n4.按数据结
构成绩排序\t5.按总分排序\n请选择:
");
canf("%d",&ch2);
witch(ch2){
cae1:
for(i=2;ilength;i++)
{
if(L->tu[i].numtu[i-1].num)
{
L->tu[0]=L->tu[i];/某设置监测哨某/
low=1;
high=i-1;
while(low<=high)
{/某在r[low..high]中折半查找有序插入的位置某/
mid=(low+high)/2;
if(L->tu[0].numtu[mid].num)
high=mid-1;/某插入点在低半区某/
ele
low=mid+1;/某插入点在高半区某/
}/某while某/
for(j=i-1;j>=low;--j)
L->tu[j+1]=L->tu[j];/某记录后移某/
L->tu[high+1]=L->tu[0];/某插入到正确位置某/}/某if某/
}/某for某/
break;
cae2:
for(i=2;ilength;i++)
{
if(L->tu[i].englihtu[i-1].englih)
{
L->tu[0]=L->tu[i];/某设置监测哨某/
low=1;
high=i-1;
while(low<=high)
{/某在r[low..high]中折半查找有序插入的位置某/
mid=(low+high)/2;
if(L->tu[0].englihtu[mid].englih)high=mid-1;/某插入点在低半区某/
ele
low=mid+1;/某插入点在高半区某/
}/某while某/
for(j=i-1;j>=low;--j)
L->tu[j+1]=L->tu[j];/某记录后移某/
L->tu[high+1]=L->tu[0];/某插入到正确位置某/
}/某if某/}/某for某/break;cae3:
for(i=2;ilength;i++){if(L->tu[i].mathtu[i-1].math){L->tu[0]=L->tu[i];/某设置监测哨某/low=1;high=i-1;while(low<=high){/某在r[low..high]中折半查找有序插入的位置某/mid=(low+high)/2;if(L->tu[0].mathtu[mid].math)high=mid-1;/某插入点在低半区某/elelow=mid+1;/某插入点在高半区某/}/某while某/for(j=i-1;j>=low;--j)L->tu[j+1]=L->tu[j];/某记录后移某/L->tu[high+1]=L->tu[0];/某插入到正确位置某/}/某if某/}/某for某/break;cae4:
for(i=2;ilength;i++){if(L->tu[i].databaetu[i-1].databae){L->tu[0]=L->tu[i];/某设置监测哨某/low=1;high=i-1;while(low<=high){/某在r[low..high]中折半查找有序插入的位置某/mid=(low+high)/2;if(L->tu[0].databaetu[mid].databae)high=mid-1;/某插入点在低半区某/elelow=mid+1;/某插入点在高半区某/}/某while某/for(j=i-1;j>=low;--j)L->tu[j+1]=L->tu[j];/某记录后移某/L->tu[high+1]=L->tu[0];/某插入到正确位置某/
}/某if某/
}/某for某/
break;
cae5:
for(i=2;ilength;i++)
{
if(L->tu[i].umtu[i-1].um)
{
L->tu[0]=L->tu[i];/某设置监测哨某/
low=1;
high=i-1;
while(low<=high)
{/某在r[low..high]中折半查找有序插入的位置某/
mid=(low+high)/2;
if(L->tu[0].umtu[mid].um)
high=mid-1;/某插入点在低半区某/
ele
low=mid+1;/某插入点在高半区某/
}/某while某/
for(j=i-1;j>=low;--j)
L->tu[j+1]=L->tu[j];/某记录后移某/
L->tu[high+1]=L->tu[0];/某插入到正确位置某/}/某if某/
}/某for某/
break