期末课设学生信息管理系统链表(有简单解释)

编译器:Dev-c++               开发语言:C语言              最后有代码部分

本人也是初入编程这个大世界的新手菜鸟,部分代码会很简单明了但也繁琐,还会有很多的词汇不是专业词汇。

注:部分代码以及思路来源于 Извините. 作者大大的作品:   《    C语言学生信息管理系统(链表)(无文件操作)    》 

作者的其它作品也很优秀哦,很适合刚刚入门的小伙伴。

1.功能实现

密码颜色根据自己要求(初始密码:wypgogogo)

 2.本人理解:

大作业最主要的内容就是链表的实现,举个例子(来源于源代码:增加学生信息):

head是第一个结点,那head->next就是第二个结点,q是新增加的结点,让q的下一个结点是原来的第二个,让head(第一个)的下一个结点是新增加的q,那q自然而然成为第二个结点,head->next自然而然成为第三个结点。 (头插法)

小伙伴们可以自己试试尾插法=v=

代码理解:

1.检查

检查部分可以按着自己的要求设置(if中的内容就是自己设的要求,不满足就会重新输入)。

2.录入

因为录入部分的函数return(返回)的是自己建立的链表,所以每次选择录入时都会重新给头结点申请空间,自然而然头换了,后面部分也就没了。(链表单指连续)

3.增删改查部分(个人认为增删改需要重点看)

增已经介绍过了

删:一定要记住不要直接删,否则链表会断开,一定要先把链表连完整(把将要删除的前一个结点连到将要删除的后一个结点)。

 

改:个人是用了新的结点覆盖了之前的结点,切记链表的连接!!!

查:遍历链表即可,需要用到循环判断。

4.排序(重点看)

冒泡排序(解释太麻烦,看代码看不懂的可以去网上找资源)。

5.性别统计,不及格统计

一些很简单的循环问题和if语句判断问题。

6.文件

主要在网上找视频,了解写文件读文件即可。

 7.主函数

对switch语句的运用。


 

代码部分


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

struct student
{
	char id[20];
	char name[20];
	char sexual[20];
	float grade_math;
	float grade_English;
	float grade_c;
	student *next;
};

int color(int number)
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),number);
	return 0;
} 

void menu()
{
		system("cls");
	printf("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-登陆成功!-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\n");
    printf("-------------------------___【学生信息管理系统】___--------------------------------\n");
	printf(" \n");
	printf(" \n");
    printf("===================================================================================\n");
    printf("********************************------------***************************************\n");
    printf("*******************************||  *菜单*  ||**************************************\n");
    printf("********************************------------***************************************\n");
    printf("===================================================================================\n");
    printf("        *|*                   [1]录入学生信息                           *|*        \n");
    printf("        *|*         (注录入会把之前存的数据全部消除)                     *|*        \n");
    printf("        *|*                   [2]增加学生信息                           *|*        \n");
    printf("        *|*                   [3]删除本班学生信息                       *|*        \n");
    printf("        *|*                   [4]修改本班学生信息                       *|*        \n");
    printf("        *|*                   [5]查看全部学生信息                       *|*        \n");
    printf("        *|*         (注:选择查看请先选择[1]录入成绩)                    *|*        \n");
    printf("        *|*                   [6]性别统计                              *|*        \n"); 
    printf("        *|*         (注:选择性别统计请先选择[1]录入成绩)                *|*        \n");
    printf("        *|*                   [7]查看专业课不及格的学生信息             *|*        \n");
    printf("        *|*         (注:选择查看专业课不及格的学生请先选择[1]录入成绩)    *|*        \n");
    printf("        *|*                   [8]按c语言成绩排序(降序)                *|*        \n");
    printf("        *|*                   [9]保存学生信息                          *|*        \n")
    printf("        *|*                   [0]退出                                  *|*        \n");
    printf("________*|*_____________________________________________________________*|*________\n");
    printf("-----------------------------------------------------------------------------------\n"); 
    printf("PS: 不要忘记先录入成绩哦__\n\n");
} 

