编程实现一个简单学生成绩管理系统的操作(静态表C语言代码)
编程实现一个简单学生成绩表的操作
- 实验要求
- 解析
- 代码段
- 结果展示
实验要求
此系统的功能包括:
1 查询:按特定的条件查找学生
2 修改:按学号对某个学生的某门课程成绩进行修改
3 插入:增加新学生的信息
4 删除:按学号删除已退学的学生的信息。
5 要求采用顺序存储结构来实现对上述成绩表的相关操作
解析
通过顺序表,将一个一个元素插入然后再打印出来,本题解我用的是静态的顺序表,并实现查询,删除,插入,修改的功能。
代码段
用C写的代码段
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct { //定义一个学生结构体
char no[20]; // 学号
char name[20]; // 姓名
char sex[20]; //性别
int price; // 英语成绩
int score; //高数成绩
} Student;
typedef struct {
Student elem[MAXSIZE]; //线性表占用的数组空间
int last; //最后一个元素的下标
} SeqList;
int Locate(SeqList *L,Student e) { //按照姓名查找
/*用e返回L中第i个数据元素的值*/
int i;
for(i=0; i<L->last+1; i++) {
if(!strcmp(L->elem[i].name,e.name)) //比较两个字符串是否相同
return i+1;
}
return 0;
}
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-1; k--) //元素向后移动位置
L->elem[k+1]=L->elem[k];
L->elem[i-1]=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-1]=L->elem[k]; //将后面元素依次前移
}
L->last--;
return 1;
}
int main() {
int i,x,a,temp,select,sum=0,c;
SeqList L;
Student m,e;
printf("请输入学生的数量:");
scanf("%d",&x);
printf("\n");
sum=x;
for(i=0; i<x; i++) {
printf("第%d位学生信息\n",i+1);
printf("\n");
printf("学号:");
scanf("%s",L.elem[i].no);
printf("姓名:");
scanf("%s",L.elem[i].name);
printf("性别:");
scanf("%s",L.elem[i].sex);
printf("英语成绩:");
scanf("%d",&L.elem[i].price);
printf("高数成绩:");
scanf("%d",&L.elem[i].score);
}
L.last=x;
printf("\n");
printf("所有学生的相关信息为:\n\n");
for(i=0; i<L.last; i++) {
printf("学号:%s 姓名:%s 性别:%s 英语成绩:%d 高数成绩:%d\n\n",L.elem[i].no,L.elem[i].name,L.elem[i].sex,L.elem[i].price,L.elem[i].score);
}
printf("\n");
while(1) {
printf("------------------菜单------------------\n");
printf(" 1-姓名查找\n");
printf(" 2-位置查找\n");
printf(" 3-插入\n");
printf(" 4-删除\n");
printf(" 5-修改学生成绩\n");
printf(" 6-退出系统\n");
printf("------------------菜单------------------\n");
scanf("%d",&x);
switch(x) {
case 1:
printf("请输入你要查找的姓名:");
scanf("%s",e.name);
temp=Locate(&L,e);
if(temp!=0)
printf("学号:%s 性别:%s 英语成绩:%d 高数成绩:%d\n\n",L.elem[temp-1].no,L.elem[temp-1].sex,L.elem[temp-1].price,L.elem[temp-1].score);
else
printf("查找失败!\n\n");
break;
case 2:
printf("请输入你要查询的位置:");
scanf("%d",&i);
if(i<=0||i>L.last)
printf("查询失败!\n\n");
else
printf("该位置的学生信息为\n学号:%s 姓名:%s 性别:%s 英语成绩:%d 高数成绩:%d\n\n\n",
L.elem[i-1].no,L.elem[i-1].name,L.elem[i-1].sex,L.elem[i-1].price,L.elem[i-1].score);
break;
case 3:
printf("请输入你要插入的位置:");
scanf("%d",&a);
printf("请输入插入学生信息:\n");
printf("学号:");
scanf("%s",m.no);
printf("姓名:");
scanf("%s",m.name);
printf("性别:");
scanf("%s",m.sex);
printf("英语成绩:");
scanf("%d",&m.price);
printf("高数成绩:");
scanf("%d",&m.score);
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: {
printf("请输入你要修改成绩的学生姓名:");
scanf("%s",e.name);
temp=Locate(&L,e);
if(temp!=0) {
printf("请依次输入英语成绩和高数成绩: ");
int a,b;
scanf("%d%d",&a,&b);
L.elem[temp-1].price=a;
L.elem[temp-1].score=b;
printf("修改成功!\n");
printf("学号:%s 性别:%s 英语成绩:%d 高数成绩:%d\n\n",L.elem[temp-1].no,L.elem[temp-1].sex,L.elem[temp-1].price,L.elem[temp-1].score);
} else {
printf("输入名字有误,请重新输入\n");
}
}
break;
case 6: {
printf("当前总学生个数为:%d\n\n",sum);
}
printf("当前所有学生的相关信息为:\n\n");
for(i=0; i<L.last; i++) {
printf("学号:%s 姓名:%s 性别:%s 英语成绩:%d 高数成绩:%d\n\n",L.elem[i].no,L.elem[i].name,L.elem[i].sex,L.elem[i].price,L.elem[i].score);
}
printf("\n");
printf("退出成功\n");
return 0;
default:
printf("ERROR!\n");
}
printf("\n");
}
return 1;
}
结果展示
点赞支持下作者吧(卑微ˋ( ° ▽、° ) )
学习使我妈快乐: 希尔排序有点问题
m0_74873655: 希尔排序增量是多少?
顾屿南歌。: 你这名字说的对
m0_49876899: 大佬,为什么我运行希尔排序只有当增量为1时才是正确的
呜呜呜白白呀: 这是哪一个版本的idea