学生学分管理系统(C语言)

本文档详细介绍了如何实现一个大学学分管理系统,包括管理员账号管理、加分项存储、学生信息管理、加分信息存储等功能。系统通过读取文本文件存储数据,提供了信息录入、查询、修改和删除等操作,并能保存数据。用户可通过输入选择进行各项操作,如添加学生、录入加分信息等。
摘要由CSDN通过智能技术生成

学生学分管理系统

  • 说明

    需要在代码同一级目录下添加administrator.txt(存储管理员用户名与密码),point_table.txt(存储所有加分项名称与分值),student.txt(存储所有学生基本信息),credit.txt(存储所有加分信息:加分学生学号与加分项名称),存储方式如下所示:
    • administrator.txt
      john john12345
      jason jason875981
      lilly lilly228751  
      
    • point_table.txt
      国际级竞赛一等奖 5
      国际级竞赛二等奖 4
      国际级竞赛三等奖 3
      国家级竞赛一等奖 4
      国家级竞赛二等奖 3
      国家级竞赛三等奖 2
      省部级竞赛一等奖 3
      省部级竞赛二等奖 2
      省部级竞赛三等奖 1
      学校级竞赛一等奖 2
      学校级竞赛二等奖 1
      学校级竞赛三等奖 0.5
      班长 1.5
      学习委员 1
      副班长 0.1
      国家级三好学生 20
      省级三好学生 10
      市级三好学生 7
      校级三好学生 5
      年级三好学生 2
      
    • student.txt
      张一 1 19 计科 20170001
      张二 1 19 计科 20170002
      张三 0 18 网安 20170003
      张四 0 19 计科 20170004
      张五 1 18 物联网 20170005
      张六 0 18 网安 20170006
      
    • credit.txt
      20170001 国际级竞赛一等奖
      20170002 国际级竞赛二等奖
      20170002 市级三好学生
      20170002 学校级竞赛一等奖
      20170003 省部级竞赛二等奖
      20170004 省级三好学生
      20170004 班长
      20170005 国家级三好学生
      20170005 省级三好学生
      20170006 市级三好学生
      
  • 代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//管理员结构体
typedef struct admin{
	char name[50]; //用户名
	char pass[50]; //密码
	struct admin * next; //链表,指针指向下一个元素
}admin;

//存储所有加分项
typedef struct point{
	char name[50]; //加分项名称
	float score; //分值
	struct point *next;  //链表,指针指向下一个元素
}point;
//存储每一个同学的所有加分项
typedef struct record{
	char name[50];  
	struct record * next;
}record;

//存储所有学生
typedef struct student{
	char name[50];  //姓名
	int sex; //0为男生, 1为女生
	int age; //年龄
	char major[50];  //专业
	char number[50]; //学号
	float score; //总学分

	record * head; //获奖记录
	struct student * next; //下一个学生
}student;

//读取所有管理员账号的用户名与密码
void read_admin(admin **head) {
	char name[50],pass[50]; //姓名,密码
	admin * cur; //用于记录链表末端元素的指针
	FILE *fp = fopen("administrator.txt","r");
	if(fp == NULL) {  //同级目录下没有该文件
		*head = NULL;
		printf(":: 文件administrator.txt 不存在!\n");
		return;
	}
	while(fscanf(fp, "%s %s",name,pass) != EOF) {  //读到缓存name,pass数组中
		if(*head == NULL) {  //链表为空
			*head = (admin*)malloc(sizeof(admin)); //新建一个空间
			strcpy((*head) -> name, name);  //拷贝到链表中
			strcpy((*head) -> pass, pass);
			(*head) -> next = NULL;
			cur = *head; //记录末端元素
		}else{
			cur -> next = (admin*)malloc(sizeof(admin));
			strcpy(cur -> next -> name,name); //拷贝到到链表中
			strcpy(cur -> next -> pass,pass);
			cur -> next -> next = NULL; //标记末指针的下一个元素的指针为空
			cur = cur -> next;
		}
	}
}

//读取所有加分项
void read_point(point **add) { //二级指针
	char name[50];  //临时存储
	float score;
	point * cur;
	FILE *fp = fopen("point_table.txt","r");
	if(fp == NULL) {
		*add = NULL;
		printf(":: 文件point_table.txt 不存在!\n");
		return;
	}
	while(fscanf(fp, "%s %f",name, &score) != EOF) {
		if(*add == NULL) {
			*add = (point*)malloc(sizeof(point));
			strcpy((*add) -> name, name);
			(*add) -> score = score;
			(*add) -> next = NULL;
			cur = *add;
		}else{
			cur -> next = (point*)malloc(sizeof(point));
			strcpy(cur -> next -> name,name);
			cur -> next -> score = score;
			cur -> next -> next = NULL;
			cur = cur -> next;
		}
	}
}

