学生管理系统

一 :学生信息

1 :头文件

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

typedef struct score{
	int score_c;		
	int score_math;		
	int score_english;  
}Score;
typedef struct student{
	char id[3];
	int age;
	char name[30];
	Score score;
}Student;   
typedef struct node{
	Student stu;
	struct node *next;
}Node;
typedef struct user{
	char name[10];
	char password[10];
	struct user *next;
}User;
typedef struct _userList{
	User users[10];
	int size;
}UserList;

2 : 创建表头

Node* createList(){
	Node* head= (Node*)malloc(sizeof(Node));
	head->next=NULL;
	return head;
}

3: 创建结点

Node* createNode(Student data){
	Node* newNode= (Node*)malloc(sizeof(Node));
	newNode->stu= data;
	newNode->next= NULL;
	return newNode;
} 

4:插入数据(头插法)

void insert(Node* head, Student data) {
	Node* newNode = createNode(data);
	newNode->next = head->next;
	head-> next   = newNode;
}

5:删除结点

Node* del(Node *head){ 
	char id[3];
	if(head->next == NULL)
	{
		puts("系统未录入信息,请先录入信息!!!");
		system("pause");
		system("cls"); 
	}
	else
	{
		Node * p = head->next , *q = head->next ;	
		puts("请输入您想删除学生信息的学号:");
		fflush(stdin);
		scanf("%3s",id);
		fflush(stdin);
		if(strcmp(p->stu.id,id) == 0)
		{
			head->next = head->next->next;
			puts("找到了 已删除!");
			system("pause");
			system("cls"); 	
		}
		else
		{
			while(p)
			{
				if(strcmp(p->stu.id,id) == 0)
				{
					q->next = q->next->next;
					puts("找到了!! 已删除!!");
					system("pause");
					system("cls"); 
					break; 
				}
				q = p;
				p = p->next;	
			 }
			if(!p)
			{
				puts("未找到! 请输入已录入的信息!");
				system("pause");
				system("cls");	
			}			
		}	
	}
	return head;									 	 
}

6:修改结点信息

Node* modify(Node* head){
	//判空 
	if(head->next == 0)
	{
		puts("系统未录入信息,请先录入信息!!!");
		system("pause");
		system("cls"); 
	}
	else
	{
		int tag = 1; 
		char id[3];
		fflush(stdin);
	    puts("请输入该生学号(0 ~ 999):"); 
	    scanf("%s",id);
	    fflush(stdin);
		Node * p = head->next;
		char name[30];
		int age;
		while(p)
		{
			if(strcmp(p->stu.id,id) == 0 )
			{
				tag = 0;
				puts("请输入您要修改的信息:1 姓名  2 成绩   3年龄");
				fflush(stdin);
				char choose = getchar();
				while(getchar() != '\n')
					continue;
				switch(choose)
				{
					case '1':
					puts("请输入修改后的姓名:");
					scanf("%s",name);
					fflush(stdin);
					strcpy(p->stu.name , name);
					puts("修改成功!!!");
					system("pause");
					system("cls"); 
					break;
					
					case '2':
					puts("按 1 修改C语言成绩 ,按2 修改高数成绩 按3修改英语成绩"); 
					choose = getchar();
					while(getchar() != '\n')
						continue;
					switch (choose)
					{
						case '1' : 
							puts("请输入修改后的c语言成绩(0 ~ 100)的数字:");
						 	fflush(stdin); 
							while(1)
							{
								if(scanf("%d",&p->stu.score.score_c) == 1 && 
								p->stu.score.score_c > 0 && 
								p->stu.score.score_c < 100)
								{
									break;	
								}
								puts("输入有误 请输入0 ~ 100 之间的数字:");
								fflush(stdin);	
							}
							break;
						case '2' :
							puts("请输入修改后的高数成绩(0 ~ 100)的数字:");
						 	fflush(stdin); 
							while(1)
							{
								if(scanf("%d",&p->stu.score.score_math) == 1 && 
								p->stu.score.score_math > 0 && 
								p->stu.score.score_math < 100)
								{
									break;	
								}
								puts("输入有误 请输入0 ~ 100 之间的数字:");
								fflush(stdin);	
							}
							break; 
						case '3' :
							puts("请输入修改后的英语成绩(0 ~ 100)的数字:");
						 	fflush(stdin); 
							while(1)
							{
								if(scanf("%d",&p->stu.score.score_english) == 1 && 
								p->stu.score.score_english > 0 && 
								p->stu.score.score_english < 100)
								{
									break;	
								}
								puts("输入有误 请输入0 ~ 100 之间的数字:");
								fflush(stdin);	
							}
							break;
						default :
							puts("输入有误!!!"); 
					}
						puts("修改成功!!!");
					system("pause");
					system("cls"); 
					break;
					
					case '3':
					puts("请输入修改后的年龄:");
					fflush(stdin);
					scanf("%d",&age);
					p->stu.age = age;
					puts("修改成功!!!");
					system("pause");
					system("cls"); 
					break;
					
					default :
					puts("请输入正确的选项!");
					system("pause");
					system("cls"); 
					break;	
				} 	 
			}
		p = p->next;		
		}
		if(tag)
		{
			puts("该生不存在!!!");
			system("pause");
			system("cls");	
		}		
	}
	return head;
}

