【C语言期末作业】学生管理系统核心源码!需要请自行领取

1.题目与要求

1.1问题提出

设计学生成绩管理系统,有N个学生,每个学生的数据包含姓名、年龄、编号和籍贯,试设计一学生管理系统

1.2本系统涉及的知识点

C语言文件操作、数组、函数、链表、头插法、尾插法等等

1.3 功能要求

1、学生信息录入:输入学生的姓名、年龄、编号和籍贯;

2、信息查询:(至少一种查询方式)。按编号查询学生记录,或查询同名学生的记录;

3、信息修改与删除:能够对学生的信息进行一定的修改和删除,存入表单。

4、退出系统:退出整个系统(即主菜单);

1.4 根据所选菜单编写相应代码(略)

1.5 功能效果图(以代码实际效果为准)

二、管理系统源码与注释展示

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

struct MM

{

char name[20];

int age;

int num;

char addr[20];

};

//只需要修改和数据有关东西

struct Node

{

//int data;

struct MM data;

struct Node* next;

};

struct Node* list = NULL;

//1.创建表头:描述最初状态

struct Node* createList()

{

//创建链表就是创建表头

//创建表头就是创建结构体变量

struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));

//表头不给数据初始化

headNode->next = NULL;

return headNode;

}

//2.创建节点,为插入做准备:把数据加工成节点

struct Node* createNode(struct MM data)

{

struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));

newNode->data = data;

newNode->next = NULL;

return newNode;

}

//3.表头法插入

void insertByHead(struct Node* headNode, struct MM data)

{

//插入之前首先要创建节点

struct Node* newNode = createNode(data);

newNode->next = headNode->next;

headNode->next = newNode;

}

void deleteAppoinByName(struct Node* headNode, char *name)

{

//相邻的两个指针

struct Node* posFrontNode = headNode;

struct Node* posNode = headNode->next;

//找指定位置

while (posNode != NULL&&strcmp(posNode->data.name, name))

{

posFrontNode = posNode;

//下面两句一样的功能

posNode = posFrontNode->next;

//posNode=posNode->next

}

//分析查找的结果

//循环退出有两种情况:posNode==NULL ,posNode->data==posData;

if (posNode == NULL)

{

printf("未找到指定无法删除!\n");

return;

}

else  //posNode->data==posData;

{

posFrontNode->next = posNode->next;

free(posNode);

posNode = NULL;

}

}

void deleteAppoinByAge(struct Node* headNode, int age)

{

//相邻的两个指针

struct Node* posFrontNode = headNode;

struct Node* posNode = headNode->next;

//找指定位置

while (posNode != NULL&&posNode->data.age != age)

{

posFrontNode = posNode;

//下面两句一样的功能

posNode = posFrontNode->next;

//posNode=posNode->next

}

//分析查找的结果

//循环退出有两种情况:posNode==NULL ,posNode->data==posData;

if (posNode == NULL)

{

printf("未找到指定无法删除!\n");

return;

}

else  //posNode->data==posData;

{

posFrontNode->next = posNode->next;

free(posNode);

posNode = NULL;

}

}

//查找函数

struct Node* searchByName(struct Node* headNode, char *name)

{

struct Node* pMove = headNode;

while (pMove != NULL&&strcmp(pMove->data.name, name))

{

pMove = pMove->next;

}

return pMove;

}

struct Node* searchByAge(struct Node* headNode, int age)

{

struct Node* pMove = headNode;

while (pMove != NULL&&pMove->data.age != age)

{

pMove = pMove->next;

}

return pMove;

}

void printList(struct Node* headNode)

{

struct Node* pMove = headNode->next; //因为有表头,所以打印是表头的下一个开始打印

printf("姓名\t年龄\t编号\t籍贯\n");

while (pMove != NULL)

{

//printf("%d\t", pMove->data);

printf("%s\t%d\t%d\t%s\n", pMove->data.name, pMove->data.age,

pMove->data.num, pMove->data.addr);

pMove = pMove->next;

}

printf("\n"); //调整打印结果

}

//打印所有相同名字的信息

void printListName(struct Node* headNode,char *name)

{

struct Node* pMove = headNode->next; //因为有表头,所以打印是表头的下一个开始打印

printf("姓名\t年龄\t编号\t籍贯\n");

while (pMove != NULL)

{

//printf("%d\t", pMove->data);

if (strcmp(pMove->data.name,name)==0)

printf("%s\t%d\t%d\t%s\n", pMove->data.name, pMove->data.age,

pMove->data.num, pMove->data.addr);

pMove = pMove->next;

}

printf("\n"); //调整打印结果

}

//特殊需求需要写特殊代码

//删除功能:删除所有相同姓名的人

void deleteByName(struct Node* headNode, char *name)

{

while (searchByName(headNode, name) != NULL)

{

deleteAppoinByName(headNode, name);

}

}

void deleteByAge(struct Node* headNode, int age)

{

while (searchByAge(headNode, age) != NULL)

{

deleteAppoinByAge(headNode, age);

}

}

//文件操作

//读操作

void readInfoFromFile(struct Node* headNode, char *fileName)

