学生信息管理系统(C语言 单链表实现)


好久没更新了,这段都在写学生信息管理系统QAQ

在这里插入图片描述

程序描述

这个学生管理系统只用到了一个链表,在功能一录入信息时建立链表。没有用到结构体数组。
在这里插入图片描述
主函数为菜单页,通过输入调用其他函数,每个函数对应一个功能。函数调用完会回到主函数。通过清屏来实现界面的跳转,每次清屏顺便清理一下缓存区。
在这里插入图片描述

注意!!!此程序包含一些输入的容错(把所有数据设置为字符数组,通过调用容错函数检查这个字符数组是不是纯数字、或者包含汉字等)还有很多不足的地方,我写的这个只能作于参考。

用到的函数与结构体

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#define LEN sizeof(struct student)
struct student
{
	char num[20];//学号  
	char name[20];//姓名
	char sex[20];//性别
	char room[20];//宿舍号码
	char tel[20];//电话号码
	
	char CHN[20];//语文 
	char MATH[20];//数学 
	char ENG[20];//英语 
	char PE[20];//体育 
	char PRO[20];//专业 
	char average_score[20];//平均分
	
	struct student *next; 
};
int n;//节点数 
 
struct student *creat();//信息录入 
void score(struct student *head);//成绩录入 
void findinformation(struct student *head);//信息查询 
void findscore(struct student *head);//成绩查询
struct student *del(struct student *head);//信息删除 
struct student *insert(struct student *head);//信息插入 
void update(struct student *head);//修改分数
void Oscore(struct student*head);//排序输出
void swap(struct student*p1,struct student*p2);//交换数据 
void fenduan(struct student*head);//分段输出
int checknum(char ch[]);//检查纯数字的数据里是否混入了非数字的非法输入
int transformint(char ch[]);//纯数字整数(字符串转向int类型)
void save(struct student *head); //文件存储   
void export1();//文件输出 
struct student *import();//文件导入
int checkscore(char ch[]);//检查分数是否为0-99的纯数字 
int IncludeChinese(char *str); //检查性名、性别是否包含汉字 

主函数部分

int main()
{
	struct student *head=NULL;
	char choose[20];
	menu://设置主菜单的点 
	printf("\n");
	printf("\t\t\t\t\t\t【学生管理系统2.0】\t\t\t\t\t\n"); 
    printf("\t\t★————————————————————————————————————————★\n\n");
    printf("\t\t\t   | 1. 信息录入\t\t2. 成绩录入\t\t3. 信息查询  |\n\n");
    printf("\t\t\t   | 4. 成绩查询\t\t5. 删除信息\t\t6. 信息追加  |\n\n");
    printf("\t\t\t   | 7. 更改分数\t\t8. 查看排名\t\t9. 成绩分段  |\n\n");
    printf("\t\t\t   | 10.保存文件\t\t11.文件输出\t\t12.文件导入  |\n\n");
    printf("\t\t★————————————————按0并回车退出——————————————————★\n"); 
    printf("请输入执行数字:");
    while(scanf("%s",choose)&&checknum(choose)==0)//检查到不是纯数字 让用户重新输入 
	{
		printf("输入无效,重新输入:"); 
	}
		switch(transformint(choose))
		{
			case 1:
			head=creat();
			break;
			case 2:
			score(head);
			break;
			case 3:
			findinformation(head);
			break;
			case 4:
			findscore(head);
			break;
			case 5:
			head=del(head);
			break;
			case 6:
			head=insert(head);
			break;
			case 7:
			update(head);
			break;
			case 8:
			Oscore(head);
			break;
			case 9:
			fenduan(head);
			break;	
			case 10:
			save(head); 
			break;
			case 11:
			export1();
			break;
			case 12:
			head=import();
			break;
		}
		if(transformint(choose)<0||transformint(choose)>12)//输入了不在执行数字范围内的数字返回主菜单的点 
		{
			system("cls");//清理屏幕和缓冲区 
    		fflush(stdin);
    		goto menu;
		} 
		if(transformint(choose)!=0)//输入不是0,继续回到主菜单 
		{
			goto menu;
		}
	system("cls");//结束时清理屏幕和缓冲区,打印下方的校徽 
    fflush(stdin);
	printf("\n感谢使用!\n");
	printf("\n                                                     *\n");
    printf("                                                *  ***  ****\n");
    printf("                                              *** **** ****\n");
    printf("                                             **** **** **** ****\n");
    printf("                                             **** **** **** ****\n");
    printf("                                             **** **** **** ****\n");
    printf("                                             **** **** **** ****\n");
    printf("                                             **** **** **** ****\n");
    printf("                                              **** ******* ****\n");
    printf("                                                *************\n");
    printf("                                                    *****\n");
	system("pause");
	return 0; 
}