7: 程序退出

void quit(){ 
	puts("您即将退出系统 : 按任意键确认退出 ,取消退出请按:0");
	char choose = getchar(); 
	while(getchar() != '\n')
		continue;
	if(choose == '0')
	{
		puts("退出已取消!");
		system("pause");
		system("cls");		
	}	
	else
	{
	puts("退出成功!感谢您的使用!");
	exit(0);		
	}		 
}  

8:查询结点信息(学号)

void print_one(Node *head){
	if(head->next == NULL)
	{
		printf("未录入信息!!");
		return ;	
	}	 
	puts("请输入学号:(默认前3位)");
	char id[3];
	fflush(stdin);
	scanf("%3s",&id);
	fflush(stdin); 
	Node *q  = head->next ;
	int tag = 1; 
	while( q )
	{
		if(strcmp(q->stu.id,id) == 0)
		{	
			tag = 0;
			puts("找到了!!");
			printf("学号\t年龄\t姓名\tC语言成绩\t高数成绩\t英语成绩\n");
			printf("%s\t%d\t%s\t%d\t%d\t%d\t\n",q->stu.id,q->stu.age,q->stu.name,q->stu.score.score_c,q->stu.score.score_math ,q->stu.score.score_english);
			system("pause");
			system("cls"); 
		}
		q = q->next;
	}
	if(tag)
	{
		puts("该学生不存在!!");
		system("pause");
		system("cls");	
	}		 
}

9 :展示全部信息

void print_all(Node* head){
	if(head->next == NULL)
	{
		printf("未录入信息!!");
		return ;	
	}
	Node * q = head->next ;
	if(q)
	{
		printf("学号\t年龄\t姓名\tC语言成绩\t高数成绩\t英语成绩\n");
		while(q)
		{
			printf("%s\t%d\t%s\t%d\t%d\t%d\t\n",q->stu.id,q->stu.age,q->stu.name,q->stu.score.score_c,q->stu.score.score_math ,q->stu.score.score_english);
			q = q->next;
		}	
	}
	else
	{
		puts("系统未录入信息, 请先录入信息!");	
	}	
	system("pause");
	system("cls");	
	return ; 	
}

10 : 排序(学号升序)

归并排序

Node* sortMerge(Node *head){
	if(head == NULL || head->next == NULL)
		return head;
	//fast 设置为第二个  方便分割后前半部分后面设置NULL		
	Node *fast = head->next ,*slow = head;
	while(fast && fast->next )
	{
		fast = fast->next->next ;
		slow = slow->next ;
	}
	Node *nextHead = slow->next ;
	slow->next = NULL;
	Node* m1 = sortMerge(head);
	Node* m2 = sortMerge(nextHead);
	//虚拟头结点 
	Node* dummy = (Node*)malloc(sizeof(Node));
	Node* prev = dummy;
	while(m1 && m2)
	{
		if(strcmp(m1->stu.id ,m2->stu.id) <= 0)
		{
			prev->next = m1;
			m1 = m1->next;	
		}
		else
		{
			prev->next = m2;
			m2 = m2->next ;
		}
		prev = prev->next;	
	}
	prev->next = m1 == NULL ? m2 : m1;
	return dummy->next;
}

11 :菜单1

