学生学分信息管理系统-C语言
程序设计要求
管理员:
1.对学生已修学分信息进行管理
2.对学生密码进行查看和修改
3.查询:按学号查询某学生的情况;按班级号查询所有同学;按某种课程,输出未达标要求的学生名单。
学生:
1.查询自己信息,学分
2.对自己的密码进行修改
运用函数,链表,指针及相关知识完成。
程序运行介绍
1、程序运行
在程序开始运行时,系统自动从后台读取上次已经保存的数据文件,并自动保存在链表中。
2、系统切换
通过用户在登陆界面选择不同的登录方式,根据选择输入个人密码,从而进入不同的菜单(管理员菜单与学生菜单)。特别的,本系统实现了三次密码输入错误自动退出的功能。
3、管理员系统
进入管理员系统,用户可以通过输入对应的数字进入对应功能,包括:
(1)对学生信息的录入、修改、查询、删除
(2)按课程号输出未达标的学生
(3)浏览、统计学生信息
4、学生系统
(1) 查询信息
(2) 修改密码
数据及数据结构设计描述
本系统定义的链表为学生链表:
其成员有:学生姓名,学生密码,学号,班级号,五类课程学分和总学分
详细设计
4.1 void stupassword
函数功能:确认管理员身份。读取文件,显示登录界面,通过if函数进入不同的密码输入界面;此外若三次密码输入错误,则退出系统。
4.2 void inputstu
函数功能:输入一个学生的信息 ,将学生信息加入已有链表。
4.3 void outputstu
函数功能:打印学生信息,输出链表中学生信息结点的数据。(包括学生姓名,学生密码,学号,班级号,五类课程学分和总学分)
4.4 void deletenode
函数功能:按学号查找并删除学生信息创建新链表,对学生信息进行遍历,找到并进行删除。
4.5 void searchnode1
函数功能:按照学号、班级号查找信息。
4.6 void searchnode2
按班级号查找(按学号大小显示一个班级的情况),输出为整个班级的学生信息。
4.7 void searchnode 3、4
函数功能:输入课程号,按班级号查找(按姓名拼音顺序输出学生信息)。
4.8 void revise
函数功能:按学号查找并修改学生信息
4.9 void allqualifiedstu
函数功能:打印所有可以毕业的学生信息,对所有学生信息进行遍历,判断总学分是否达到要求的200分,并将可以毕业的学生信息打印出来
4.10 void stustatistic
函数功能:按课程号输出未达标的学生。
4.11 void stusave
函数功能:保存文件。
4.12 void stupassword
函数功能: 管理员或学生对密码进行修改。
4.13 void printlist
函数功能:打印链表,输出学生信息。
4.14 void inputg
函数功能:用头插法插入产品信息,若出现重复输入,则返回并重新输入。
4.15 void stupasswordrevise
函数功能:学生修改自己的密码;
追加功能:密码需要两次确认方可修改成功,此目的是防止学生修改密码时误录入错误密码,只需要调用strcmp函数对密码1和密码2进行比较即可。
4.16 void stuview
函数功能:令学生查看信息。
4.17 void keydown1
函数功能:令学生选择操作。
4.18 void readfile
函数功能:从文件中读取信息。
4.19 void writefile
函数功能:从链表中读取文件,写进文本.txt里。
学生菜单:
管理员菜单
代码实现(Visual Studio)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct student
{
char name[20];
char password[20];//学生密码(学生可以修改)
int num;//学号
int classnum;//班级号
int credit[5], allcredit;//五类课程学分和总学分
struct student* next;
};
//管理员操作
void menu1();//学生菜单
void menu2();//管理员菜单
void keydown1(int num);//学生选择操作
void keydown2(struct student* list);//管理员选择操作
int Confirm1(int num);//确认学生身份
int Confirm2();//确认管理员身份
void inputstu(struct student* stu); //输入一个学生的信息
void outputstu(struct student* stu); //输出一个学生的信息
struct student* createlist();//创建链表
void insertnode(struct student* headnode, struct student* data);//插入节点(头插法)
void deletenode(struct student* headnode, int num);//按学号查找并删除节点
void searchnode1(struct student* headnode, int num);//按学号查找结点
void searchnode2(struct student* headnode, int classnum);//按班级号查找(按学号大小显示一个班级的情况)
void searchnode3(struct student* headnode, int classnum);//按班级号查找(按姓名拼音顺序输出学生信息)
void searchnode4(struct student* headnode, int subnum);//输入课程号,输出未达标学生信息
void revise(struct student* headnode, int num);//按学号查找并修改学生信息0
void allqualifiedstu(struct student* headnode);//打印所有可以毕业的学生信息
void printlist(struct student* headnode);//打印链表
void readfile(char* filename);//从文件中读取信息
void writefile(struct student* headnode, char* filename);//从链表中读取文件,写进文本1.txt里
void save(char* filename);//将信息保存到最终的文件stu.txt里
void stustatistic(struct student* headnode);//统计功能(输入学号,输出该学生的课程总学分;输入班级号,输出达标人数和没有达标的学生人数及其信息)
void stupasswordmanage(struct student* headnode);//查看学生密码
//学生操作
void stuview(int num);//学生查看信息
void stupasswordrevise(int num);//学生修改密码
int main()
{
int c,num;
struct student* list = createlist();
struct student* stu = (struct student*)malloc(sizeof(struct student));
printf("请问您是学生还是管理员:\n");
printf("1.学生 2.管理员\n");
scanf_s("%d", &c);
if (c == 1)
{
printf("请输入您的学号:\n");
scanf_s("%d", &num);
if (Confirm1(num)==1) {
//确认学生身份
while (1) {
menu1();
keydown1(num);
system("pause");//暂停程序,等待任意键继续操作
}
}
}
else if (c == 2) {
if (Confirm2() == 1) {
//管理员密码正确
while (1) {
menu2();
keydown2(list);
system("pause");//暂停程序,等待任意键继续操作
}
}
}
else {
printf("选择错误,请重新输入!\n");
}
return 0;
}
int Confirm1(int num)//确认学生身份
{
FILE* fp = fopen("stu.txt", "r");//以只读方式打开文件
int n=0;
struct student a;
char key[100];
printf("请输入您的密码:\n");
scanf_s("%s", key , sizeof(key));
if (fp == NULL)
{
printf("文件无法打开!\n");
exit(1);//异常退出
}
else {
//在文件中查找该学生
while (!feof(fp))
{
fscanf(fp, "%d\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%s\n", &a.num, a.name, &a.classnum, &a.credit[0], &a.credit[1], &a.credit[2], &a.credit[3], &a.credit[4], &a.allcredit, a.password);
if (a.num == num)
{
n = 1;
if (strcmp(a.password, key) == 0) {
printf("登陆成功!\n");
return 1;
}
else {
printf("密码错误,您还有两次机会!请重新输入:\n");
scanf_s("%s", key, sizeof(key));
if (strcmp(a.password, key) == 0) {
printf("登陆成功!\n");
return 1;
}
else {
printf("密码错误,您还有一次机会!请重新输入:\n");
scanf_s("%s", key, sizeof(key));
if (strcmp(a.password, key) == 0) {
printf("登陆成功!\n");
return 1;
}
else {
printf("对不起,您无权限操作!\n");
return 0;
}
}
}
}
}
if (n == 0) {
printf("对不起,此学生不存在!\n");
return 0;
}
}
}
int Confirm2()//确认管理员身份
{
char key[100] = {
"okk" };
char a[100];
printf("请输入管理员密码:\n");
scanf_s("%s", a, sizeof(a));
if (strcmp(a, key) == 0) {
return 1;
}
else {
printf("密码错误,您还有两次机会!请重新输入:\n");
scanf_s("%s", a, sizeof(a));
if (strcmp(a, key) == 0) {
return 1;
}
else {
printf("密码错误,您还有一次机会!请重新输入:\n");
scanf_s("%s", a, sizeof(a));
if (strcmp(a, key) == 0) {
return 1;
}
else {
return 0;
}
}
}
}
void inputstu(struct student* stu) //输入一个学生的信息
{
int k = 0;
scanf_s("%d",