校徽有内味了
在这里插入图片描述

1.信息录入

struct student *creat()//录入信息,创建链表 
{
	system("cls");
    fflush(stdin);
	printf("*****************************************************信息录入***********************************************************\n");
	printf("依次键入学号、姓名、性别、宿舍号码、电话号码,用一个【空格】隔开各数据,每一条输入完成后按回车键进行下一条输入。         \n");
	printf("                                             【退出请输入'0'并回车】                                                     \n");
	printf("样例:\n541913460230 张三 男 1717 66666\n在此输入:\n"); 
	n=0;
	struct student *head,*p1,*p2;
	head = NULL;
	p1=p2=(struct student*)malloc(LEN);

	while(scanf("%s",p1->num)&&checknum(p1->num)==0)
	{
		printf("输入错误的学号,重新输入:\n"); 
	}
	if(transformint(p1->num)==0)//输入了0退出函数调用,传回去表头指针head给主函数的head 
	{
		system("cls");
    	fflush(stdin);
		return(head);
	} 
	while(scanf("%s",p1->name)&&IncludeChinese(p1->name)==0)//这几行while(scanf)都是具有容错的输入,整个程序中都存在输入容错!!! 
	{															
		printf("输入错误的名字,重新输入:\n"); 
	}
	while(scanf("%s",p1->sex)&&IncludeChinese(p1->sex)==0)
	{
		printf("输入错误的性别,重新输入:\n"); 
	}
	while(scanf("%s",p1->room)&&checknum(p1->room)==0)
	{
		printf("输入错误的宿舍号码,重新输入:\n"); 
	}
	while(scanf("%s",p1->tel)&&checknum(p1->tel)==0)
	{
		printf("输入错误的手机号码,重新输入:\n"); 
	}
	printf("\n"); 
	while(transformint(p1->num)!=0)//输入每个节点的学号不是0的时候开始循环。 
	{
		n+=1;//节点+1 
		if(n==1)				//PS:此处为建立链表常规过程(参考了谭浩强C程序设计第九章链表,红皮那本) 
		{
			head=p1;//第一个节点 表头指向上面开辟的第一个节点 p1 p2 head都指向此处此时 
		}else
		{
			p2->next=p1;//后面的节点,p2的next指向p1将两个节点连接到一起 
			p2=p1;//p2再跟p1 
		}
		p1=(struct student*)malloc(LEN);//p1指向开辟的新节点 
	while(scanf("%s",p1->num)&&checknum(p1->num)==0)
	{
		printf("输入错误的学号,重新输入:\n"); 
	}
	if(transformint(p1->num)==0)
	{
		break;
	}
	while(scanf("%s",p1->name)&&IncludeChinese(p1->name)==0)
	{
		printf("输入错误的名字,重新输入:\n"); 
	}
	while(scanf("%s",p1->sex)&&IncludeChinese(p1->sex)==0)
	{
		printf("输入错误的性别,重新输入:\n"); 
	}
	while(scanf("%s",p1->room)&&checknum(p1->room)==0)
	{
		printf("输入错误的宿舍号码,重新输入:\n"); 
	}
	while(scanf("%s",p1->tel)&&checknum(p1->tel)==0)
	{
		printf("输入错误的手机号码,重新输入:\n"); 
	}
	printf("\n\n"); 
	}
	p2->next=NULL;//最后p1开辟的新节点丢弃了,让p2的next指向空,形成表尾结束链表。 
/录入结束 
	system("cls");
    fflush(stdin);
	return(head);	
}

2.成绩录入

