C/C++项目:超详细教程之大学一定会被布置的作业学生成绩管理系统,看到本篇不要再求别人给你抄啦,更不要花钱去买啦
相信如果你是个专业课有编程相关的大学生,一定被老师布置过令人头疼的学生成绩管理系统,它是高校各种信息管理系统中的一种。看完这篇教你轻松取得好成绩!千万不要花钱去买了!不做冤大头从看到这篇文章开始~
今天我就用C/C++带大家一步步完成学生成绩管理系统
PS:要安装easyx图形库哦 #include<easyx.h>
开发工具为VS2019
在此之前呢,和大家说明一下,因为这是一个比较大的项目了,所以展示所有代码会有些困难,所以我裁剪了主要的大部分代码,主要目的是让大家明白实现这个项目的逻辑思路,希望大家可以理解,完整代码/编译器/图形库在文章最下方获取哦
正片开始:
第一步:定义学生结构,用结构体包装:
//学生结构 节点
typedef struct Student
{
long long number; //学号
char name[10]; //姓名
char grade[20]; //班级
int math; //数学
int chinese; //语文
int english; //英语
struct Student* next; //指向下一个节点得指针
}Student;
第二步:封装链表:
//链表得封装 单链表
typedef struct List
{
Student* front; //头指针
Student* tail; //尾指针 方便插入
}List;
List* createList()
{
List* list = calloc(1, sizeof(List));
if (!list)
{
return NULL;
}
return list;
}
Student* createStudent()
{
Student* newNode = (Student*)calloc(1, sizeof(Student));
if (!newNode)
{
return NULL;
}
return newNode;
}
第三步:从文件中读取数据并生成一个链表返回:
List* createListFromFile(const char*filename)
{
//创建头节点 calloc 会自动初始化申请的内存
Student* headNode = createStudent();
if (!headNode)
{
return NULL;
}
//如果头节点申请成功,则创建链表
List*list = createList();
list->front = headNode;
list->tail = headNode;
FILE* fp = fopen(filename, "r");
//防御性编程,一定错误处理
if (fp == NULL)
{
perror("open file failed~");
return list;
}
//去掉表头字段
char arr[1024] = { 0 };
fgets(arr, 1024, fp);
//读取文件 fscanf p q s t h
while (!feof(fp))
{
Student* newNode = createStudent();
int ret = fscanf(fp, "%lld %s %s %d %d %d", &newNode->number, newNode->name, newNode->grade,
&newNode->math, &newNode->chinese, &newNode->english);
if (ret == EOF) //如果读到了文件结尾,直接退出循环
{
break;
}
//把当前节点插入链表
list->tail->next = newNode;
list->tail = newNode;
}
fclose(fp);
return list;
}
第四步:查看所有学生信息:
//查看所有学生信息
void printAll(List* list)
{
//获取第一个节点的指针
Student* curNode = list->front->next;
//遍历
printf("学号 t姓名t班级tt数学t语文t英语n");
while (curNode !=NULL)
{
printf("%lldt%st%st%dt%dt%dn", curNode->number, curNode->name, curNode->grade,
curNode->math, curNode->chinese, curNode->english);
curNode = curNode->next; //移动curNode
}
}
第五步:查找学生信息:
//查找学生信息
//按学号查找
void searchNumber(List* list,long long number)
{
Student* curNode = list->front->next;
printf("学号 t姓名t班级tt数学t语文t英语n");
while (curNode!=NULL)
{
//开始比较
if (number == curNode->number)
{
printf("%lldt%st%st%dt%dt%dn", curNode->number, curNode->name, curNode->grade,
curNode->math, curNode->chinese, curNode->english);
//学号没有重复的,找到了直接结束循环
break;
}
curNode = curNode->next;
}
}
//按姓名查找
void searchName(List* list,const char*name)
{
Student* curNode = list->front->next;
printf("学号 t姓名t班级tt数学t语文t英语n");
while (curNode!=NULL)
{
//比较姓名
if (strcmp(name,curNode->name) == 0)
{
printf("%lldt%st%st%dt%dt%dn", curNode->number, curNode->name, curNode->grade,
curNode->math, curNode->chinese, curNode->english);
}
curNode = curNode->next;
}
}
第六步:删除学生:
//删除学生
void removeStudent(List* list, long long number)
{
//1,找到要删除的学生节点
Student* prevNode = list->front; //让pervNext指向第一个数据节点
while (prevNode->next != NULL)
{
//找到了
if (prevNode->next->number == number)
{
break;
}
prevNode = prevNode->next;
}
if (prevNode->next != NULL)
{
//先保存要删除的节点
Student* delNode = prevNode->next;
//2,删除:1,先让前面的和后面的相连
prevNode->next = delNode->next;
//2,释放内存
free(delNode);
//如果删除的是最后一个
if (prevNode->next == list->tail)
{
list->tail = prevNode;
}
}
}
oid menu()
{
printf("********学生成绩管理系统****************n");
printf("*tt1,查看所有学生tt*n");
printf("*tt2,添加学生tt*n");
printf("*tt3,删除学生tt*n");
printf("*tt4,查找学生tt*n");
printf("***************************************n");
}
int main()
{
List* list = createListFromFile("assets/student.txt");
int op = -1;
while (true)
{
menu();
printf("input select>");
scanf("%d", &op);
switch (op)
{
case 1: //查看
printAll(list);
break;
case 2: //添加
break;
case 3: //删除
{
long long number = -1;
printf("输入要删除的学生的学号>");
scanf("%lld", &number);
removeStudent(list, number);
}
break;
case 4: //查找
{
printf("****查找类型****n");
printf("****1,按学号查找****n");
printf("****2,按姓名查找****n");
printf("inpu select>");
scanf("%d", &op); //n
if (op == 1)
{
long long number = -1;
printf("请输入要查询的学号>");
scanf("%lld", &number);
searchNumber(list, number);
}
else
{
char name[10] = { 0 };
printf("请输入要查询的姓名>");
getchar(); //读取并丢弃缓冲区中的n
gets_s(name, 10); //为什么直接跳过了
searchName(list, name);
}
}
break;
default:
break;
}
//先暂停
system("pause");
//再清屏
system("cls");
}
return 0;
}