//输出所有管理员信息(调试)
void print_admin(admin *head) {
	printf("用户名\t密码\n");
	while(head != NULL) {
		printf("%s\t%s\n",head -> name,head -> pass);
		head= head->next;
	}
}

//检查输入的账户是否合法,返回-1代表无此用户,0代表密码不正确,1代表正确
int check_admin(admin *head, char name[],char pass[]) {
	int exist = 0;
	int pass_ok = 0;
	while(head != NULL) {
		if(strcmp(head -> name, name) == 0) {  //如果用户名与输入相同
			exist = 1;
			if(strcmp(head -> pass, pass) == 0) { //密码正确
				pass_ok = 1;
			}
			break;
		}
		head = head->next;
	}
	if(exist == 0) return -1; //用户不存在
	else if(pass_ok == 0) return 0; //密码不对
	else return 1;  //正确
} 

//从文件读取所有学生信息
void read_student(student **head) {
	FILE *fp = fopen("student.txt","r");
	if(fp == NULL) {
		*head = NULL;
		printf(":: 文件student.txt 不存在!\n");
		return;
	}
	char name[50];
	char number[50];
	char major[50];
	int sex,age;

	student *cur;
	while(fscanf(fp, "%s %d %d %s %s",name, &sex, &age, major, number) != EOF) {
		if(*head == NULL) {
			*head = (student *) malloc(sizeof(student));
			strcpy((*head) -> name,name);
			strcpy((*head) -> major,major);
			strcpy((*head) -> number,number);
			(*head) -> sex = sex;
			(*head) -> age = age;
			(*head) -> next = NULL;
			(*head) -> head = NULL;
			(*head) -> score = 0;
			cur = *head;
		}else{
			cur -> next = (student *)malloc(sizeof(student));
			strcpy(cur -> next -> name, name);
			strcpy(cur -> next -> major, major);
			strcpy(cur -> next -> number, number);
			cur -> next -> sex = sex;
			cur -> next -> age = age;
			cur -> next -> head = NULL;
			cur -> next -> next = NULL;
			cur -> next -> score = 0;
			cur = cur -> next;
		}
	}
}

//依据加分项名称获得加分数值
float get_add_score(point *add, char name[]) {
	while(add != NULL) {
		if(strcmp(add -> name, name) ==0) return add -> score; //找到学生并返回姓名
		add = add -> next;
	}
	return 0;
}

//输出单个学生的所有加分项信息
void print_student_point_list(student *stu, point *add) {
	if(stu -> head == NULL) {
		printf(":: 无加分项!\n");
	}else{
		record *cur = stu -> head; // 学生stu的获奖记录
		printf("名称\t分值\n");
		while(cur != NULL) { //遍历链表直到末尾
			printf("%s\t%.1f\n",cur -> name, get_add_score(add, cur -> name));
			cur = cur->next;  //指针改成下一个
		}
		printf("\n");
	}
}

//输出单个学生基本信息及加分项信息
void print_student(student *stu, point *add){
	printf("姓名\t学号\t\t性别\t年龄\t专业\t学分\n");
	printf("%s\t%s\t%s\t%d\t%s\t%.1f\n", stu -> name, stu -> number, stu -> sex ==0?"男":"女", stu ->age,stu->major,stu->score);
	printf("\n具体加分项信息:\n");
	print_student_point_list(stu, add);
}

//输出所有学生基本信息
void print_all_student(student *stu){
	printf("姓名\t学号\t\t性别\t年龄\t专业\t学分\n");
	while(stu != NULL) {
		printf("%s\t%s\t%s\t%d\t%s\t%.1f\n", stu -> name, stu -> number, stu -> sex ==0?"男":"女", stu ->age,stu->major,stu->score);
		stu = stu -> next;
	}
}

//输出所有加分项信息
int print_score_list(point *add) {
	printf("序号\t加分名称\t分值\n");
	int index =0;
	while(add!=NULL) {
		printf("%d\t%s\t%.1f\n",index++,add->name,add->score);
		add = add -> next;
	}
	printf("\n");
	return index;
}