void score(struct student *head)//拿到链表,录入成绩 
{
	system("cls");
    fflush(stdin);
	printf("*****************************************************成绩录入***********************************************************\n");
	printf("依次键入语文、数学、英语、体育、专业成绩,用一个空格隔开各数据,每一条输入完成后按回车键进行下一条输入。\n");
	printf("                                              【录完分数后自动退出】                                                      \n");
	printf("例如:\n10 20 30 40 50\n在此输入:\n"); 

	int Aver;//平均分 
	struct student *p;
	for(p=head;p!=NULL;p=p->next)//遍历链表 
	{
		printf("\n现在录入%s(%s)的成绩\n",p->name,p->num); 
		while(scanf("%s",p->CHN)&&checkscore(p->CHN)==0)
		{
			printf("输入错误的语文分数,重新输入:\n"); 
		}
		while(scanf("%s",p->MATH)&&checkscore(p->MATH)==0)
		{
			printf("输入错误的数学分数,重新输入:\n"); 
		}
		while(scanf("%s",p->ENG)&&checkscore(p->ENG)==0)
		{
			printf("输入错误的英语分数,重新输入:\n"); 
		}
		while(scanf("%s",p->PE)&&checkscore(p->PE)==0)
		{
			printf("输入错误的体育分数,重新输入:\n"); 
		}
		while(scanf("%s",p->PRO)&&checkscore(p->PRO)==0)
		{
			printf("输入错误的专业分数,重新输入:\n"); 
		}						
		Aver=(transformint(p->CHN)+transformint(p->MATH)+transformint(p->ENG)+transformint(p->PE)+transformint(p->PRO))/5;
		itoa(Aver,p->average_score,10);//Aver十进制形式转化为字符串存储在链表的average_score平均分里 
		printf("%s的成绩录入完了\n",p->name); 
	}
	system("cls");
    fflush(stdin);
}

3.信息查询

void findinformation(struct student *head)//学生信息查询 
{
	system("cls");
    fflush(stdin);
	char choose1[20],choose2[20];//两个选择的地方,choose1选择学号/姓名 or 宿舍号 ,choose2在选择了学号/姓名时选择 学号 or 姓名 
	char num[20]={'1'};//用户即将输入的学号 
	char name[20];//用户即将输入的姓名
	char room[20]={'1'};//用户即将输入的宿舍号 
	struct student *p;
	p=head;
	int flag=0;
	printf("*****************************************************信息查询***********************************************************\n");
	printf("\n选择查找方式,学号/姓名查找(输入1),宿舍号(输入2)\n请在此输入:");
	choosestation1://第一次选择的点 
	fflush(stdin);
	while(scanf("%s",choose1)&&checknum(choose1)==0)
	{
		printf("输入无效,重新输入:\n"); 
	}
	if(transformint(choose1)==1)
	{
		printf("通过学号(输入1),姓名(输入2):");
		choosestation2://第二次选择的点 
		fflush(stdin); 
		while(scanf("%s",choose2)&&checknum(choose2)==0)
		{
			printf("输入无效,重新输入:\n"); 
		}
		if(transformint(choose2)==1)
		{
			while(transformint(num)!=0)
			{
				printf("\n输入学号(输入0并回车结束):");
				while(scanf("%s",num)&&checknum(num)==0)
				{
					printf("输入错误的学号,重新输入:\n"); 
				}
				for(p=head;p!=NULL;p=p->next)
				{
					if(transformint(p->num)==transformint(num))
					{
						printf("学号:%s 姓名:%s 性别:%s 宿舍号码:%s 电话号码:%s\n",p->num,p->name,p->sex,p->room,p->tel);
						flag=1;
						break;
					}
				}
				if(flag==0&&transformint(num)!=0)
				{
					printf("未找到此学生信息\n");
				} 
			}			 
		}else if(transformint(choose2)==2)
		{
			while(name[0]!='#')
			{
				printf("\n输入姓名(输入#并回车结束):");
				scanf("%s",name);
				for(p=head;p!=NULL;p=p->next)//遍历链表 
				{
					if(strcmp(p->name,name)==0)//比较两字符串 
					{
						printf("学号:%s 姓名:%s 性别:%s 宿舍号码:%s 电话号码:%s\n",p->num,p->name,p->sex,p->room,p->tel);
						flag=1;
						break;
					}
				}
				if(flag==0&&name[0]!='#')
				{
					printf("未找到此学生信息!\n"); 
				} 
			}
		}else
		{
			printf("输入了错误的第二次选择数字!重新输入:\n");
			goto choosestation2;//返回上面第二次选择的点 
		}
	}else if(transformint(choose1)==2)
	{
		while(transformint(room)!=0)
		{
			printf("\n输入宿舍号(输入0并回车结束):");
			while(scanf("%s",room)&&checknum(room)==0)
			{
				printf("输入错误的宿舍号码,重新输入:\n"); 
			}
			for(p=head;p!=NULL;p=p->next)
			{
				if(p->room==room)
				{
					printf("学号:%s 姓名:%s 性别:%s 宿舍号码:%s 电话号码:%s\n",p->num,p->name,p->sex,p->room,p->tel);
					flag=1; 
					break;
				}
			} 
			if(flag==0&&transformint(room)!=0)
			{
				printf("未找到此学生信息!\n"); 
			}
		}
	}else
	{
		printf("输入了错误的第一次选择数字!重新输入:\n");
		goto choosestation1;//返回最上面第一次选择的点 
	} 
	system("cls");
    fflush(stdin);	
} 