void menu_first(){
	system("cls");
	puts("\t**********************************");
	puts("\t         欢迎使用学生管理系统     ");
	puts("\t**********************************");
	puts("\t*    ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┐    *");
	puts("\t*    │      0.  注册        │    *");
	puts("\t*    │                      │    *");
	puts("\t*    │      1.  登录        │    *");
	puts("\t*    │                      │    *");
	puts("\t*    │	     2.  退出系统    │    *");
	puts("\t*    │                      │    *");
	puts("\t*    └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┘    *");
	puts("\t**********************************");
}

12 :菜单2

void menu_second(){
	system("cls");
	puts("\t**********************************");
	puts("\t         欢迎使用学生管理系统     ");
	puts("\t**********************************");
	puts("\t*    ┌   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   ─┐    *");
	puts("\t*    │1.录入信息  2.查询信息   	 │    *");
	puts("\t*    │                         	 │    *");
	puts("\t*    │3.删除信息  4.修改信息    	 │    *");
	puts("\t*    │                         	 │    *");
	puts("\t*    │5.信息排序  6.显示全部信息    │    *");
	puts("\t*    │                          	 │    *");
	puts("\t*    │7.退出	     	 │    *");
	puts("\t*    └   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─  ┘    *");
	puts("\t**********************************");
}

13 :菜单操作1

char* keydown0(UserList* userList){
	fflush(stdin);
	char choose = getchar();
	fflush(stdin);		
	char *username;
	switch(choose)
	{
		case '0':
			user_input(*&userList);
			saveUserToFile(*&userList);
			username = Login(*&userList);
			return username;
		case '1':
			username = Login(*&userList);
			printf("\n欢迎%s登录学生管理系统!\n",username);
			return username;
		case '2':
			printf("退出\n");
			exit(1);
		default:
			printf("输入错误!!!!!程序退出!!!\n");
			exit(0);
			break; 
	}
}

14 :菜单操作2

char* keydown1(Node* head,const char *filename,UserList* userList){
	puts("请输入您的选择(1 ~ 8):");
	char choose = getchar();
	while(getchar() != '\n')
		continue;
	Student p;
		switch (choose)
		{
			case '1': 
				puts("********************【录入信息】*********************");
				fflush(stdin);
				puts("请输入学生id 年龄 姓名 c语言成绩 高数成绩 英语成绩"); 
				while(scanf("%s %d %s %d %d %d",p.id,&p.age,p.name,&p.score.score_c,&p.score.score_math ,&p.score.score_english) != 6)
				{
					fflush(stdin);															
					printf("您输入的数据不正确,请在下方重新输入正确信息!\n");
					continue; 
				} 
				fflush(stdin); 
				insert(head,p); 
				//保存数据 
				writeintofile(head,filename);
				break;
			case '2': 
				puts("********************【查询信息】*********************");
				print_one(head); 
				break;
			case '3': 
				head = del(head); 
				writeintofile(head,filename) ;
				break;
			case '4': 
				head = modify(head); 
				writeintofile(head,filename);
				break;
			case '5': 
				head->next = sortMerge(head->next) ;
				puts("排序已完成!!");
				system("pause");
				system("cls");  
				break;
			case '6': 
					print_all(head);
					break; 
			case '7':
					puts("正常退出!!!");
					exit(0); 
					break;
			default : 
					puts("输入错误 : 请您重新输入:");
					system("pause");
					system("cls");	
		}
}

15 :增加用户

void user_input(UserList* userList){
	system("cls");
	char name[10] , password[10];
	puts("********************增加用户********************"); 
	puts("请输入新用户名:");
	scanf("%s", name);
	while(getchar() != '\n')
		continue;
	puts("请为新用户设置密码( 1 ~ 10):");
	scanf("%s", password);
	while(getchar() != '\n')
		continue;
	while (strlen(password) < 1 || strlen(password) > 10)
	{
		printf("密码长度不 得 低 于 1 位,高 于 10 位,请重新输入!\n");
		scanf("%s", password);
		while(getchar() != '\n')
			continue;
	}
	strcpy(userList->users[userList->size].name, name);
	strcpy(userList->users[userList->size++].password, password);
	puts("添加用户成功!");
	char * fileName = strcat(name,".txt");
	FILE *fp=fopen(fileName,"w");       
	fclose(fp);
	printf("%s",name);
	system("pause");
	return;
}