void Check_student(student *NEW)
{
	char id[20];
	char name[20];
	char sexual[20];
	float grade_math;
	float grade_English;
	float grade_c; 
	while(1)
	{
		scanf("%s%s%s%f%f%f",&id,&name,&sexual,&grade_math,&grade_English,&grade_c);
		printf(" \n"); 
		if(strlen(id)==10&&(strcmp(sexual,"man")==0||strcmp(sexual,"woman")==0)&&(grade_math>=0&&grade_math<=100)&&
		(grade_English>=0&&grade_English<=100)&&(grade_c>=0&&grade_c<=100))
		{
			strcpy(NEW->id,id);
			strcpy(NEW->name,name);
			strcpy(NEW->sexual,sexual);
			NEW->grade_math=grade_math;
		 	NEW->grade_English=grade_English;
		 	NEW->grade_c=grade_c;
		 	return ; 	
		}else{
			printf("-----     数据输入错误,请重新输入!     -----\n");
			getchar();
		}
	}
	system("pause");
}



student *Creat_student() 
{
	system("cls");
	student *head = (student *)malloc(sizeof(student));
	student *p = (student *)malloc(sizeof(student));
	head->next = NULL;
	p = head;
	printf("-----     请输入你将要录入学生信息的人数     \n-----");
	int n;
	scanf("%d",&n);                    
	for(int i=0;i<n;i++)
	{
		student *q = (student *)malloc(sizeof(student));
		printf("请按照如下格式书写\n---->   学号(10)   姓名   性别 数学 英语 c语言\n");
		printf("--->如  0000000000 张三   man  100  100  100\n");
		printf("-------------------------------------------------------------\n"); 
		printf("---->   ");
		Check_student(q);
		student *c = (student *)malloc(sizeof(student));
		c = head	;
		int num = 1;
		while(c)
		{
			if(strcmp(q->id,c->id)==0) 
			{
				num = 0;
				break;
			}
			c = c->next;
		}		
		if(num)
		{
			q->next = NULL;
			p->next = q;
			p = q; 
		}else{
			printf("-----     该学生信息已存在,请重新输入     -----\n");
			n++; 
			system("pause");
		}
 	} 
 	printf("录入完毕!\n");
 	system("pause");
 	return head;
}

void Add_student(student *head)
{
	system("cls");
	while(1)
	{
		printf("----      请输入将要增加的数量      ----\n");
		student *p = (student *)malloc(sizeof(student));
		p = head;
		int n;
		scanf("%d",&n);
		for(int i=0;i<n;i++)
		{
			student *q = (student *)malloc(sizeof(student));
			printf("请按照如下格式书写\n---->   学号(10)   姓名   性别 数学 英语 c语言\n");
			printf("--->如  0000000000 张三   man  100  100  100\n");
			printf("-------------------------------------------------------------\n"); 
			printf("---->   ");
			Check_student(q);
			student *c = (student *)malloc(sizeof(student));
			c = head->next;
			int num = 1;
			while(c)
			{
				if(strcmp(q->id,c->id)==0) 
				{
					num = 0;
					break;
				}
				c = c->next;
			}
			if(num)
			{
				q->next = head->next;
				head->next = q;
			}else{
				printf("-----     该学生信息已存在,请重新输入     -----\n");
				n++; 
				system("pause");
			}
			printf("----------             录入完毕!             ----------\n");
	 		system("pause");
		}	
		int m;
		printf("-----     是否继续增加学生,若是,请输入1,若输入其他则返回主界面     -----\n");
		scanf("%d",&m);
		if(m!=1)
		{
			break;
		} 
	}
}