4.成绩查询

void findscore(struct student *head)//成绩查询 
{
	system("cls");
    fflush(stdin);
	char num[20]={'1'};//初始化用户即将输入的学号 
	struct student *p;
	int flag=0;//学号是否找到的标志,1找到0没找到 
	p=head;
	printf("*****************************************************成绩查询***********************************************************\n");
	printf("因为有重名的可能,暂时只能通过学号进行查询。请输入学号并回车进行查询!\n");
	printf("                                               【退出请输入'0'并回车】                                                    \n");
	while(transformint(num)!=0)
	{
		printf("\n输入学号:");
		while(scanf("%s",num)&&checknum(num)==0)
		{
			printf("输入错误的学号,重新输入:\n"); 
		}
		for(p=head;p!=NULL;p=p->next)
		{
			if(transformint(p->num)==transformint(num))
			{
				printf("学号:%s 姓名:%s 语文:%s 数学:%s 英语:%s 体育:%s 专业:%s \n",p->num,p->name,p->CHN,p->MATH,p->ENG,p->PE,p->PRO);
				flag=1;
				break;
			}
		} 
		if(flag==0)
		{
			printf("学号未找到!\n"); 
		}
	}
	system("cls");
    fflush(stdin);			 	 
}

5.删除信息

struct student *del(struct student *head)//删除信息函数 
{
	system("cls");
    fflush(stdin);
	char num[20]={'1'};//用户即将输入的学号 
	struct student *p1,*p2;
	printf("*****************************************************信息删除***********************************************************\n");
	if(head == NULL)
	{
		system("cls");
    	fflush(stdin);
		return(head); 
	}
	printf("\n***************************************输入学号进行删除学生信息(输入0结束)**********************************************\n");
do{ 
	printf("\n请输入学号:");
	while(scanf("%s",num)&&checknum(num)==0)
	{
		printf("输入错误的学号,重新输入:\n"); 
	}
	if(transformint(num)==0)
	{
		break;
	} 
	p1=p2=head;
	while(transformint(num)!=transformint(p1->num)&&p1->next!=NULL)
	{
		p2=p1;
		p1=p1->next;
	}
	if(transformint(num)==transformint(p1->num))//找到数字 
	{
		if(p1==head)//如果是要删开头的节点,直接改变表头指向第二个节点,让第二个节点成为新的表头,原来的头用free释放掉 
		{
			head=p1->next;
			free(p1); 
		}else//如果删后面的节点,要把p2连到p1所在节点后面的一个节点,将p1所在节点free释放掉 
		{
			p2->next=p1->next;
			free(p1);
		}
		printf("已删除学号为%s的信息",num);
		n=n-1;
	}else
	{
		printf("没有找到学号为%s的学生\n",num);
	}
}while(transformint(num)!=0);
	system("cls");
    fflush(stdin);
	return(head);
}

