实践项目:学生管理系统的设计与实现
设计并实现一个学生管理系统,即定义一个包含学生信息(学号,姓名,成绩)的的顺序表,可以不考虑重名的情况,系统至少包含以下功能:
(1)根据指定学生个数,逐个输入学生信息;
(2)逐个显示学生表中所有学生的相关信息;
(3)给定一个学生信息,插入到表中指定的位置;
(4)删除指定位置的学生记录;
(5)统计表中学生个数;
(6)利用快速排序按照学号进行排序;
(7)分别利用直接插入排序和折半插入排序按照成绩进行排序;
(8)根据成绩进行折半查找,成功返回此学生的学号和姓名。
注:本系统是参照网上改编,最后由同学帮助改正。vc6.0运行,
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct Student{
double no;// 学号
char name[20];// 姓名
int price;// 成绩
}Student;
int sum=0;
typedef struct{
Student elem[MAXSIZE];//线性表占用的数组空间
int last;//最后一个元素的下标
}SeqList;
//根据指定学生个数,逐个输入学生信息
void inList(SeqList *L,int i)
{
int x;
printf("请输入学生的数量:");
scanf("%d",&x);
printf("\n");
sum=x;
for(i=1;i<=x;i++)
{
printf("第%d位学生信息\n",i);
printf("\n");
printf("学号:");
scanf("%lf",&L->elem[i].no);
printf("-----------------------------\n");
printf("姓名:");
scanf("%s",&L->elem[i].name);
printf("-----------------------------\n");
printf("成绩:");
scanf("%d",&L->elem[i].price);
printf("-----------------------------\n");
}
L->last=x;
printf("\n");
}
//逐个显示学生表中所有学生的相关信息
void outList(SeqList *L,int i)
{
printf("所有学生的相关信息为:\n\n");
for(i=1;i<=L->last;i++)
{
printf("学号:%.0lf姓名:%s 成绩:%d\n\n",L->elem[i].no,L->elem[i].name,L->elem[i].price);
}
printf("\n");
}
//给定一个学生信息,插入到表中指定位置
int InsList(SeqList *L,int i,Student e) //插入学生信息
{ /*在L中第i个位置之前插入新的数据元素e,L的长度加1*/
int k;
if(i<1||(i>L->last+2))
{
return 0;
}
for(k=L->last;k>=i;k--) //元素向后移动位置
L->elem[k+1]=L->elem[k];
L->elem[i]=e;
L->last++;
return 1;
}
//删除指定位置的学生记录
int DelList(SeqList *L,int i)
{
int k;
if(i<1||i>L->last+1)
return 0;
for(k=i;k<=L->last;k++)
{
L->elem[k]=L->elem[k+1]; //将后面元素依次前移
}
L->last--;
return 1;
}
//统计学生数量
void numberList(SeqList *L)
{
printf("总学生个数为:%d\n\n",sum);
}
//直接插入排序
void InsertSort(SeqList* L)
{
int i, j;
for(i=2;i<=L->last;i++)
if (L->elem[i].price < L->elem[i - 1].price)//待比较数值小于前一个数
{
L->elem[0] = L->elem[i];
L->elem[i] = L->elem[i-1];
for (j =i-2;L->elem[0].price < L->elem[j].price; --j)
L->elem[j + 1] = L->elem[j];
L->elem[j + 1] = L->elem[0];
}
printf("按成绩进行直接插入排序为:\n");
for(i=1;i<=L->last;i++)
{
printf("学号:%.0lf 姓名:%s 成绩:%d\n\n",L->elem[i].no,L->elem[i].name,L->elem[i].price);
}
printf("\n");
}
//折半插入排序(成绩)
void BInsert_price(SeqList*L)
{
int low,j;int high;
if(L->last<1)
{
printf("空表");
return;
}
int i;
Student a[MAXSIZE];
for(i=1;i<=L->last;i++)
a[i]=L->elem[i];
for(i=1;i<=L->last;i++)
{
a[0]=a[i];
low=1;high=i;
while(low<=high)
{
int m=(low+high)/2;
if(strcmp(a[0].name,a[m].name)<0) high=m-1;
else low=m+1;//否则,选择m+1—high
}
for(j=i-1;j>=high+1;--j) a[j+1]=a[j];//元素后移
a[high+1]=a[0];//将新元素插入a[high-1]
}
printf("按成绩进行折半插入排序为:\n");
for(i=1;i<=L->last;i++)
{
printf("学号:%.0lf 姓名:%s 成绩:%d\n\n",L->elem[i].no,L->elem[i].name,L->elem[i].price);
}
printf("\n");
}
//根据成绩进行折半查找,成功返回此学生的学号和姓名
void Binary_Search(SeqList *L)
{
int key;
printf("输入要查找的学生成绩:");
scanf("%d",&key);
int low=1,high=L->last;
while(low<=high)
{
int mid=(low+high)/2;
if(L->elem[mid].price==key)
{
printf("学号:%.0lf 姓名:%s\n",L->elem[mid].no,L->elem[mid].name);
return;
}
else if(L->elem[mid].price<key)
low=mid+1;
else if(L->elem[mid].price>key)
high=mid-1;
}
printf("错误!!!没有此学生信息!\n");
}
//快速排序(学号)
int Patition(SeqList *L,int low,int high)
{
L->elem[0]=L->elem[low]; //用第一个记录作枢轴记录
double pivotkey=L->elem[low].no; //枢轴记录关键字
while(low<high)
{ //从表的两端向中间扫描
while(low<high&&L->elem[high].no>=pivotkey)
--high;
L->elem[low]=L->elem[high]; //将比枢轴小的记录移动到低端
while(low<high&&L->elem[low].no<=pivotkey)
++low;
L->elem[high]=L->elem[low]; //将比枢轴大的记录移动到高端
}
L->elem[low]=L->elem[0]; //枢轴记录到位
return low; //返回枢轴位置
}
void QSort(SeqList *L,int low,int high)
{
//对表L中的子序列L.r[low...high]做快速排序
if (low<high){
int pivotloc=Patition(L,low,high); //一分为二
QSort(L,low,pivotloc-1); //对低子表递归排序
QSort(L,pivotloc+1,high); //对高子表递归排序
}
}
void QuickSort(SeqList *L)
{
//对表L做快速排序
QSort(L,1,L->last);
}
int main()
{
int i,x,a,select,c;
SeqList L;
Student m,e;
printf("********************************************************************\n");
printf("* 1. 根据指定学生个数,逐个输入学生信息; *\n");
printf("* 2. 逐个显示学生表中所有学生的相关信息; *\n");
printf("* 3. 给定一个学生信息,插入到表中指定的位置; *\n");
printf("* 4. 删除指定位置的学生记录; *\n");
printf("* 5. 统计表中学生个数; *\n");
printf("* 6. 利用快速排序按照学号进行排序; *\n");
printf("* 7. 分别利用直接插入排序和折半插入排序按照成绩进行排序; *\n");
printf("* 8. 根据成绩进行折半查找,成功返回此学生的学号和姓名; *\n");
printf("* 9. 退出; *\n");
printf("********************************************************************\n");
printf("\n");
while(select)
{
printf("请选择你要操作的选项:");
scanf("%d",&select);
printf("\n");
switch(select)
{
case 1:inList(&L,i);break;
case 2:outList(&L,i);break;
case 3:
printf("请输入你要插入的位置:");
scanf("%d",&a);
printf("请输入插入学生信息:\n");
printf("学号:");
scanf("%lf",&m.no);
printf("姓名:");
scanf("%s",&m.name);
printf("成绩:");
scanf("%d",&m.price);
if(InsList(&L,a,m))
{
sum++;
printf("插入成功!\n\n");
}
else
printf("插入失败!\n\n");
break;
case 4:
printf("请输入要删除学生的位置:");
scanf("%d",&c);
if(DelList(&L,c))
{
sum--;
printf("删除成功!\n\n");
}
else
printf("删除失败!\n\n");
break;
case 5:numberList(&L);break;
case 6:QuickSort(&L);
printf("按学号进行快速排序为\n");
outList(&L,i);
break;
case 7:InsertSort(&L);
BInsert_price(&L);
break;
case 8:Binary_Search(&L);break;
case 9:
{
printf("\n退出系统成功!请按任意键结束!\n");
exit(0);
}
break;
}
}
return 0;
}