//依据加分项编号获得加分项指针
point * get_point(point *add,int index) {
	int i = 0;
	point *res=add;
	while(i<index) { //查找第i个加分项
		res =res->next; //下一个
		i++;
	}
	return res;
}
//依据学号找到学生指针
student * find_student(student *head, char number[]) {
	while(head != NULL) {
		if(strcmp(head -> number, number) == 0) break; //找到该学号学生
		head = head -> next;
	}
	return head;
}
//给学生stu添加名为name的加分项
void add_credit(student * stu, point * add,char name[]) {
	record *r = stu -> head, *cur = NULL;
	if(r == NULL) {
		stu -> head = (record *)malloc(sizeof(record)); // 初始化头节点指针
		strcpy(stu -> head -> name, name);
		stu -> head -> next = NULL;
		//printf("%s %.1f\n",name,get_add_score(add, name));
		stu -> score += get_add_score(add, name);  //将该项学分驾到学生头上
		cur = stu -> head;
	}else{
		while(r -> next !=NULL) {
			r = r -> next;
		} // 找到链表末尾元素
		r -> next = (record *)malloc(sizeof(record)); //新建空间
		strcpy(r -> next -> name, name);
		r -> next -> next = NULL;
		//printf("%s %.1f\n",name,get_add_score(add, name));
		stu -> score += get_add_score(add, name);
	}
}
//读取所有学生已有的加分项
void read_credit(student *head, point * add) {
	FILE *fp = fopen("credit.txt", "r");
	if(fp == NULL) {
		printf(":: 文件credict.txt 不存在!\n");
		return;
	}
	char number[50];
	char name[50];

	while(fscanf(fp, "%s %s",number, name) != EOF) {
		student *cur = find_student(head, number);
		//printf("%s\n",cur->name);
		add_credit(cur, add, name);  //添加该奖项
	}
}