6.信息追加

struct student *insert(struct student *head)//插入信息函数 
{
	system("cls");
    fflush(stdin);
	printf("*****************************************************信息追加***********************************************************\n");
	printf("                                            【加入一组信息后自动退出】                                                  \n");	
	printf("请按照 学号 姓名 性别 宿舍号码 电话号码 语文 数学 英语 体育 专业 顺序输入\n");
	printf("样例:\n542013460658 李四 男 1206 10086 10 20 30 40 50\n"); 
	int Aver;
	struct student *stud=(struct student*)malloc(LEN);//开辟一个单元,这一块存我们追加的信息,后面的操作把这一块连接到链表的表头 
	stud->next=NULL;
	stud->next=head;
	head=stud;   
	while(scanf("%s",stud->num)&&checknum(stud->num)==0)
	{
		printf("输入错误的学号,重新输入:\n"); 
	}
	while(scanf("%s",stud->name)&&IncludeChinese(stud->name)==0)
	{
		printf("输入错误的名字,重新输入:\n"); 
	}
	while(scanf("%s",stud->sex)&&IncludeChinese(stud->sex)==0)
	{
		printf("输入错误的性别,重新输入:\n"); 
	}
	while(scanf("%s",stud->room)&&checknum(stud->room)==0)
	{
		printf("输入错误的宿舍号码,重新输入:\n"); 
	}
	while(scanf("%s",stud->tel)&&checknum(stud->tel)==0)
	{
		printf("输入错误的电话号码,重新输入:\n"); 
	}
	while(scanf("%s",stud->CHN)&&checkscore(stud->CHN)==0)
	{
		printf("输入错误的语文分数,重新输入:\n"); 
	}
	while(scanf("%s",stud->MATH)&&checkscore(stud->MATH)==0)
	{
		printf("输入错误的数学分数,重新输入:\n"); 
	}
	while(scanf("%s",stud->ENG)&&checkscore(stud->ENG)==0)
	{
		printf("输入错误的英语分数,重新输入:\n"); 
	}
	while(scanf("%s",stud->PE)&&checkscore(stud->PE)==0)
	{
		printf("输入错误的体育分数,重新输入:\n"); 
	}
	while(scanf("%s",stud->PRO)&&checkscore(stud->PRO)==0)
	{
		printf("输入错误的专业分数,重新输入:\n"); 
	}
	Aver=(transformint(stud->CHN)+transformint(stud->MATH)+transformint(stud->ENG)+transformint(stud->PE)+transformint(stud->PRO))/5;//计算平均分 
	itoa(Aver,stud->average_score,10);
	n=n+1;	//节点+1 
	system("cls");
    fflush(stdin);
	return(head);	
}

7.更改分数

