<>学生管理系统(C/C#)详细代码及软件设计说明书

(对您有用的话,记得推荐给身边小伙伴,点点赞吧!谢谢啦!)
**
实践项目一、学生管理系统的设计与实现
设计并实现一个学生管理系统,即定义一个包含学生信息(学号,姓名,成绩)的的顺序表,可以不考虑重名的情况,系统至少包含以下功能:
(1)根据指定学生个数,逐个输入学生信息;
(2)逐个显示学生表中所有学生的相关信息;
(3)给定一个学生信息,插入到表中指定的位置;
(4)删除指定位置的学生记录;
(5)统计表中学生个数;
(6)利用快速排序按照学号进行排序;
(7)分别利用直接插入排序和折半插入排序按照成绩进行排序;
(8)根据成绩进行折半查找,成功返回此学生的学号和姓名。

**
#include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<string.h> #
define OK 1 #define ERROR 0 #define OVERFLOW -2 #define MAXSIZE 100 typedef int
Status; // 定义函数返回值类型 typedef struct { double no; // 学号 char name[20]; // 姓名
double grade; // 成绩 }student; typedef student ElemType; typedef struct {
ElemType*elem; // 存储空间的基地址 int length; // 当前长度 }SqList; Status InitList(SqList *
L) // 构造空的顺序表 L { L->elem=(ElemType *)malloc(sizeof(ElemType)*MAXSIZE);
//为顺序表分配一个大小为MAXSIZE的空间 if(!L->elem) exit(OVERFLOW); L->length=0; return OK; }
ElemTypeGetElem(SqList &L,int i) // 访问顺序表,找到 i位置,返回给 e { return L.elem[i]; }
void Input(ElemType* e) { printf("学号:"); scanf("%lf", &e->no); printf("姓名:");
scanf("%s", &e->name); printf("成绩:"); scanf("%lf", &e->grade); printf("输入完成\n\n"
); } void Output(ElemType* e) { printf("学号(6位内):%-10.0lf\t 姓名:%-20s\t
成绩:%-10.1lf\t\n", e->no, e->name, e->grade); } int Patition(SqList* L,int low,
int high) { //快速排序实现按学号排序 //交换顺序表L中子表r[low..high]的记录,枢轴记录到位,并返回其所在位置
//此时在它之前(后)的记录均不大于(小于)它 L->elem[0] = L->elem[low]; //用子表的第一个记录作枢轴记录 int 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(SqList* L, int low, int high) {
//对顺序表L中的子序列L.r[low...high]做快速排序 if (low < high) { //长度大于等于1 int pivotloc =
Patition(L, low, high); //一分为二 QSort(L, low, pivotloc - 1); //对低子表递归排序 QSort(L,
pivotloc+ 1, high); //对高子表递归排序 } } void QuickSort(SqList* L) { //对顺序表L做快速排序
QSort(L, 1, L->length); } /*void InsertSort(SqList& L) {//对顺序表L做直接插入排序,根据学生成绩排序
int i, j; for(i=2;i<=L.length;i++) if (L.elem[i].grade < L.elem[i -
1].grade)//“<”,需将elem[i]插入有序子表 { L.elem[0] = L.elem[i]; //将待插入的记录暂存到监视哨中
L.elem[i] = L.elem[i-1];//elem[i-]后移 for (j = i - 2; L.elem[0].grade <
L.elem[j].grade; --j)//从后向前寻找插入位置 L.elem[j + 1] = L.elem[j];//记录逐步后移,直到找到插入位置
L.elem[j + 1] = L.elem[0];//将elem[0]即原elem[i],插入到正确位置 } }*/ void BInsertSort(
SqList& L) { //对顺序表L做折半插入排序,根据学生成绩排序 int i, j, m, low, high; for (i = 2; i <= L.
length; ++i) { L.elem[0] = L.elem[i];//将待插入的记录暂存到监视哨中 low = 1; high = i - 1;
//置查找区间初值 while (low <= high) //在elem[low..high]中折半查找插入的位置 { m = (low + high) /
2; //折半 if (L.elem[0].grade < L.elem[m].grade) high = m - 1;//插入点在前一子表 else low
= m + 1; //插入点在后一子表 } for (j = i - 1; j >= high + 1; --j) L.elem[j + 1] = L.elem
[j];//记录后移 L.elem[high + 1] = L.elem[0];//将elem[o]即原elem[i],插入到正确位置 } } Status
Search(SqList* L, int f)//根据折半查找实现用户提供成绩,系统返回该学生信息 { int low = 1, high = L->
length, mid; while (low <= high) { mid = (low + high) / 2; if (L->elem[mid].
grade== f) Output(&L->elem[mid]); if (L->elem[mid].grade > f) { high = mid - 1;
} else { low = mid + 1; } } return 0; } int Search(SqList &L,char str[]) //
根据名字查找,返回该同学在顺序表中的编号 { for(int i=1;i<=L.length;i++) { if(strcmp(L.elem[i].name,
str)==0) return i; } return 0; } Status ListInsert(SqList &L,int i,ElemType e)
// 在 指定位置插入某个学生的信息 { if((i<1)||(i>L.length+1)) return ERROR; if(L.length==
MAXSIZE) return ERROR; for(int j=L.length;j>=i;j--) { L.elem[j+1]=L.elem[j]; } L
.elem[i]=e; ++L.length; return OK; } Status ListDelete(SqList &L,int i) //
在顺序表中删除 i位置的学生信息 { if((i<1)||(i>L.length)) return ERROR; for(int j=i;j<=L.length
;j++) { L.elem[j]=L.elem[j+1]; } --L.length; return OK; } int main() { SqList L;
ElemType a,b,c; printf("********欢迎来到学生信息管理系统********\n"); printf(
"\n**************主菜单******************\n\n"); printf("1. 构造顺序表\n"); //存储学生信息
printf("2. 录入学生信息\n"); //根据指定学生个数,逐个输入学生信息 printf("3. 显示学生信息\n");
//调用OutPut函数实现存储数据的遍历 printf("4. 输入姓名,查找该学生\n");//由学生姓名查找该生信息 printf("5.
显示某位置该学生信息\n"); //在表中某位置的学生信息 printf("6. 在指定位置插入学生信息\n"); printf("7.
在指定位置删除学生信息\n"); printf("8. 统计学生个数\n"); printf("9. 根据学生成绩排序\n"); printf(
"10.根据指定分数查找学生信息\n"); printf("0. 退出\n"); printf(
"\n**************************************\n\n"); int x,i,f,number; while(1) {
printf("\n请输入所需功能对应的数字\n"); scanf("%d",&number); if(number==0) break; switch(
number) { case 1: if(InitList(&L)) printf("成功建立顺序表\n\n"); else printf(
"顺序表建立失败\n\n"); break; case 2: printf("请输入要录入学生的人数(小于100):\n"); scanf("%d",&x);
for(int i=1;i<=x;i++) { printf("第%d个学生:\n",i); Input(&L.elem[i]); } L.length=x;
break; case 3: QuickSort(&L); //使用快速排序实现根据学号排序 for(int i=1;i<= L.length;i++) {
Output(&L.elem[i]); } break; case 4: char s[20]; printf("\n请输入要查找的学生姓名:\t");
scanf("%s",s); if(Search(L,s)) Output(&L.elem[Search(L,s)]); else puts(
"对不起,查无此人"); break; case 5: printf("\n请输入要查询的位置:"); int id1; scanf("%d",&id1); b
=GetElem(L,id1); Output(&b); break; case 6: printf ("\n请输入要插入的位置:"); int id2;
scanf("%d",&id2); printf("请输入学生信息:\n"); Input(&c); if(ListInsert(L,id2,c)) { x++
; puts("插入成功"); } else { puts("插入失败"); } break; case 7: printf("\n请输入要删除的位置:\n")
; int id3; scanf("%d",&id3); if(ListDelete(L,id3)) { x--; puts("删除成功"); } else {
puts("删除失败"); } break; case 8: printf("\n已录入的学生个数为:%d\n\n",L.length); break;
case 9: puts("\n按照成绩排序为:\n"); BInsertSort(L); for (int i = 1; i <= L.length; i++
) { //InsertSort(L); Output(&L.elem[i]); } break; case 10: printf(
"\n请输入您想查找的分数:\n"); scanf("%d",&f); Search(&L,f); puts("\n"); break; } } printf(
"\n\n谢谢您的使用,请按任意键退出\n\n\n"); system("pause"); return 0; } `` ##
软件设计说明书在本博客下,请移步到我的博客下查看,谢谢!

技术
今日推荐
PPT
阅读数 131
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:766591547
关注微信