超好的学生成绩管理系统顺序表实现的代码含详细注释哦

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

超好的学生成绩管理系统顺序表实现的代码含详细注释哦
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define LIST_INIT_SIZE 4 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
//学生的定义
typedef struct
{
int num;
char name[20];
float english;
float math;
float database;
float sum;
float average;
}Student;
//顺序表的定义
typedef struct
{
printf("姓名:");
fflush(stdin);
scanf("%s",L->stu[L->length].name) ;
printf("英语成绩:");
fflush(stdin);
scanf("%f",&L->stu[L->length].engl ish);
printf("高数成绩:");
fflush(stdin);
scanf("%f",&L->stu[L->length].math );
printf("数据结构成绩:");
fflush(stdin);
scanf("%f",&L->stu[L->length].data base);
L->stu[L->length].sum=L->stu[L->le ngth].english+L->stu[L->length].mat h+L->stu[L->length].database;
L->stu[L->length].average=L->stu[L ->length].sum/3;
L->length++;
printf("是否继续[Y/N]... ");
fflush(stdin);
flag = getchar();
if(flag=='N'||flag=='n')
break;
}
}
return 0;
}
//函数2显示所有学生信息
int Display(sqlist *L)
{
int i;
if(L->length<=1)
{
printf("请先输入数据!\n");
return 0;
}
printf("所有同学信息如下:\n");
printf("学号\t姓名\t总分\t平均分\t 英语成绩\t高数成绩\t数据结构成绩\n");
for(i=1;i<L->length;i++)
printf("%d\t%s\t%.2f\t%.2f\t%.2f\t \t%.2f\t\t%.2f\n",L->stu[i].num,L-> stu[i].name,L->stu[i].sum,L->stu[i] .average,L->stu[i].english,L->stu[i ].math,L->stu[i].database);
return 0;
}
//函数3插入一条记录到表尾
void Insert(sqlist *L)
{
printf("学号:");
scanf("%d",&L->stu[L->length].nu m);
printf("姓名:");
scanf("%s",L->stu[L->length].nam e);
printf("英语成绩:");
scanf("%f",&L->stu[L->length].en glish);
printf("高数成绩:");
scanf("%f",&L->stu[L->length].ma th);
printf("数据结构成绩:");
scanf("%f",&L->stu[L->length].da tabase);
L->stu[L->length].sum=L->stu[L-> length].english+L->stu[L->length].m ath+L->stu[L->length].database;
L->stu[L->length].average=L->stu [L->length].sum/3;
L->length++;
}
//函数4删除一条记录
int Delete(sqlist *L)
{
char s[20];
int i=1,j,ch,n;//第一个是哨兵
if(L->length<=1)
{
printf("请先输入数据!\n");
return 0;
}
printf("1.按姓名删除\n2.按学号删除\n请选择:");
scanf("%d",&ch);
if(ch==1)
{
printf("请输入姓名:");
scanf("%s",s);
while(strcmp(L->stu[i].name,s)!=0& &i<L->length)
i++;
}
else
{
printf("请输入学号:");
scanf("%d",&n);
while(L->stu[i].num!=n&&i<L->lengt h)
i++;
}
if(i>=L->length)
{
printf("要删除记录不存在!");
return 0;
}
for(j=i;j<L->length;j++)
L->stu[j]=L->stu[j+1];
printf("删除成功!\n");
L->length--;
return 0;
}
//函数5统计成绩
int Statistic(sqlist *L)
{
int
i,j=1,j1=1,j2=1,j3=1,k=1,k1=1,k2=1,
k3=1;//要算及格率两个整数相除可能会是0所以float型
float
aver,stusum=0,stusum1=0,stusum2=0,s tusum3=0,count1=0,count2=0,count3=0 ;
if(L->length<=1)
{
printf("请先输入数据!\n");
return 0;
}
for(i=1;i<L->length;i++)
{
//用于计算全班平均成绩
stusum+=L->stu[i].sum;
//用于计算各科平均成绩
stusum1+=L->stu[i].english;
stusum2+=L->stu[i].math;
stusum3+=L->stu[i].database;
//查找总分最高分
if(L->stu[j].sum<L->stu[i].sum)
j=i;
//查找总分最低分
if(L->stu[k].sum>L->stu[i].sum)
k=i;
//查找英语最高分
if(L->stu[j1].english<L->stu[i].en glish)
j1=i;
//查找高数最高分
if(L->stu[j2].math<L->stu[i].math)
j2=i;
//查找数据结构最高分
if(L->stu[j3].database<L->stu[i].d atabase)
j3=i;
//查找英语最低分
if(L->stu[k1].english>L->stu[i].en glish)
k1=i;
//查找高数最低分
if(L->stu[k2].math>L->stu[i].math)
k2=i;
//查找数据结构最低分
if(L->stu[k3].database>L->stu[i].d atabase)
k3=i;
//用于计算及格率
if(L->stu[i].english>=60)
count1++;
if(L->stu[i].math>=60)
count2++;
if(L->stu[i].database>=60)
count3++;
}
aver=stusum/L->length;
printf("共有%d条记
录.\n",L->length);
printf("总分最高的记录:\n");
printf("学号\t姓名\t总分\t平均分\t 英语成绩\t高数成绩\t数据结构成绩\n");
printf("%d\t%s\t%.2f\t%.2f\t%.2f \t\t%.2f\t\t%.2f\n",L->stu[j].num,L ->stu[j].name,L->stu[j].sum,L->stu[
j].average,L->stu[j].english,L->stu [j].math,L->stu[j].database);
printf("总分最低的记录:\n");
printf("学号\t姓名\t总分\t平均分\t 英语成绩\t高数成绩\t数据结构成绩\n");
printf("%d\t%s\t%.2f\t%.2f\t%.2f \t\t%.2f\t\t%.2f\n",L->stu[k].num,L ->stu[k].name,L->stu[k].sum,L->stu[ k].average,L->stu[k].english,L->stu [k].math,L->stu[k].database);
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->stu[j1].english);
printf("高数最高
分:%.2f\n",L->stu[j2].math);
printf("数据结构最高
分:%.2f\n",L->stu[j3].database);
printf("英语最低
分:%.2f\n",L->stu[k1].english);
printf("高数最低
分:%.2f\n",L->stu[k2].math);
printf("数据结构最低
分:%.2f\n",L->stu[k3].database);
return 0;
}
//函数6查找
int Search(sqlist *L)
{
char sn[20];
int
i=1,ch1,ch2,j,snum,low,high,mid;
if(L->length<=1)
{
printf("请先输入数据!\n");
return 0;
}
printf("1.顺序查找\n2.二分查找\n请选择:");
scanf("%d",&ch1);
if(ch1==1){
printf("1.按学号查找\n2.按姓名查找\n请选择:");
scanf("%d",&ch2);
if(ch2==1)
{
printf("请输入学号:");
scanf("%d",&snum);
while(L->stu[i].num!=snum&&i<L->le ngth)
i++;
}
else{
printf("请输入姓名:");
scanf("%s",sn);
while(strcmp(L->stu[i].name,sn)!=0 &&i<L->length)
i++;
}
if(i>=L->length)
{
printf("查找失败!");
return 0;
}
printf("查找成功!\n");
printf("学号\t姓名\t总分\t平均分\t 英语成绩\t高数成绩\t数据结构成绩\n");
printf("%d\t%s\t%.2f\t%.2f\t%.2f \t\t%.2f\t\t%.2f\n",L->stu[i].num,L ->stu[i].name,L->stu[i].sum,L->stu[ i].average,L->stu[i].english,L->stu [i].math,L->stu[i].database);
}
if(ch1==2){
printf("1.按学号查找\n2.按姓名查找\n请选择:");
scanf("%d",&ch2);
if(ch2==1)
{ //二分查找,先按学号排序for(i=2;i<L->length;i++)
if(L->stu[i].num<L->stu[i-1].num)
{
L->stu[0]=L->stu[i];
L->stu[i]=L->stu[i-1];
for(j=i-2;L->stu[0].num<L->stu[j]. num;j--)
L->stu[j+1]=L->stu[j];
L->stu[j]=L->stu[0];
}
printf("请输入学号:");
scanf("%d",&snum);
low=1;high=L->length-1 ; // 置区间初值
while(low<=high)
{ mid=(low+high)/2;
if( L->stu[mid].num==snum) {
printf("查找成功!\n");
printf("学号\t姓名\t总分\t平均分\t 英语成绩\t高数成绩\t数据结构成绩\n");
printf("%d\t%s\t%.2f\t%.2f\t%.2f \t\t%.2f\t\t%.2f\n",L->stu[mid].num ,L->stu[mid].name,L->stu[mid].sum,L ->stu[mid].average,L->stu[mid].engl ish,L->stu[mid].math,L->stu[mid].da tabase);
return 0;
}
else
if(snum<L->stu[mid].num)
high=mid-1; // 继续在前半区间进行查找
else
low=mid+1; // 继续在后半区间进行查找
}
printf("查找失败!\n");
return 0;
}
else
{ //二分查找,先按
姓名排序
for(i=2;i<L->length;i++)
if(strcmp(L->stu[i].name,L->stu[i-1].name)<0)
{
L->stu[0]=L->stu[i];
L->stu[i]=L->stu[i-1];
for(j=i-2;strcmp(L->stu[0].name,L-
>stu[j].name)<0;j--)
L->stu[j+1]=L->stu[j];
L->stu[j]=L->stu[0];
}
printf("请输入姓名:");
scanf("%s",sn);
low=1;high=L->length-1 ; // 置区间初值
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(L->stu[mid].name,sn)==0) {
printf("查找成功!\n");
printf("学号\t姓名\t总分\t平均分\t英语成绩\t高数成绩\t数据结构成绩
\n");
printf("%d\t%s\t%.2f\t%.2f\t%.2f\t \t%.2f\t\t%.2f\n",L->stu[mid].num,L ->stu[mid].name,L->stu[mid].sum,L-> stu[mid].average,L->stu[mid].englis h,L->stu[mid].math,L->stu[mid].data base);
return 0;
}
else
if(strcmp(sn,L->stu[mid].name)<0) high=mid-1; // 继续在前半区间进行查找
else
low=mid+1; // 继续在后半区间进行查找
}
printf("查找失败!\n");
return 0;
}//else
}//if(ch1==2)
}
//函数7排序
int Sort(sqlist *L)
{
int i,ch1,ch2,j,k;
int low, high, mid;
if(L->length<=1)
{
printf("请先输入数据!\n");
return 0;
}
printf("1.直接插入排序\t2.折半插入排序\n3.冒泡排序\t4.直接选择排序\n请选择:");
scanf("%d",&ch1);
switch (ch1){
case 1:
printf("1.按学号排序\n2.按英语成绩排序\t3.按高数成绩排序\n4.按数据结构成绩排序\t5.按总分排序\n请选择:");
scanf("%d",&ch2);
switch (ch2){
case 1:
for(i=2;i<L->length;i++) if(L->stu[i].num<L->stu[i-1].num)
{
L->stu[0]=L->stu[i];
L->stu[i]=L->stu[i-1];
for(j=i-2;L->stu[0].num<L->stu[j]. num;j--)
L->stu[j+1]=L->stu[j];
L->stu[j]=L->stu[0];
}
break;
case 2:
for(i=2;i<L->length;i++)
if(L->stu[i].english<L->stu[i-1].e nglish)
{
L->stu[0]=L->stu[i];
L->stu[i]=L->stu[i-1];
for(j=i-2;L->stu[0].english<L->stu [j].english;j--)
L->stu[j+1]=L->stu[j];
L->stu[j]=L->stu[0];
}
break;
case 3:
for(i=2;i<L->length;i++) if(L->stu[i].math<L->stu[i-1].math )
{
L->stu[0]=L->stu[i];
L->stu[i]=L->stu[i-1];
for(j=i-2;L->stu[0].math<L->stu[j] .math;j--)
L->stu[j+1]=L->stu[j];
L->stu[j]=L->stu[0];
}
break;
case 4:
for(i=2;i<L->length;i++) if(L->stu[i].database<L->stu[i-1]. database)
{
L->stu[0]=L->stu[i];
L->stu[i]=L->stu[i-1];
for(j=i-2;L->stu[0].database<L->st u[j].database;j--)
L->stu[j+1]=L->stu[j];
L->stu[j]=L->stu[0];
}
break;
case 5:
for(i=2;i<L->length;i++) if(L->stu[i].sum<L->stu[i-1].sum)
{
L->stu[0]=L->stu[i];
L->stu[i]=L->stu[i-1];
for(j=i-2;L->stu[0].sum<L->stu[j]. sum;j--)
L->stu[j+1]=L->stu[j];
L->stu[j]=L->stu[0];
}
break;
}//swich(ch2)
break;
case 2:
printf("1.按学号排序\n2.按英语成绩排序\t3.按高数成绩排序\n4.按数据结构成绩排序\t5.按总分排序\n请选择:");
scanf("%d",&ch2);
switch (ch2){
case 1:
for(i=2; i<L->length; i++)
{
if(
L->stu[i].num<L->stu[i-1].num)
{
L->stu[0]=L->stu[i]; /*设置监测哨*/
low=1;
high=i-1;
while(low<=high)
{/*在
r[low..high]中折半查找有序插入的位置*/ mid=(low+high)/2;
if(L->stu[0].num<L->stu[mid].num) high=mid-1; /*插入点在低半区*/
else
low=mid+1; /*插入点在高半区*/
}/*while*/
for(j=i-1; j>=low; --j)
L->stu[j+1]=L->stu[j]; /*记录后移*/
L->stu[high+1]=L->stu[0]; /*插入到正确位置*/
}/*if*/
}/*for*/
break;
case 2:
for(i=2; i<L->length; i++)
{
if(
L->stu[i].english<L->stu[i-1].engl ish)
{
L->stu[0]=L->stu[i]; /*设置监测哨*/
low=1;
high=i-1;
while(low<=high)
{/*在
r[low..high]中折半查找有序插入的位置*/ mid=(low+high)/2;
if(L->stu[0].english<L->stu[mid].e nglish)
high=mid-1; /*插入点在低半区*/
else low=mid+1; /*插入点在高半区*/
}/*while*/
for(j=i-1; j>=low; --j)
L->stu[j+1]=L->stu[j]; /*记录后移*/
L->stu[high+1]=L->stu[0]; /*插入到正确位置*/
}/*if*/
}/*for*/
break;
case 3:
for(i=2; i<L->length; i++)
{
if(
L->stu[i].math<L->stu[i-1].math)
{
L->stu[0]=L->stu[i]; /*设置监测哨*/
low=1;
high=i-1;
while(low<=high)
{/*在
r[low..high]中折半查找有序插入的位置*/ mid=(low+high)/2;
if(L->stu[0].math<L->stu[mid].math )
high=mid-1; /*插入点在低半区*/
else low=mid+1; /*插入点在高半区*/
}/*while*/
for(j=i-1; j>=low; --j)
L->stu[j+1]=L->stu[j]; /*记录后移*/
L->stu[high+1]=L->stu[0]; /*插入到正确位置*/
}/*if*/
}/*for*/
break;
case 4:
for(i=2; i<L->length; i++)
{
if(
L->stu[i].database<L->stu[i-1].dat abase)
{
L->stu[0]=L->stu[i]; /*设置监测哨*/
low=1;
high=i-1;
while(low<=high)
{/*在
r[low..high]中折半查找有序插入的位置*/ mid=(low+high)/2;
if(L->stu[0].database<L->stu[mid]. database)
high=mid-1; /*插入点在低半区*/
else low=mid+1; /*插入点在高半区*/
}/*while*/
for(j=i-1; j>=low; --j)
L->stu[j+1]=L->stu[j]; /*记录后移*/
L->stu[high+1]=L->stu[0]; /*插入到正确位置*/
}/*if*/
}/*for*/
break;
case 5:
for(i=2; i<L->length; i++)
{
if(
L->stu[i].sum<L->stu[i-1].sum)
{
L->stu[0]=L->stu[i]; /*设置监测哨*/
low=1;
high=i-1;
while(low<=high)
{/*在
r[low..high]中折半查找有序插入的位置*/ mid=(low+high)/2;
if(L->stu[0].sum<L->stu[mid].sum) high=mid-1; /*插入点在低半区*/
else low=mid+1; /*插入点在高半区*/
}/*while*/
for(j=i-1; j>=low; --j)
L->stu[j+1]=L->stu[j]; /*记录后移*/
L->stu[high+1]=L->stu[0]; /*插入到正确位置*/
}/*if*/
}/*for*/
break;
}//swich(ch2)
break;
case 3:
printf("1.按学号排序\n2.按英语成绩排序\t3.按高数成绩排序\n4.按数据结构成绩排序\t5.按总分排序\n请选择:");
scanf("%d",&ch2);
switch (ch2){
case 1:
//采用自前向后扫描的方法,对顺序表L做冒泡排序
i=L->length-1;
while(i>1)
{
k=1;
for(j=1; j<i;
j++)
if(L->stu[j+1].num<L->stu[j].num)
{
L->stu[0]=L->stu[j];
L->stu[j]=L->stu[j+1];
L->stu[j+1]=L->stu[0];
k=j; /*交换的位置*/
}
i=k;
}
break;
case 2:
//采用自前向后扫描的方
法,对顺序表L做冒泡排序
i=L->length-1;
while(i>1)
{
k=1;
for(j=1; j<i;
j++)
if(L->stu[j+1].english<L->stu[j].e
nglish)
{
L->stu[0]=L->stu[j];
L->stu[j]=L->stu[j+1];
L->stu[j+1]=L->stu[0];
/*交换的位置*/
}
i=k;
}
break;
case 3:
//采用自前向后扫描的方法,对顺序表L做冒泡排序
i=L->length-1;
while(i>1)
{
k=1;
for(j=1; j<i;
j++)
if(L->stu[j+1].math<L->stu[j].math )
{
L->stu[0]=L->stu[j];
L->stu[j]=L->stu[j+1];
L->stu[j+1]=L->stu[0];
/*交换的位置*/
}
i=k;
}
break;
case 4:
//采用自前向后扫描的方法,对顺序表L做冒泡排序
i=L->length-1;
while(i>1)
{
k=1;
for(j=1; j<i;
j++)
if(L->stu[j+1].database<L->stu[j]. database)
{
L->stu[0]=L->stu[j];
L->stu[j]=L->stu[j+1];
L->stu[j+1]=L->stu[0];
/*交换的位置*/
}
i=k;
}
break;
case 5:
//采用自前向后扫描的方
法,对顺序表L做冒泡排序
i=L->length-1;
while(i>1)
{
k=1;
for(j=1; j<i;
j++)
if(L->stu[j+1].sum<L->stu[j].sum)
{
L->stu[0]=L->stu[j];
L->stu[j]=L->stu[j+1];
L->stu[j+1]=L->stu[0];
k=j; /*交换的位置*/
}
i=k;
}
break;
}//swich(ch2)
break;
case 4:
printf("1.按学号排序\n2.按英语
成绩排序\t3.按高数成绩排序\n4.按数据结构
成绩排序\t5.按总分排序\n请选择:");
scanf("%d",&ch2);
switch (ch2){
case 1:
for(i=1; i<L->length-1;
i++)
{
k=i;
for(j=i+1; j<L->length; j++)
/*在i开始的L.length-i+1
个记录中选关键字最小的记录*/
if(L->stu[k].num>L->stu[j].num)
k=j; /* k中存放关键字最小的记录的下标*/
if(k!=i)
{
L->stu[0]=L->stu[k];
L->stu[k]=L->stu[i];
/*关键字最小的记录与第i个记录*/
L->stu[i]=L->stu[0];
}/*if*/
}/*for*/
break;
case 2:
for(i=1; i<L->length-1;
i++)
{
k=i;
for(j=i+1; j<L->length; j++)
/*在i开始的L.length-i+1
个记录中选关键字最小的记录*/
if(L->stu[k].english>L->stu[j].engl ish)
k=j; /* k中存放关键字最小的记录的下标*/
if(k!=i)
{
L->stu[0]=L->stu[k];
L->stu[k]=L->stu[i];
/*关键字最小的记录与第i个记录*/
L->stu[i]=L->stu[0];
}/*if*/
}/*for*/
break;
case 3:
for(i=1; i<L->length-1;
i++)
{
k=i;
for(j=i+1; j<L->length; j++)
/*在i开始的L.length-i+1
个记录中选关键字最小的记录*/
if(L->stu[k].math>L->stu[j].math)
k=j; /* k中存放关键字最小的记录的下标*/
if(k!=i)
{
L->stu[0]=L->stu[k];
L->stu[k]=L->stu[i];
/*关键字最小的记录与第i个记录*/
L->stu[i]=L->stu[0];
}/*if*/
}/*for*/
break;
case 4:
for(i=1; i<L->length-1;
i++)
{
k=i;
for(j=i+1; j<L->length; j++)
/*在i开始的L.length-i+1
个记录中选关键字最小的记录*/
if(L->stu[k].database>L->stu[j].dat abase)
k=j; /* k中存放关键字最小的记录的下标*/
if(k!=i)
{
L->stu[0]=L->stu[k];
L->stu[k]=L->stu[i];
/*关键字最小的记录与第i个记录*/
L->stu[i]=L->stu[0];
}/*if*/
}/*for*/
break;
case 5:
for(i=1; i<L->length-1;
i++)
{
k=i;
for(j=i+1; j<L->length; j++)
/*在i开始的L.length-i+1
个记录中选关键字最小的记录*/
if(L->stu[k].sum>L->stu[j].sum)
k=j; /* k中存放关键字最小的记录的下标*/
if(k!=i)
{
L->stu[0]=L->stu[k];
L->stu[k]=L->stu[i]; /*关键字最小的记录与第i个记录*/
L->stu[i]=L->stu[0];
}/*if*/
}/*for*/
break;
}//swich(ch2)
break;
}//swich(ch1)
}
//0退出程序
void tuichu(sqlist *L)
{
if(!L->stu)
free(L->stu);
printf("\n谢谢使用!\n");
exit(0); //关闭所有文件,终止正在执行的程序显示press any key to continue }
//主菜单
int menu()
{
int c;
printf("\t\t******学生成绩管理系统******\n");
printf("\t\t 1.录入信息
\n");
printf("\t\t 2.显示所有学生信息\n");
printf("\t\t 3.插入一条记录
\n");
printf("\t\t 4.删除一条记录
\n");
printf("\t\t 5.统计成绩
\n");
printf("\t\t 6.查找\n");
printf("\t\t 7.排序\n");
printf("\t\t 0.退出\n");
printf("\t\t********************** ******\n");
printf("请输入您的选择:");
scanf("%d",&c);
while(c<0||c>8)
{
printf("输入错误!请重新输入:");
fflush(stdin);
scanf("%d",&c);
}
return c;
}
//主函数 //输出成文件格式int main()
{
sqlist a,*LL=&a;
//初始化线性表
LL->stu=(Student
*)malloc(LIST_INIT_SIZE*sizeof(Stud ent));
LL->length=1;//为查找、排序方便将第一个当哨兵
LL->listsize=LIST_INIT_SIZE;
while(1)
switch(menu())
{
case 1:Input(LL);break;
case 2:Display(LL);break;
case 3:Insert(LL);break;
case 4:Delete(LL);break;
case 5:Statistic(LL);break;
case 6:Search(LL);break;
case 7:Sort(LL);break;
case 0:tuichu(LL);
}
return 0;
}。

相关文档
最新文档