void update(struct student *head)//修改分数 
{
	system("cls");
    fflush(stdin);
	int Aver;
	struct student *p1,*p2;
	char num[20]={'1'};//用户即将输入的学号 
	char choose[20];
	printf("*****************************************************分数修改***********************************************************\n");
	if(head == NULL)//没有录信息 空表直接返回 
	{
		system("cls");
    	fflush(stdin);
    	return; 
	}
	printf("\n***************************************输入学号进行修改学生分数(输入0结束)**********************************************\n");
do{ 
	printf("\n请输入学号:");
	while(scanf("%s",num)&&checknum(num)==0)
	{
		printf("输入错误的学号,重新输入:\n"); 
	}
	if(transformint(num)==0)
	{
		break;
	} 
	p1=p2=head;
	while(transformint(p1->num)!=transformint(num)&&p1->next!=NULL)//没找到,往后走 
	{
		p2=p1;
		p1=p1->next;
	}
	if(transformint(p1->num)==transformint(num))//找到了,开始选修改的科目 
	{
		printf("修改语文请输入1,数学输入2,英语3,体育4,专业5\n");
		printf("请输入修改科目对应的数字:");
		while(scanf("%s",choose)&&checknum(choose)==0||transformint(choose)<1||transformint(choose)>5)
		{
			printf("输入无效的编号,重新输入:\n"); 
		}
		printf("请输入修改后的分数:");
		switch(transformint(choose))
		{
			case 1:
			while(scanf("%s",p1->CHN)&&checknum(p1->CHN)==0)
			{
				printf("输入错误的语文分数,重新输入:\n"); 
			}
				break;
			case 2:
			while(scanf("%s",p1->MATH)&&checknum(p1->MATH)==0)
			{
				printf("输入错误的数学分数,重新输入:\n"); 
			}
				break;
			case 3:
			while(scanf("%s",p1->ENG)&&checknum(p1->ENG)==0)
			{
				printf("输入错误的英语分数,重新输入:\n"); 
			}
				break;
			case 4:
			while(scanf("%s",p1->PE)&&checknum(p1->PE)==0)
			{
				printf("输入错误的体育分数,重新输入:\n"); 
			}
				break;
			case 5:
			while(scanf("%s",p1->PRO)&&checknum(p1->PRO)==0)
			{
				printf("输入错误的专业分数,重新输入:\n"); 
			}
				break;					
		}
		Aver=(transformint(p1->CHN)+transformint(p1->MATH)+transformint(p1->ENG)+transformint(p1->PE)+transformint(p1->PRO))/5;
		itoa(Aver,p1->average_score,10);//平均分转换字符串形式 
	}else
	{
		printf("没有找到学号为%s的学生\n",num);
	}
}while(transformint(num)!=0);
	system("cls");
    fflush(stdin);
}

8.查看排名

void Oscore(struct student*head)//排序输出 
{
	system("cls");
    fflush(stdin);
	printf("*****************************************************查看排名***********************************************************\n"); 
	int ranking=0;
	struct student *p=NULL,*p1=NULL;
	for(p=head;p!=NULL;p=p->next)
	{
		if(checkscore(p->average_score)==0)
		{
			printf("有同学只录取了信息,没有录成绩。所以无法公布排名\n");
			system("pause");
			system("cls");
    		fflush(stdin);			
			return;
		}
	} 
	for(p=head;p!=NULL;p=p->next)
	{
		for(p1=p->next;p1!=NULL;p1=p1->next)
		{
			if(transformint(p->average_score)<transformint(p1->average_score))
			{
				swap(p,p1);
			} 
		}	
	}
	printf("学号\t\t姓名\t\t平均分\t\t名次\t语文\t数学\t英语\t体育\t专业\t\n");
	for(p=head;p!=NULL;p=p->next)
	{
		ranking+=1;
		printf("%s\t\t%s\t\t%s\t\t%d\t%s\t%s\t%s\t%s\t%s\t\n",p->num,p->name,p->average_score,ranking,p->CHN,p->MATH,p->ENG,p->PE,p->PRO);
	}
	printf("\n");
	system("pause");
	system("cls");
    fflush(stdin);
}
void swap(struct student*p1,struct student*p2)//交换数据(辅助函数) 
{
	char tempCHN[20];
	char tempMATH[20];
	char tempENG[20];
	char tempPE[20];
	char tempPRO[20];
	char tempaverage[20];
	char tempname[20];
	char tempnum[20];
	
	strcpy(tempnum,p1->num);///
	strcpy(p1->num,p2->num);
	strcpy(p2->num,tempnum);
	strcpy(tempname,p1->name);//
	strcpy(p1->name,p2->name);
	strcpy(p2->name,tempname);
	strcpy(tempCHN,p1->CHN);///
	strcpy(p1->CHN,p2->CHN);
	strcpy(p2->CHN,tempCHN);
	strcpy(tempMATH,p1->MATH);///
	strcpy(p1->MATH,p2->MATH);
	strcpy(p2->MATH,tempMATH);
	strcpy(tempENG,p1->ENG);///
	strcpy(p1->ENG,p2->ENG);
	strcpy(p2->ENG,tempENG);
	strcpy(tempPE,p1->PE);///
	strcpy(p1->PE,p2->PE);
	strcpy(p2->PE,tempPE);	
	strcpy(tempPRO,p1->PRO);///
	strcpy(p1->PRO,p2->PRO);
	strcpy(p2->PRO,tempPRO);
	strcpy(tempaverage,p1->average_score);///
	strcpy(p1->average_score,p2->average_score);
	strcpy(p2->average_score,tempaverage); 
}