void delete_student(student *head)
{   
	system("cls");
	student *p = (student *)malloc(sizeof(student));
	p = head;
	student *q = (student *)malloc(sizeof(student)); 
	printf("----    请输入将要删除学生的学号    ----\n");
	printf("0000000000(学号为十位数)\n");
	char id[20];
	scanf("%s",&id);
	if(p==NULL)
	{
		printf("------      此时没有学生信息,请重新输入      ------\n");
		system("pause");
	}else{
		while(p->next!=NULL)
		{
			if(strcmp(p->next->id,id)==0)
			{
			   	q = p->next;
			  	p->next = q->next;
			    free(q);
			   	printf("-----     该学生的信息已被删除     -----\n");
			    system("pause");
			    return ;
			}
			p = p->next;
		}
		if(p->next==NULL)
		{
			printf("----    没有查询到将要删除的学生信息    ----\n");
			system("pause");
			return ; 
		}
	}
}

 void Revise_student(student *head)
{
	system("cls");
	printf("----      请输入将要修改的数量      ----\n");
	student *p = (student *)malloc(sizeof(student));
	p = head;
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		student *q = (student *)malloc(sizeof(student));
		q->next = NULL;
		printf("----    请输入将要修改学生的学号    ----\n");
		printf("0000000000(学号为十位数)\n");
		char id[20];
		scanf("%s",&id);
		system("cls");
		if(p==NULL)
		{
			printf("------      此时没有学生信息,请重新输入      ------\n"); 
			system("pause");
		}else{
			while(p!=NULL)
			{
				if(strcmp(p->id,id)==0)
				{
					printf("-----     请输入修改后的学生的学生信息     -----\n");
					printf("请按照如下格式书写\n---->   学号(10)   姓名   性别  数学 英语 c语言\n");
					printf("--->如  0000000000 张三   man   100  100  100\n");
					printf("-------------------------------------------------------------\n"); 
					printf("---->   ");
					scanf("%s%s%s%f%f%f",&q->id,&q->name,&q->sexual,&q->grade_math,&q->grade_English,
					&q->grade_c);
					student *c = (student *)malloc(sizeof(student));
					c = head->next;
					int num = 1;
					while(c)
					{
						if(strcmp(c->id,q->id)==0)
						{
							num = 0;
							break;
						}
						c = c->next;
					}
					if(num==1)
					{
						if(strlen(q->id)==10&&(strcmp(q->sexual,"man")==0||strcmp(q->sexual,"woman")==0)&&
						(q->grade_math>=0&&q->grade_math<=100)&&(q->grade_English>=0&&q->grade_English<=100)
						&&(q->grade_c>=0&&q->grade_c<=100))
						{
							strcpy(p->id,q->id);
							strcpy(p->name,q->name);
							strcpy(p->sexual,q->sexual);
							p->grade_math = q->grade_math;
							p->grade_English = q->grade_English;
							p->grade_c = q->grade_c;
							printf("------       该学生的信息已被修改!     ------\n");
							system("pause");
							break;
						}else{
							printf("-----     数据输入错误,即将返回到主页面!     -----\n");
							system("pause");
							break; 
				 		}	
					}else{
						printf("-----     该学生信息已存在,即将返回到主页面!     -----\n");
						system("pause");
						break;
					}
				}
				p = p->next;
			}
			if(p==NULL) 
	 		{
	 			printf("-----     没有找到该学生信息,按任意键返回主界面!     -----\n");
				system("pause");
				break;
			}
		}  
	}	
}

void All_student(student *head)
{
	system("cls");
	student *p=head;
	printf("----所有的学生信息总结----\n");
	printf(" \n");
	printf("学号\t\t姓名\t性别\t数学\t英语\tc语言\t\n");
	if(p==NULL)
	{
		printf("------      此时没有学生信息,请重新输入      ------\n");
		system("pause");
	}else{
		while(p->next!=NULL)
		{
			printf("%s\t%s\t%s\t%.1f\t%.1f\t%.1f\t\n",
		    p->next->id,p->next->name,p->next->sexual,p->next->grade_math,p->next->grade_English,p->next->grade_c);
		    p=p->next;
		}
	}
	printf("--------------------------------------------------------------\n");
    printf("                          输出完毕                             \n");
    system("pause");
}

int sexual_census(student *head)
{
	system("cls");
	student *p = (student *)malloc(sizeof(student));
	p = head;
	int man = 0;
	int woman = 0; 
	if(p==NULL)
	{
		printf("------      此时没有学生信息,请重新输入      ------\n");
		system("pause");
	}else{
		while(p->next!=NULL)
		{
			if(strcmp(p->next->sexual,"man")==0)
			{
				man++;
			}else if(strcmp(p->next->sexual,"woman")==0)
			{
				woman++;
			}
			p = p->next;
		}
	}
	printf("------     统计结果为     ------\n");
	printf("----    男生的人数为:%d人\n",man);
	printf("----    女生的人数为:%d人\n",woman);
	printf("--------------------------------------------------------------\n");
	system("pause");
	return 0; 
}

