学生学分信息管理系统-C语言

学生学分信息管理系统-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", 
  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
#include<stdio.h> #include<string.h> #include<stdlib.h> #define Maxsize 100 typedef struct { int jchk; int zhyk; int xxk; int shyk; int rwk; }Lesson; typedef struct { char name[10]; char sex[4]; char clas[10]; char mayor[20]; char number[20]; Lesson kch; }Linelist; typedef struct { Linelist data[Maxsize]; int length; }Sqlist; FILE *fp; /*保存函数*/ void Save(Sqlist &L,int n) { int i=0; system("cls"); if((fp=fopen("Sqlist.txt","w"))==NULL) { printf("文件打不开!\n"); exit(1); } while(i<n) { fprintf(fp,"\n姓名 性别 班级 专业 学号\n"); fprintf(fp,"%s%15s%15s%15s%15s",L.data[i].name,L.data[i].sex,L.data[i].clas, L.data[i].mayor,L.data[i].number); fprintf(fp,"\n基础课 专业课 选修课 实验课 人文课(学分)\n"); fprintf(fp,"%15d%15d%15d%15d%15d\n",L.data[i].kch.jchk,L.data[i].kch.zhyk,L.data[i].kch.xxk, L.data[i].kch.shyk,L.data[i].kch.rwk); i++; } fclose(fp); printf("\n\n\n\n\n\n\n\t\t\t\t保存成功!!\n\a\a\a"); system("pause"); } /*统计毕业学生*/ void Education(Sqlist L,int n) { int i,found=0; system("cls"); for(i=0;i<n;i++) if(L.data[i].kch.jchk>=50 && L.data[i].kch.zhyk>=50 && L.data[i].kch.xxk>=24 && L.data[i].kch.shyk>=20 && L.data[i].kch.rwk>=8) { printf("\n姓名 性别 班级 专业 学号\n"); printf("%s %15s %15s %15s %15s",L.data[i].name,L.data[i].sex, L.data[i].clas,L.data[i].mayor,L.data[i].number); printf("\n"); printf("基础课 专业课 选修课 实验课 人文课(学分)\n"); printf("%d %15d %15d %15d %15d\n", L.data[i].kch.jchk,L.data[i].kch.zhyk,L.data[i].kch.xxk, L.data[i].kch.shyk,L.data[i].kch.rwk); found=1; } if(found==0) printf("\n\n\n\n\n\n\t\t\t所有学生均不达到标准,不能毕业!\n"); system("pause"); } /*统计未毕业学生*/ void Diseducate(Sqlist L,int n) { int i,found=0; system("cls"); for(i=0;i<n;i++) if(L.data[i].kch.jchk<50 || L.data[i].kch.zhyk<50 || L.data[i].kch.xxk<24 || L.data[i].kch.shyk<20 || L.data[i].kch.rwk<8) { printf("\n姓名 性别 班级 专业 学号\n"); printf("%s %15s %15s %15s %15s",L.data[i].name,L.data[i].sex, L.data[i].clas,L.data[i].mayor,L.data[i].number); printf("\n"); printf("基础课 专业课 选修课 实验课 人文课(学分)\n"); printf("%d %15d %15d %15d %15d\n", L.data[i].kch.jchk,L.data[i].kch.zhyk,L.data[i].kch.xxk, L.data[i].kch.shyk,L.data[i].kch.rwk); found=1; } if(found==0) printf("\n\n\n\n\n\n\t\t\t所有学生都合格!\n"); system("pause"); } /*班级查找*/ void Scanclass(Sqlist L,int n) { char a[10]; int find=0,i; system("cls"); printf("请输入班级:"); scanf("%s",a); for(i=0;i<n;i++) { if(strcmp(a,L.data[i].clas)==0) { printf("\n姓名 性别 班级 专业 学号\n"); printf("%s %15s %15s %15s %15s",L.data[i].name,L.data[i].sex, L.data[i].clas,L.data[i].mayor,L.data[i].number); printf("\n基础课 专业课 选修课 实验课 人文课(学分)\n"); printf("%d %15d %15d %15d %15d\n", L.data[i].kch.jchk,L.data[i].kch.zhyk,L.data[i].kch.xxk, L.data[i].kch.shyk,L.data[i].kch.rwk); find=1; } } if(find==0) printf("没有该班级!"); system("pause"); } /*输入学生信息*/ void Studentinformation(Sqlist &L,int &n) { int i=n; char J; system("cls"); printf("是否输入学生信息(y,n):\n"); scanf("%s",&J); do { if(J=='y') { printf("姓名 性别 班级 专业 学号\n"); scanf("%s %15s %15s %15s %15s",&L.data[i].name,&L.data[i].sex, &L.data[i].clas,&L.data[i].mayor,&L.data[i].number); printf("基础课 专业课 选修课 实验课 人文课(学分)\n"); scanf("%d %15d %15d %15d %15d",&L.data[i].kch.jchk,&L.data[i].kch.zhyk, &L.data[i].kch.xxk,&L.data[i].kch.shyk,&L.data[i].kch.rwk); i++;n++; } printf("是否继续输入?(y,n):"); scanf("%s",&J); }while(J=='y'); printf("是否保存?(y,n):"); scanf("%s",&J); if(J=='y') Save(L,n); } /*初始化*/ void Initlist(Sqlist &L) { L.length=0; } /*按学号查找*/ int Binsearch(Sqlist &L,int n) { int i,j; int low=0,high=n-1,mid; char k[20]; Linelist temp; system("cls"); for(i=1;i<n;i++) { temp=L.data[i]; j=i-1; while(j>=0 && strcmp(temp.number,L.data[j].number)<0) { L.data[j+1]=L.data[j]; j--; } L.data[j+1]=temp; } printf("请输入学生学号:\n"); scanf("%s",k); printf("\n"); while(low<=high) { mid=(low+high)/2; if(strcmp(k,L.data[mid].number)==0) { printf("该学生信息如下:\n"); printf("\n\n姓名 性别 班级 专业 学号\n"); printf("%s %15s %15s %15s %15s",L.data[mid].name,L.data[mid].sex, L.data[mid].clas,L.data[mid].mayor,L.data[mid].number); printf("\n基础课 专业课 选修课 实验课 人文课\n"); printf("%d %15d %15d %15d %15d\n",L.data[mid].kch.jchk,L.data[mid].kch.zhyk, L.data[mid].kch.xxk,L.data[mid].kch.shyk,L.data[mid].kch.rwk); return (mid); } else if(strcmp(k,L.data[mid].number)<0) high=mid-1; else low=mid+1; } printf("未找到!\n"); return -1; } /*删除*/ void Delelem(Sqlist &L,int &n) { int i,j;char J; i=Binsearch(L,n); if(i==-1) printf("未找到!\n"); else { for(j=i;j<n;j++) L.data[j]=L.data[j+1]; n--; printf("删除成功!\n"); printf("是否保存?(y,n):"); scanf("%s",&J); if(J=='y') Save(L,n); } } /*输出函数*/ void Display(Sqlist L,int n) { int i; system("cls"); for(i=0;i<n;i++) { printf("\n\n\n姓名 性别 班级 专业 学号\n"); printf("%s %15s %15s %15s %15s",L.data[i].name,L.data[i].sex, L.data[i].clas,L.data[i].mayor,L.data[i].number); printf("\n"); printf("基础课 专业课 选修课 实验课 人文课(学分)\n"); printf("%d %15d %15d %15d %15d\n", L.data[i].kch.jchk,L.data[i].kch.zhyk,L.data[i].kch.xxk, L.data[i].kch.shyk,L.data[i].kch.rwk); } system("pause"); } /*打开文件*/ int Open(Sqlist &L ) { int i=0; if((fp=fopen("Sqlist.txt","r"))==NULL) { printf("文件打不开!\n"); exit(1); } while(!feof(fp)) { fscanf(fp,"\n姓名 性别 班级 专业 学号\n"); fscanf(fp,"%s%15s%15s%15s%15s",&L.data[i].name,&L.data[i].sex, &L.data[i].clas,&L.data[i].mayor,&L.data[i].number); fscanf(fp,"\n基础课 专业课 选修课 实验课 人文课(学分)\n"); fscanf(fp,"%d%15d%15d%15d%15d\n",&L.data[i].kch.jchk, &L.data[i].kch.zhyk,&L.data[i].kch.xxk, &L.data[i].kch.shyk,&L.data[i].kch.rwk); i++; } fclose(fp); return (i); } /*希尔排序*/ void Shellsort(Sqlist &L,int n) { int i,j,gap;char k; system("cls"); Linelist temp; gap=n/2; printf("请输入课程类别,基础课(j) 专业课(z) 选修课(x) 实验课(s) 人文课(r)\n"); scanf("%s",&k); if(k=='j') { while(gap>0) { for(i=gap;i<n;i++) { temp=L.data[i]; j=i-gap; while(j>=0 && temp.kch.jchk<L.data[j].kch.jchk) { L.data[j+gap]=L.data[j]; j=j-gap; } L.data[j+gap]=temp; } gap=gap/2; } } if(k=='z') { while(gap>0) { for(i=gap;i<n;i++) { temp=L.data[i]; j=i-gap; while(j>=0 && temp.kch.zhyk<L.data[j].kch.zhyk) { L.data[j+gap]=L.data[j]; j=j-gap; } L.data[j+gap]=temp; } gap=gap/2; } } if(k=='x') { while(gap>0) { for(i=gap;i<n;i++) { temp=L.data[i]; j=i-gap; while(j>=0 && temp.kch.xxk<L.data[j].kch.xxk) { L.data[j+gap]=L.data[j]; j=j-gap; } L.data[j+gap]=temp; } gap=gap/2; } } if(k=='s') { while(gap>0) { for(i=gap;i<n;i++) { temp=L.data[i]; j=i-gap; while(j>=0 && temp.kch.shyk<L.data[j].kch.shyk) { L.data[j+gap]=L.data[j]; j=j-gap; } L.data[j+gap]=temp; } gap=gap/2; } } if(k=='r') { while(gap>0) { for(i=gap;i<n;i++) { temp=L.data[i]; j=i-gap; while(j>=0 && temp.kch.rwk<L.data[j].kch.rwk) { L.data[j+gap]=L.data[j]; j=j-gap; } L.data[j+gap]=temp; } gap=gap/2; } } Display(L,n); } /*修改学分*/ void Change(Sqlist &L,int n) { system("cls"); char ch;int a;int i;char s[10]; i=Binsearch(L,n); if(i==-1) printf("未找到\n"); else { printf("确定修改么?(y or n):"); scanf("%s",&ch); while(ch=='y') { if(ch=='y') { printf("请输入要修改的课程:"); scanf("%s",s); printf("\n"); printf("请输入新学分:"); scanf("%d",&a); printf("\n"); if(strcmp(s,"jchk")==0) L.data[i].kch.jchk=a; if(strcmp(s,"zhyk")==0) L.data[i].kch.zhyk=a; if(strcmp(s,"xxk")==0) L.data[i].kch.xxk=a; if(strcmp(s,"shyk")==0) L.data[i].kch.shyk=a; if(strcmp(s,"rwk")==0) L.data[i].kch.rwk=a; } printf("需要继续修改么?继续(y),不继续(n):"); scanf("%s",&ch); printf("\n"); } printf("是否保存?(y,n):"); scanf("%s",&ch); if(ch=='y') Save(L,n); } } /*主菜单*/ void menu(Sqlist &L,int n,int &m) { int c; system("cls"); while(m==1) { printf("\t\t*=======================================================*\n"); printf("\t\t*\t\t**学分管理系统**\t\t\t*\n"); printf("\t\t*=======================================================*\n"); printf("\t\t*\t\t0.输入学生信息\t\t\t\t*"); printf("\n\t\t*\t\t1.修改学生信息\t\t\t\t*"); printf("\n\t\t*\t\t2.按分数排序\t\t\t\t*"); printf("\n\t\t*\t\t3.按学号查找\t\t\t\t*"); printf("\n\t\t*\t\t4.按班级查找\t\t\t\t*"); printf("\n\t\t*\t\t5.统计可以毕业的学生\t\t\t*"); printf("\n\t\t*\t\t6.统计未毕业的学生\t\t\t*"); printf("\n\t\t*\t\t7.查看所有信息\t\t\t\t*"); printf("\n\t\t*\t\t8.删除信息\t\t\t\t*"); printf("\n\t\t*\t\t9.保存文件\t\t\t\t*"); printf("\n\t\t*\t\t10.打开文件\t\t\t\t*"); printf("\n\t\t*\t\t11.退出系统\t\t\t\t*\n"); printf("\t\t*=======================================================*\n"); printf("\n\t\t Give your choice(0-11):"); scanf("%d",&c); switch(c) { case 0:Studentinformation(L,n);break; case 1:Change(L,n);break; case 2:Shellsort(L,n);break; case 3:Binsearch(L,n);break; case 4:Scanclass(L,n);break; case 5:Education(L,n);break; case 6:Diseducate(L,n);break; case 7:Display(L,n);break; case 8:Delelem(L,n);break; case 9:Save(L,n);break; case 10:Open(L);break; case 11:system("cls");printf("\n\n\n\n\n\t\t\t谢 谢 使 用 本 系 统 !\n"); printf("\n\n\n\n\t\t\t Please input anykey to quit!!\n\a\a");m=5;break; default: printf("\t\t\t Error!\n"); printf("\t\t\t please input again!:"); scanf("%d",&c);break; } } } /*主函数*/ void main() { int i,j=123;char ch;system("color 97"); printf("\t==============================================================\n"); printf("\t\t\t\t系 统 公告!\n"); printf("\t==============================================================\n"); printf("\n\t1、本系统是学分管理程序系统,首先要输入密码才能进入系统!"); printf("\n\n\t2、进入系统后请按提示操作!"); printf("\n\n\t3、注意:系统中要输入的课程均是汉语拼音!"); printf("\n\n\t4、基础课 专业课 选修课 实验课 人文课分别如下: "); printf("\n\n\t5、jchk zhyk xxk shyk rwk"); printf("\n\n\t6、本系统制作者 : 李仁刚 舒世朝 李俊宏"); printf("\n\n\t7、 E_mail : ahhqlrg@163.com\t手机:13516474749"); printf("\n\n\t8、 Made By VC6.0++\t\t\t 2009年12月14日\n"); printf("\n\t============================================================\n"); printf("\t欢迎使用学分管理系统!\n\n"); printf("\t请输入密码(123):"); scanf("%d",&i); int m=1; Sqlist L; Initlist(L); system("color 3e"); do { if(i==j) { system("cls"); printf("是否打开原有文件(y or n)?"); scanf("%s",&ch); if(ch=='y') { L.length=Open(L); menu(L,L.length,m); } else menu(L,L.length,m); } else { printf("密码错误!\n"); printf("please input again!"); scanf("%d",&i); } }while(m==1); }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值