9.成绩分段

void fenduan(struct student*head)//分段输出 
{
	system("cls");
    fflush(stdin);
	printf("*****************************************************成绩分段***********************************************************\n\n");
	struct student *p;
	for(p=head;p!=NULL;p=p->next)
	{
		if(checkscore(p->average_score)==0)
		{
			printf("有同学只录取了信息,没有录成绩。所以无法公布分段\n");
			system("pause");
			system("cls");
    		fflush(stdin);			
			return;
		}
	} 
	printf("********************************************************A***************************************************************\n");
	printf("学号\t\t姓名\t\t平均分\t\t语文\t数学\t英语\t体育\t专业\t\n"); 
	for(p=head;p!=NULL;p=p->next)
	{
		if(transformint(p->average_score)>=80)
		{
			printf("%s\t\t%s\t\t%s\t\t%s\t%s\t%s\t%s\t%s\t\n",p->num,p->name,p->average_score,p->CHN,p->MATH,p->ENG,p->PE,p->PRO);
		}
	}
	printf("********************************************************B***************************************************************\n");
	printf("学号\t\t姓名\t\t平均分\t\t语文\t数学\t英语\t体育\t专业\t\n"); 		
	for(p=head;p!=NULL;p=p->next)
	{
		if(transformint(p->average_score)<80&&transformint(p->average_score)>=60)
		{
			printf("%s\t\t%s\t\t%s\t\t%s\t%s\t%s\t%s\t%s\t\n",p->num,p->name,p->average_score,p->CHN,p->MATH,p->ENG,p->PE,p->PRO);
		}
	}
	printf("********************************************************C***************************************************************\n");
	printf("学号\t\t姓名\t\t平均分\t\t语文\t数学\t英语\t体育\t专业\t\n"); 		
	for(p=head;p!=NULL;p=p->next)
	{
		if(transformint(p->average_score)<60)
		{
			printf("%s\t\t%s\t\t%s\t\t%s\t%s\t%s\t%s\t%s\t\n",p->num,p->name,p->average_score,p->CHN,p->MATH,p->ENG,p->PE,p->PRO);
		}
	}
	printf("\n");
	system("pause");
	system("cls");
    fflush(stdin);
} 

int checknum(char ch[])//检查纯数字的数据里是否混入了非数字的非法输入; 
{
	int i,flag=1;
	for(i=0;i<strlen(ch);i++)
	{
		if(ch[i]<'0'||ch[i]>'9')
		{
			flag=0;
			break;
		}		
	}
	return flag;	
}

10.保存文件

void save(struct student *head)//文件保存 
{
	system("cls");
    fflush(stdin);	
	FILE *fp;
	struct student *p;
	fp=fopen("stu.db","wb");

	for(p=head;p!=NULL;p=p->next)
	{
		fwrite(p,LEN,1,fp);
	}
	fclose(fp);
	printf("♂♂♂♂保存完毕♂♂♂♂♂\n"); 
	system("pause");
	system("cls");
    fflush(stdin); 	
}

11.文件输出

void export1()//文件输出 
{
	system("cls");
    fflush(stdin);
	FILE *fp;
	struct student *t;
	t=(struct student *)malloc(LEN);
	if((fp=fopen("stu.db","r"))==NULL){
		printf("未找到文件\n");
	}
	else{
		printf("学号\t\t姓名\t\t平均分\t\t语文\t数学\t英语\t体育\t专业\t\n");
		int w;
        fseek(fp,0,2);
        w=ftell(fp);
        fseek(fp,0,0);
        while(w!=ftell(fp)){
            fread(t,LEN,1,fp);
			printf("%s\t\t%s\t\t%s\t\t%s\t%s\t%s\t%s\t%s\t\n",t->num,t->name,t->average_score,t->CHN,t->MATH,t->ENG,t->PE,t->PRO);
        }
        fclose(fp);
	}
	system("pause");
	system("cls");
    fflush(stdin);
}

12.文件导入