void sorttotal_student(student *head)
{
	system("cls");
	int cou = 0;
	int i,num;
	student *tail = (student *)malloc(sizeof(student));
	student *q = (student *)malloc(sizeof(student));
	student *p = (student *)malloc(sizeof(student));
	student *t = (student *)malloc(sizeof(student));
	t = head;
	if(t->next != NULL)
	{
		while(t->next != NULL)
		{
			cou++;
			t = t->next;
		}
		for(i=0;i<cou-1;i++)
		{
			num = cou-i-1;
			tail = head;
			q = tail->next;
			p = q->next;
			while(num--)
			{
				if(q->grade_c<p->grade_c)
				{
					q->next = p->next;
					p->next = q;
					tail->next = p;
				}
				tail = tail->next;
				q = tail->next;
				p = q->next;
			}
		}
		printf("--------        排序成功,请返回主界面选择查看!        --------\n");
		system("pause"); 
	}else
	{
		printf("--------        此时没有学生信息,请录入!        --------\n");
		system("pause");
	}
}

void bad_student(student *head)
{
	system("cls");
	student *p = (student *)malloc(sizeof(student));
	p = head;
	printf("-----     专业课不及格的学生如下     -----\n");
	printf("学号\t\t姓名\t性别\t数学\t英语\tc语言\t\n");
	if(p==NULL)
	{
		printf("------      此时没有学生信息,请重新输入      ------\n");
		system("pause"); 
	}else{
		while(p->next!= NULL)	
		{
			if(p->next->grade_c<60)
			{
				printf("%s\t%s\t%s\t%.1f\t%.1f\t%.1f\t\n",
		    	p->next->id,p->next->name,p->next->sexual,p->next->grade_math,
				p->next->grade_English,p->next->grade_c);
				printf("--------------------------------------------------------------\n");
			}
			p = p->next;
		}
	}
	system("pause");
} 

void Save_student(student *head)
{
	system("cls");
	char filename[15];
	printf("------     请输入要建立的文件的名称:     ------\n"); 
	scanf("%s",filename);
	FILE *fp;
	fp = fopen(filename,"w");
	if(fp==NULL)
	{
		printf("-----     打开文件失败!     -----\n");
		system("pause");
		return ;
	}
	student *p = head->next;
	while(p)
	{
		fprintf(fp,"学号\t\t\t姓名\t\t性别\t\t数学\t\t英语\t\tc语言\t\t\n");
		fprintf(fp,"%s\t\t%s\t\t%s\t\t%.1f\t\t%.1f\t\t%.1f\t\t\n",&p->id,&p->name,
		&p->sexual,&p->grade_math,&p->grade_English,&p->grade_c);
		p = p->next;
	}
		printf("-------     学生数据保存成功!     -------\n");
		system("pause");
	fclose(fp);
} 

int main() 
{
	int x = 0;
	while(1)
	{
		color(2);
		char mima[20] = "nangongyouc";
		char mima_1[20];
		printf("------    请输入密码(您还有%d次机会)    ------\n",6-x);
		printf("---->");
		gets(mima_1);
		if(strcmp(mima_1,mima)==0)
		{
			printf("------       密码正确!       ------\n");
			printf(" \n");
			printf("pause");
			printf("--- 请按任意键进入学生管理系统! ---\n");
			break; 
		}else if(strcmp(mima_1,mima)!=0&&x<5){
          x++;
			printf("-----   密码错误,请重新输出   -----\n"); 
			system("pause");
			system("cls");
		}else if(strcmp(mima_1,mima)!=0&&x>=5)
		{
			printf("密码输入次数过多,已退出系统!");
			return 0;
		}
	}
	student *head = (student *)malloc(sizeof(student));
	head->next = NULL;
	int n;
	while(1)
	{
		color(11);
		menu();
		scanf("%d",&n);
		switch(n)
		{
		case 1:
			color(6);
			head = Creat_student();
			break;
		case 2:
			color(11);
			Add_student(head);
			break;
		case 3:
			color(14);
			delete_student(head);
			break;
		case 4:
			color(9);
			Revise_student(head);
			break;
		case 5:
			color(12);
			All_student(head);
			break;
		case 6:
			color(13);
			sexual_census(head);
			break;
		case 7:
			color(10);
			bad_student(head);
			break;
		case 8: 
			color(12);
			sorttotal_student(head);
			break;
		case 9:
			color(10);
			Save_student(head);
			break;
		case 0:
			printf("-----     欢迎下次使用     -----!");
			return 0;
		default:
			printf("-----     请按系统提示进行操作     -----\n");
			system("pause");
			break;
		}
	}
	return 0;
} 

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值