16:main函数:

int main(){
	char *filename = "xx.txt";
	char *username = "x";
	UserList userList;
	userList.size = 0;
	readUserToFile(&userList);
	menu_first();
	username = keydown0(&userList);
	system("pause");									
	system("cls");
	
	Node *head = createList();
	filename = strcat(username,".txt");
	readInfor(head,filename); 
	while(1)
	{
		menu_second(); 
		keydown1(head,filename,&userList);
		system("pause");
		system("cls");
	}
	return 0;	
}

二: 文件操作:

1:保存用户信息

void saveUserToFile(UserList* userList ){
	FILE* fp = fopen("user.txt", "w");
	if (fp == NULL)
	{
		puts("打开失败!");
		system("pause");
		return ; 
	}
	int i;
	for ( i = 0;i < userList->size;i++)
	{
		fprintf(fp, "%s\t%s\t\n", userList->users[i].name, userList->users[i].password);
	}
	puts("写入成功!!!");
	fclose(fp);	
	return;
}

2:读取用户信息

void readUserToFile(UserList* userList ){
	FILE *fp = fopen("user.txt","r");
	char name[10] ,password[10];
	if(fp == NULL)
	{
		fp = fopen( "user.txt","w+");
	}
	while(fscanf(fp,"%s\t%s\t",&name,&password) != EOF)
	{
		strcpy(userList->users[userList->size].name,name);
		strcpy(userList->users[userList->size++].password,password);
	}
	fclose(fp);
	puts("读取完毕!!!"); 
	return ;
}

3:登录

char* Login(UserList* userList){
	puts("******************登录*******************");
	if (userList->size == 0)
	{
		puts("无用户!!请先注册!");
		system("pause");
		user_input(userList);
		return NULL;
	}
	char name[10] , password[10];
	int flag = 0;
	puts("请输入用户名:");
	scanf("%s", name);
	int i = 0 ,j = 0;
	for ( i = 0 ;i < userList->size ; i++)
	{
		if (strcmp(name, userList->users[i].name) == 0)
		{
			flag = 1;
			break;
		}
	}
	if (flag == 0)
	{
		puts("用户名不存在!!程序退出!"); 
		exit(0);
	}
	puts("请输入登录密码:");
	scanf("%s", password);
	while(getchar() != '\n')
		continue; 
	for ( j = 1; j < 3 ; j++)
	{
		if (strcmp(password,userList->users[i].password) == 0)				//i是上面依照用户名获取的下标 
		{
			puts("登录成功!! !");
			return userList->users[i].name;
		} 
		printf("密码记错了哦 还有%d次机会!!!\n", 3 - j);
		scanf("%s",password);
		while(getchar() != '\n')
			continue;
	}
	puts("3 次 输 入 密 码 错 误 ,程 序 将 退 出  !");
	exit(0);
}

4: 读取文件

void readInfor(Node *head,const char* filename){		
	FILE *fp=fopen(filename,"r");						
	Student p;
	if(!fp)
	{ 
		fopen(filename,"w+");								
	}
		//读文件,把文件中的数据读入链表
	while(fscanf(fp,"%s\t%d\t%s\t%d\t%d\t%d",p.id,&p.age,p.name,&p.score.score_c,&p.score.score_math ,&p.score.score_english)!=EOF)	
	{
		insert(head,p);															 
	}
	fclose(fp);																						 
}

5:写入文件

void writeintofile( Node* head,const char* filename){							
	//开文件,"w"如果文件存在,那么清空文件内容,"a"为追加
	FILE *fp=fopen(filename,"w");																
	Node *p = head->next;
	if (fp == NULL)					
	{
		puts("写文件失败!!!!"); 
		system("pause");
		return;
	}
	//将链表信息传给文件 
	while(p)
	{
		fprintf(fp,"%s\t%d\t%s\t%d\t%d\t%d\n",p->stu.id,p->stu.age,p->stu.name,p->stu.score.score_c,p->stu.score.score_math ,p->stu.score.score_english);
		p=p->next;
	} 
	puts("学生写入完毕!!!");
	fclose(fp);										
} 

三: 总结

文件操作不太熟练,多加练习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值