//录入信息,可以从文件中录入,也可以从键盘录入(包括录入学生基本信息即添加学生、录入学生学分信息即添加加分信息)
void input(student **stu, point **add) {
	printf("**************** 信息录入 ******************\n");
	printf("************* 1. 从文件录入 *****************\n");
	printf("************* 2. 从键盘录入 *****************\n");
	printf("*******************************************\n");
	int opt;
	printf("-> 请输入您的选择: ");
	scanf("%d",&opt);
	if(opt == 1) {
		read_point(add);
		read_student(stu);
		//printf("student ok!\n");
		read_credit(*stu,*add);
		//printf(":: 成功从文件读取信息!\n");
		print_all_student(*stu);
	}else if(opt == 2) {
		printf("************** 键盘信息录入 ********************\n");
		printf("************ 1. 录入同学信息 *******************\n");
		printf("************ 2. 录入学分信息 *******************\n");
		printf("**********************************************\n");
		printf("-> 请输入您的选择: ");
		int opt1;
		scanf("%d",&opt1);
		if(opt1==1) {  //添加学生
			student *tmp = (student *)malloc(sizeof(student));
			printf("-> 请输入姓名: ");
			scanf("%s",tmp->name);

			printf("-> 请输入学号: ");
			scanf("%s",tmp->number);

			printf("-> 请输入性别(0代表男生,1代表女生): ");
			scanf("%d",&tmp->sex);

			printf("-> 请输入年龄: ");
			scanf("%d",&tmp->age);

			printf("-> 请输入专业: ");
			scanf("%s",tmp->major);

			tmp -> score = 0;
			tmp -> head = NULL;
			tmp -> next = NULL;

			if(*stu == NULL) {
				*stu = tmp;
			}else{
				student *cur = (*stu);
				while(cur -> next != NULL) cur = cur -> next; //找到末元素
				cur -> next = tmp; //添加到末元素之后
			}
			printf(":: 添加成功!\n");
		}else if(opt1 == 2) {  //添加学分信息
			int n =print_score_list(*add);
			char number[50];
			printf("-> 请输入学号: ");
			scanf("%s",number);
			student *cur = find_student(*stu, number);  //找到该学生的指针
			if(cur == NULL) {
				printf(":: 无此学生!\n");
			}else{
				int index;
				print_student(cur, *add);  //输出所有加分项
				printf("-> 请输入加分项ID: ");
				scanf("%d",&index);  //选择加分项
				if(index>=0&&index<n){
					point *res=get_point(*add,index);  //查找加分项
					add_credit(cur, *add, res->name);  //添加加分项
					printf(":: 添加成功!\n");
				}else{
					printf(":: 加分项ID应大于等于0小于%d\n",n);
				}
			}
		}else{
			printf("输入有误!\n");
		}
	}else{
		printf(":: 输入有误!\n");
	}
}
//查询信息,可以查询个人的基本信息及所有加分信息,也可以查询每个专业的排名信息
void search(student *stu, point *add) {
	printf("********************* 信息查询 **********************\n");
	printf("******************* 1. 个人信息查询 ******************\n");
	printf("******************* 2. 专业信息查询 ******************\n");
	printf("****************************************************\n");
	int opt;
	printf("-> 请输入您的选择: ");
	scanf("%d",&opt);
	if(opt == 1) {
		char number[50];
		printf("-> 请输入学号: ");
		scanf("%s",number);
		student *cur = find_student(stu, number);
		if(cur == NULL) {
			printf(":: 无此学生!\n");
		}else{
			print_student(cur,add);
		}
	} else if(opt == 2) {
		char major[50];
		printf("-> 请输入专业名称: ");
		scanf("%s",major);
		student s[10005];
		int tot = 0,i,j;
		student *head = stu;
		while(head != NULL) {
			if(strcmp(head -> major, major) == 0) {  //找到该专业的学生,加入数组
				s[++tot] = *head;
			}
			head = head -> next;
		}
		for(i=1;i<=tot;i++) {  //按照总学分排序
			for(j=i+1;j<=tot;j++) {
				if(s[i].score < s[j].score) {
					student tmp =s[i];
					s[i] = s[j];
					s[j] = tmp;
				}
			}
		}
		printf("姓名\t学号\t\t性别\t年龄\t专业\t学分\n");
		for(i=1;i<=tot;i++) {
			printf("%s\t%s\t%s\t%d\t%s\t%.1f\n", s[i].name, s[i].number, s[i].sex ==0?"男":"女", s[i].age, s[i].major, s[i].score);
		}

	}else{
		printf(":: 输入有误!\n");
	}
}
//修改信息,即修改学生基本信息
void modify(student *stu, point *add) {
	printf("********************* 个人信息修改 **********************\n");
	char number[50];
	printf("-> 请输入待修改学生学号: ");
	scanf("%s",number);
	student *cur = find_student(stu, number);  //找到该学生
	if(cur == NULL) {
		printf(":: 无此学生!\n");
	}else{
		int ok = 1;
		printf("-> 确认修改 %s 同学信息?(0表示取消修改,1确认): ",cur->name);
		scanf("%d",&ok);
		if(ok==0) {
			printf(":: 成功取消修改!\n");
		}
		else{
			printf("-> 请重新输入姓名: ");
			scanf("%s",cur->name);

			printf("-> 请重新输入学号: ");
			scanf("%s",cur->number);

			printf("-> 请重新输入性别(0代表男生,1代表女生): ");
			scanf("%d",&cur->sex);

			printf("-> 请重新输入年龄: ");
			scanf("%d",&cur->age);

			printf("-> 请重新输入专业: ");
			scanf("%s",cur->major);
			printf(":: 修改成功!\n");
		}
		
	}
}
//删除信息,可以删除学生基本信息即删除学生,也可以删除学分信息
void dele(student **stu,point **add) {
	printf("********************* 信息删除 **********************\n");
	printf("******************* 1. 个人信息删除 ******************\n");
	printf("******************* 2. 学分信息删除 ******************\n");
	printf("****************************************************\n");
	int opt,i,j;
	printf("-> 请输入您的选择: ");
	scanf("%d",&opt);
	if(opt == 1) {
		char number[50];
		printf("-> 请输入学号: ");
		scanf("%s",number);
		student *cur = *stu;
		if(cur == NULL) {
			printf(":: 无此学生!\n");
		}else{
			if(strcmp(cur -> number, number) == 0) {  //该学生处在链表头部(这种情况需要修改头部指针)
				int ok = 1;
				printf("-> 确认删除 %s 同学信息?(0表示取消删除,1确认): ",cur->name);
				scanf("%d",&ok);
				if(ok==0) {
					printf(":: 成功取消删除!\n");
				}
				else{
					*stu = cur->next;  //修改头部指针为下一个
					printf(":: 删除成功!\n"); 
					print_all_student(*stu); //输出删除后的所有学生
					free(cur);
				}
					
				return;
			}
			while(cur -> next !=NULL) {
				if(strcmp(cur -> next -> number, number) == 0) break;  //找到该学生
				cur = cur -> next;
			}
			if(cur->next==NULL) {
				printf(":: 无此学生!\n");
			}else{
				int ok = 1;
				printf("-> 确认删除 %s 同学信息?(0表示取消删除,1确认): ",cur-> next -> name);
				scanf("%d",&ok);
				if(ok==0) {
					printf(":: 成功取消删除!\n");
				}
				else{
					cur -> next = cur -> next -> next;  //在链表中删除该学生
					printf(":: 删除成功!\n");
					print_all_student(*stu);
				}
				
			}
		}
	} else if(opt == 2) {
		char number[50];
		printf("-> 请输入学号: ");
		scanf("%s",number);
		student *cur = find_student(*stu, number);
		if(cur == NULL) {
			printf(":: 无此学生!\n");
		}else{
			record *head = cur -> head;  //记录的头指针
			print_student_point_list(cur, *add);  //打印该学生所有已有加分项
			printf("-> 请输入奖项名称: ");
			char name[50];
			scanf("%s",name);
			if(strcmp(head -> name, name) == 0) {  //待删除的记录在链表头部,要修改头节点指针
				int ok = 1;
				printf("-> 确认删除?(0表示取消删除,1确认): ");
				scanf("%d",&ok);
				if(ok==0) {
					printf(":: 成功取消删除!\n");
				}
				else{
					cur -> head = cur -> head -> next;
					cur -> score -= get_add_score(*add, head -> name);
					printf(":: 删除成功!\n");
					print_student_point_list(cur, *add);
				}
			}

			while(head -> next != NULL) {  //找到待删除的指针
				if(strcmp(head -> next -> name,name) == 0) {
					break;
				}
			}
			if(head -> next == NULL) {
				printf(":: 无此加分项!\n");

			}else{
				int ok = 1;
				printf("-> 确认删除?(0表示取消删除,1确认): ");
				scanf("%d",&ok);
				if(ok==0) {
					printf(":: 成功取消删除!\n");
				}
				else{
					
					cur -> score -= get_add_score(*add, head -> next -> name);  //从总学分中减去删除的项的学分
					head -> next = head -> next -> next;  //删除该记录
					printf(":: 删除成功!\n");
					print_student_point_list(cur, *add);//输出删除后的该学生的所有记录
				}
			}
		}

	}else{
		printf(":: 输入有误!\n");
	}
}
//存储所有信息
void save_data(student *stu) {
	FILE *fp_stu = fopen("student.txt", "w");
	FILE *fp_cre = fopen("credit.txt", "w");
	while(stu != NULL) {
		fprintf(fp_stu, "%s %d %d %s %s\n", stu -> name, stu -> sex ,stu -> age, stu -> major, stu -> number);
		record *r = stu -> head;
		while(r != NULL) {
			fprintf(fp_cre, "%s %s\n", stu -> number, r -> name);
			r = r -> next;
		}
		stu = stu -> next;
	}
	printf(":: 保存成功!\n");
	fclose(fp_stu);
	fclose(fp_cre);
}



int main() {
	student *students = NULL;
	point *add = NULL;
	admin *admi = NULL;

	char input_name[50];
	char input_password[50];

	read_admin(&admi);
	if(admi != NULL) {

		printf("-> 请输入用户名: ");
		scanf("%s",input_name);
		printf("-> 请输入密码: ");
		scanf("%s",input_password);

		int check = check_admin(admi,input_name,input_password);
		if(check == -1) return printf(":: 用户名称不存在!\n"),0;
		else if(check == 0) return printf(":: 密码错误!\n"), 0;
		else 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\n");

		printf("-> 请输入您的选择: ");
		int opt;
		scanf("%d",&opt);
		if(opt == 1) {
			input(&students, &add);
			getchar();  //换行确认
			getchar();
		}else if(opt == 2) {
			search(students,add);
			getchar();
			getchar();
		}else if(opt == 3) {
			modify(students,add);
			getchar();
			getchar();
		}else if(opt == 4) {
			dele(&students,&add);
			getchar();
			getchar();
		}else if(opt == 5){
			save_data(students);
			getchar();
			getchar();
		}else if(opt == 6){
			save_data(students);
			break;
		}else{
			printf(":: 输入有误!\n");
		}
	}
}
#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); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值