{

FILE *fp = fopen(fileName, "r");

if (fp == NULL)

{

fp = fopen(fileName, "w+");

}

struct MM info;

while (fscanf(fp, "%s\t%d\t%d\t%s\n", info.name, &info.age, &info.num, info.addr) != EOF)

{

insertByHead(headNode, info);

}

fclose(fp);

}

//写操作

void saveInfoToFile(struct Node* headNode, char *fileName)

{

FILE *fp = fopen(fileName, "w");

struct Node* pMove = headNode->next;

while (pMove != NULL)

{

fprintf(fp, "%s\t%d\t%d\t%s\n", pMove->data.name, pMove->data.age,

pMove->data.num, pMove->data.addr);

pMove = pMove->next;

}

fclose(fp);

}

void menu()

{

printf("---------【学生管理系统】----------\n");

printf("\t0.退出系统!\n");

printf("\t1.登记学生信息!\n");

printf("\t2.浏览学生信息!\n");

printf("\t3.查找学生信息!\n");

printf("\t4.封印学生信息!\n");

printf("\t5.修改学生信息\n");

printf("\t6.删除所有相同姓名的学生信息\n");

printf("----------------------------------\n");

printf("请输入(0~5):");

}

void keyDown()

{

int choice = 0;

struct MM data;

struct Node* result = NULL;

scanf("%d", &choice);

switch (choice)

{

case 0:

printf("退出成功!\n");

system("pause");

exit(0);

break;

case 1:

printf("请输入(name,age,num,addr):");

scanf("%s%d%d%s", data.name, &data.age, &data.num, data.addr);

insertByHead(list, data);

saveInfoToFile(list, "1.txt");

break;

case 2:

printList(list);

break;

case 3:

printf("请输入要查询的学生的姓名:");

scanf("%s", data.name);

result = searchByName(list, data.name);

if (result == NULL)

{

printf("未找到相关信息!\n");

}

else

{

printf("姓名\t年龄\t编号\t籍贯\n");

printf("%s\t%d\t%d\t%s\n", result->data.name, result->data.age,

result->data.num, result->data.addr);

}

break;

case 4:

printf("请输入要封印的学生信息:");

scanf("%s", data.name);

deleteAppoinByName(list, data.name);

saveInfoToFile(list, "1.txt");

break;

case 5:

printf("请输入要修改的学生的姓名:");

scanf("%s", data.name);

result = searchByName(list, data.name);

if (result == NULL)

{

printf("未找到相关信息!,无法修改\n");

}

else

{

printf("请输入新的信息(name,age,num,addr):");

scanf("%s%d%d%s", result->data.name, &result->data.age,

&result->data.num, result->data.addr);

printf("修改成功!\n");

saveInfoToFile(list, "1.txt");

}

break;

case 6:

printf("请输入要删除的学生的姓名:");

scanf("%s", data.name);

deleteByName(list, data.name);

saveInfoToFile(list, "1.txt");

break;

default:

printf("输入错误!\n");

break;

}

}

int main()

{

list = createList();

readInfoFromFile(list, "1.txt");

while (1)

{

menu();

keyDown();

system("pause");

system("cls");

}

system("pause");

return 0;

}

本次分享就到这里了!源码大家可以直接复制获取~不过可能会因为编译原因导致乱码,建议大家重新写一遍,也可以加深自己的学习映像!如果大家在学习C语言C++的时候有什么学习上的问题的话,可以来和我一起↓↓↓交流学习哦~

另外,对我们来说还是学编程最重要!栽一棵树最好的时间是十年前,其次是现在。对于准备学习编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

C语言C++编程学习交流圈子,QQ群:981108780点击进入】微信公众号:C语言编程学习基地

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

编程学习书籍分享:

编程学习视频分享:

 

  • 9
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
C语言期末作业学生成绩管理系统(免积分下载) 1.主界面:“1.学生登录”“2.教师登录”“3.校长登录”“0.退出系统”,4个选项进行跳转。(main.c) 2.1 选择1,跳转“学生登录界面”,输入学号及默认密码(三次错误及锁定此学号,登录成功后即进入“修改密码子界面”) 2.2 选择2,跳转“教师登录界面”,输入工号及默认密码(三次错误及锁定此工号,登录成功后即进入“修改密码子界面”) 2.3 选择3,跳转“校长登录界面”,输入学号及默认密码(登录成功后即进入“修改密码子界面”) 2.4 选择0,关闭程序。 3.1 成功登录及修改密码后,跳转“学生功能界面”(student.c, student.h) 1、第一次登录强制修改密码。 2、查询成绩 排名 不显示姓名和学号。 平均分 最高分 最低分 3、修改密码 4、查看个人信息 5、三次密码错误锁定帐号,由教师解锁 0、返回上一级 3.2 成功登录及修改密码后,跳转“教师功能界面”(teacher.c ,teacher.h) 1、第一次登录强制修改密码。 2、添加学生(学生的学号自动生成) 单个添加 批量导入 3、删除学生 输入两人次学号确定 删除的学生要记录保存在已退学的文件中 4、查找学生 按姓名查找 按学号查找 5、修改学生信息 修改学生基础信息 修改学生成绩 6、录入学生成绩 单个录入 批量导入 7、重置学生密码 8、显示所有在校学生信息 9、显示所有退出学生信息 10、三次密码错误锁定帐号,由校长解锁 0、返回上一级

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值