struct student *import()//文件导入 
{
	system("cls");
    fflush(stdin);
	FILE *fp;
	if((fp=fopen("stu.db","r"))==NULL){
		printf("未找到文件\n");
	}
	else{
		struct student *p1,*p2,*head;
		p1=p2=(struct student *)malloc(LEN);
		fread(p1,LEN,1,fp);
		while(!feof(fp)) {//end of file
			n+=1;
			if(n==1){
				head=p1;
			}
			else{
				p2->next=p1;
			}
			p2=p1;
			p1=(struct student *)malloc(LEN);
			fread(p1,LEN,1,fp);
		}
		p2->next=NULL;
		fclose(fp);
		printf("文件导入成功\n");
		system("pause");
		system("cls");
    	fflush(stdin);
		return head;
	}
	system("cls");
    fflush(stdin);
	return NULL;
}

容错:检查是否为纯数字

int checknum(char ch[])//检查纯数字的数据里是否混入了非数字的非法输入; 
{
	int i,flag=1;
	for(i=0;i<strlen(ch);i++)
	{
		if(ch[i]<'0'||ch[i]>'9')
		{
			flag=0;
			break;
		}		
	}
	return flag;	
}

容错:检查是否为0-99的分数

int checkscore(char ch[])//检查0-99分数 
{
	int i,flag=1;
	if(strlen(ch)>=3)
	{
		return 0;
	} 
	for(i=0;i<strlen(ch);i++)
	{
		if(ch[i]<'0'||ch[i]>'9')
		{
			flag=0;
			break;
		}		
	}
	return flag;	
}

容错:字符串是否包含中文

int IncludeChinese(char *str)//是否包含中文 
{
	char c;
	while(1)
	{
        c=*str++;
        if (c==0) break;  //如果到字符串尾则说明该字符串没有中文字符
        if (c&0x80)        //如果字符高位为1且下一字符高位也是1则有中文字符
                if (*str & 0x80) return 1;
    }
    return 0;
}

字符串转换int类型

int transformint(char ch[])//纯数字整数(字符串转向int类型) 
{
	int i=0,sum=0;
	for(i=0;i<strlen(ch);i++)
	{
		sum=sum*10+ch[i]-48;
	}
	return sum;
}

展示图片

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

写到最后

为什么你会点进这篇文章?说吧,是老师布置的大作业还是学校的实训要求?哈哈哈哈
在这里插入图片描述
我在写这个学生管理系统的过程也看了不少别人的例子,所以在此分享一下自己的代码,希望能对你有帮助。加油!加油!加油!
在这里插入图片描述
代码分享:
链接:https://pan.baidu.com/s/19wJYzT2ven8qhz83Hacfuw
提取码:jj77
–来自百度网盘超级会员V3的分享

  • 34
    点赞
  • 190
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
好的,宿舍管理系统可以包含以下功能: 1. 学生信息管理:包括学生基本信息、入住信息、退宿信息等。 2. 宿舍信息管理:包括宿舍基本信息、宿舍楼信息、房间信息等。 3. 入住管理:包括学生入住申请、宿舍管理员审核、宿舍分配等。 4. 退宿管理:包括学生退宿申请、宿舍管理员审核、宿舍清理等。 5. 统计报表:包括入住率、退宿率、宿舍使用情况等统计数据。 以下是用C语言实现宿舍管理系统的思路: 1. 定义结构体来存储学生信息、宿舍信息等数据。 2. 使用链表来存储学生信息、宿舍信息等数据,方便查询和管理。 3. 设计菜单界面,包括学生信息管理、宿舍信息管理、入住管理、退宿管理、统计报表等选项,可以通过输入数字来选择相应的功能。 4. 对于每个选项,编写相应的函数来实现功能,比如添加学生信息、查询学生信息、审核学生入住申请、分配宿舍等。 5. 在每个函数中,对链表进行操作,比如遍历链表、添加节点、删除节点等。 6. 在统计报表功能中,根据已有数据计算入住率、退宿率等统计数据,并输出到屏幕上。 需要注意的是,在实现过程中需要考虑数据的安全性和可靠性,比如对于敏感数据需要进行加密存储,对于用户输入的数据需要进行验证。同时需要对异常情况进行处理,比如链表为空、文件读写失败等情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值