码迷,mamicode.com
首页 > 编程语言 > 详细

【C项目】 文件,结构体,链表,排序, 学生信息管理系统

时间:2016-06-24 20:49:43      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:【c项目】 文件   结构体   链表   排序   学生信息管理系统   

1、密码登录;

2、通过键盘输入学生信息,包括学生学号、姓名、成绩;

3、将输入的信息保存到指定文件中;

4、从文件中读取学生信息;

5、显示全部学生信息;

6、按学生总分进行降序排序;

7、删除学生信息;

8、查找学生信息,可以通过学号查找,也可以通过姓名查找;

9、统计学生信息,统计出最高分和学生人数;

10、退出系统;




源代码:

chunli@Linux:~$ cat main.c 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct student
{
	char num[9];
	char name[9];
	int scorem;
	int scoree;
	int scorec;
 		int sum;
	struct student *next;
};

struct student *creat(struct student *p)//创建链表
{
	struct student *p1 = NULL;
	p1 = (struct student*)malloc(sizeof (struct student));
	p -> next = p1;
	p1 -> next = NULL;
	printf("请输入要添加的学生的信息\n");
	printf("学号:");	scanf("%s",p1 -> num);
	printf("姓名: ");	scanf("%s",p1 -> name);
	printf("数学成绩:");	scanf("%d",&p1 -> scorem);
	printf("英语成绩:"); 	scanf("%d",&p1 -> scoree);
	printf("C语言成绩:");	scanf("%d",&p1 -> scorec);
	p1 -> sum = 0;
	p1 -> sum = p1 -> scorem + p1 -> scorec + p1 -> scoree; 
	printf("总分:%d",p1 -> sum);
	return p1;
}

void save1(struct student *p)//将链表从内存保存到文件中
{
	FILE *fp;
	if ((fp = fopen("student_system.txt","ab+")) == NULL)
		printf("创建失败!\n");
	while(p != NULL)
		{
			fwrite(p,sizeof(struct student),1,fp);
			p = p -> next;
		}
	fclose(fp);
	printf("保存成功!\n");
}
void save2(struct student *p)//将以变动的链表信息存入到文件中
{
	FILE *fp;
	if ((fp = fopen("student_system.txt","wb")) == NULL)
		printf("创建失败!\n");
	while(p != NULL)
		{
			fwrite(p,sizeof(struct student),1,fp);
			p = p -> next;
		}
	fclose(fp);
}
struct student *read()//把文件中的数据读到链表中
{
	FILE *fp;
	struct student *head=NULL,*p1=NULL,*p2=NULL;
	if ((fp=fopen ("student_system.txt","rb+"))==NULL)
	{
		printf ("读取时,文件打开失败!\n");
		return NULL;
	}
	head=p1=(struct student *)malloc (sizeof (struct student ));	
	while (fp != NULL)				
	{	
		if (fread(p1,sizeof (struct student ),1,fp) != 1)	break;
		p1 -> next = (struct student *)malloc (sizeof (struct student ));
		p2= p1;						
		p1= p1 -> next;				
	}
	p2->next = NULL;
	fclose (fp);
	return head;
}	

struct student *input()//添加函数
{
	char ch;
	struct student *p = NULL,*head=NULL;
	head=p = (struct student*)malloc(sizeof(struct student));
	p-> next = NULL;
	printf("请输入要添加的学生的信息\n");
	printf("学号:");	 scanf("%s",p -> num);
	printf("姓名: ");	 scanf("%s",p -> name);	
	printf("数学成绩:");	scanf("%d",&p -> scorem);
	printf("英语成绩:");	scanf("%d",&p -> scoree);
	printf("C语言成绩:");	scanf("%d",&p -> scorec);
	p -> sum = 0;
	p -> sum = p -> scorem + p -> scorec + p -> scoree; 
	printf("总分:%d",p -> sum);
	for (;;)	 
	{															
		printf ("\n是否继续输入学生信息?( y / n ):\n");
		getchar( );	
		ch = getchar ( );
		if (ch == ‘y‘|| ch == ‘Y‘)
			p = creat(p);
		else if(ch==‘n‘|| ch==‘N‘)	
		{
			save1 (head);
			break;
		}
		else	 
			printf ("您的输入有误,请重新输入,");
	}
	return p->next;
}

struct student *output()//输出函数,查看全部学生信息
{
	struct student *p ;
	p = read(); 
	if(read==NULL)
		exit(1);
		printf("\n	 *************************STUDENT***********************\n");
		printf("	 -------------------------------------------------------\n");
		printf("	 |	学号|	姓名|	数学|	英语|	C语言|	总分|\n");
		printf("	 -------------------------------------------------------\n");
		while (p != NULL)
		{
			p -> sum = 0;
			p -> sum = p -> scorem + p -> scoree + p -> scorec;
			printf("	|	%4s |	%-4s|	%3d |	%3d|	%3d|	%3d|\n",p->num,
				 p->name,p->scorem,p->scoree,p->scorec,p->sum);
			printf("	 -------------------------------------------------------\n");
			p = p -> next;
		}
		return p;
}
struct student *search()//查找函数
{
	int n;
	char a[9],b[9];
	struct student *p = NULL,*head = NULL;
	printf("请您选择要查找的方式:1 按姓名	2 按学号\n");
	scanf("%d",&n);
	if(n==1)
	{
		printf("请输入您要查找的学生的姓名:\n");
		scanf("%s",a);
		p=head=read();
		while(p!=NULL)
		{
			if(p==NULL)
			{
				printf("对不起,没有您要找的人。\n");
			}
			if(strcmp(p -> name,a)==0)
			{
				printf("\n	 *************************STUDENT***********************\n");
				printf("	 -------------------------------------------------------\n");
				printf("	 |	 学号	 |	姓名	|	数学	|	英语	| C语言 |	总分 |\n");
				printf("	 -------------------------------------------------------\n");
	 			printf("	 | %4s |	%-4s	|	%3d	 |	 %3d	|	%3d	|	%3d	|\n",p->num,
					 p->name,p->scorem,p->scoree,p->scorec,p->sum);
				printf("	 -------------------------------------------------------\n");
				break;
			}
			p=p->next;
		}
	}
	if(n==2)
	{
		printf("请输入您要查找的学生的学号:\n");
		scanf("%s",b);
		p=head=read();
		while(p!=NULL)
		{
			if(p==NULL)
			{
				printf("对不起,没有您要找的人。\n");
			}
			if(strcmp(p -> num,b)==0)
			{
				printf("\n	 *************************STUDENT***********************\n");
				printf("	 -------------------------------------------------------\n");
				printf("	 |	 学号	 |	姓名	|	数学	|	英语	| C语言 |	总分 |\n");
				printf("	 -------------------------------------------------------\n");
	 			printf("	 | %4s |	%-4s	|	%3d	 |	 %3d	|	%3d	|	%3d	|\n",p->num,
					 p->name,p->scorem,p->scoree,p->scorec,p->sum);
				printf("	 -------------------------------------------------------\n");
				break;
			}
			p=p->next;
		}
	}
	return head;
}
struct student *dele()//删除函数
{
	struct student *p1=NULL,*p2=NULL,*head=NULL;
	char a[9];
	output();
	printf ("请输入需要删除信息的人的姓名:\n");
	scanf ("%s",a);
	p1=head=read();
	if(head==NULL)
	{
		printf("对不起,暂时没有信息,无法删除。\n");
	}
	while (head!=NULL)
	{
		if(strcmp(a,head -> name) != 0 && p1->next!=NULL )
		{
			p2=head ;
			head= head->next ;
			if(head==NULL) break;
		}
		if(strcmp(a,head -> name) == 0 && p1==head)
		{
			p1=head->next ;
		}
		if(strcmp(a,head->name)==0)
		{
			p2->next=head->next;
			save2(p1);
			printf("该学生的信息删除成功!");
			break;
		}
			
	}
	if(head==NULL)
		printf("对不起,没有该学生的信息。\n");
	return head;
}
struct student *change()//修改函数
{
	int a;
	char x[9];
	struct student *p = NULL,*head = NULL,*q = NULL;
	output();
	p = head = read();
	printf("请输入要修改的人的姓名:\n");
	scanf("%s",x);
	if(p == NULL)
	{
		printf("没有这个人!\n");
		exit(1);
	}
	while (p != NULL)
	{
		if (strcmp(p -> name,x) == 0)
		{
			q = p;
			break;
		}
		p = p -> next;
	}
	if(p!=NULL)
	{
		printf("请选择修改的内容:\n");
		printf("1.姓名\n");
		printf("2.学号\n");	
		printf("3.数学成绩\n");	
		printf("4.英语成绩\n"); 
		printf("5.C成绩\n");	
		do 
		{
			scanf ("%d",&a);
			if(a < 0 || a > 6)
			printf ("您输入的数字有误,请重新输入:\n");
		}while (a<=0||a>=6);
		switch (a)
		{
		case 1 :	printf("请输入更改后的姓名:\n");	scanf("%s",p -> name);	 break;
		case 2 :	printf("请输入更改后的学号:\n");	scanf("%s",p -> num);	break;
		case 3 :	printf("请输入更改后的数学成绩:\n");scanf("%d",&p -> scorem);break;
		case 4 :	printf("请输入更改后的英语成绩:\n");scanf("%d",&p -> scoree);break;
		case 5 :	printf("请输入更改后的C成绩:\n");	 scanf("%d",&p -> scorec);break;						
		}
		p->sum =0;
		p->sum=p->scorem +p->scoree +p->scorec ;
		printf("更改后的总分:%d",p->sum);
		save2 (head);
		output();
	}
	if(p==NULL)
	{
		printf("对不起,没有这个人。\n");
	}
	return head;
}
struct student *sortsum(struct student	*head)//排序函数 
{
	struct student	*p,*p1,*p2,*p3;
	struct student m, n;
	if (head == NULL) return NULL;
	m.next=head;
	p=&m;
	while (p->next!=NULL)
	{
		p=p->next;
	}
	p=p->next=&n;
	while (p!=m.next)
	{
		p3=&m;
		p1=p3->next;
		p2=p1->next;
		while (p2!=p) 
		{
			if ((p1 -> sum) < (p2 -> sum) ) 
			{
				p1->next=p2->next;
				p2->next=p1;
				p3->next=p2;
				p3=p2; 
				p2=p1->next;
			}
			else
			{
				p3=p1;
				p1=p2;
				p2=p2->next;
			}
		}
		p=p1;
	}
	while (p->next!=&n)
	{
		p=p->next;
	}
	p->next=NULL;
	return m.next;
}
struct student *outputsortsum()//总分排序输出
{
	int i=0;
	struct student *head = NULL , *p = NULL;
	head = read();
	p = sortsum(head);
	printf("\n		*************************STUDENT****************************\n");
	printf("		------------------------------------------------------------\n");
	printf("		| 名次 |	 学号	 |	 姓名 |	数学 |	英语 | C语言 |	总分 |\n");
	printf("		------------------------------------------------------------\n");	
	while(p != NULL)
	{
		i++;
		printf("		| %3d	| %4s |	%-4s	|	%3d	|	%3d	|	%3d	|	%3d	|\n",i,p->num,
				p->name,p->scorem,p->scoree,p->scorec,p->sum);
		printf("		------------------------------------------------------------\n");
		p=p->next;
	}
	return head;
}
struct student *statistic()//统计函数
{
	int m = 0;
	struct student *head=NULL;
	struct student *p,*q;
	p = head = read();
	while( p != NULL)
	{
		m++;
		p = p -> next;
	}
	printf("总共有%d个学生信息.\n\n",m);
	q= sortsum(head);
	printf("分数最高的学生的信息:\n");
	printf("\n		***********************STUDENT*************************\n");
	printf("		-------------------------------------------------------\n");
	printf("		|	 学号	 |	姓名	|	数学	|	英语	| C语言 |	总分 |\n");
	printf("		-------------------------------------------------------\n");
	printf("		| %4s |	%-4s	|	%3d	 |	%3d	 |	%3d	|	 %3d |\n",q->num,
					q->name,	q->scorem,q->scoree,q->scorec,q->sum);
	printf("		-------------------------------------------------------\n");
	return head;
}
void login1 ()
{
	while(1)
	{
		int a=1;
		int i;
		char ch[10];
		char num[20]={"abcde"};
		printf("进入管理员成绩管理系统之前请先输入密码\n");
		printf("请输入您的密码 : ");
		scanf("%s",ch);
		if(strcmp(num,ch)==0)
		{
			a = 0;
		}
		if(a!=0)
		{
					 printf("\n这个密码是错误的! ");
					 printf("\n请输入正确的密码:");
		}
		else
		{
			break;
		}
	}
}

void login2 ()
 {
	while(1)
	{
		int a=1;
		int i;
		char ch[10];
		char num[20]={"12345"};
		printf("进入学生成绩管理系统之前请先输入密码\n");
		printf("请输入您的密码 :");
		scanf("%s",ch);
		if(strcmp(num,ch)==0)
			a = 0;
		if(a==0)
		{
			printf("\n欢迎进入学生成绩管理系统 !\n");
			getchar();
			break;
		}
		else 
		{
			printf("\n这个密码是错误的! ");
			printf("\n请输入正确的密码:");
		}
	}
}
void menu1()
{
	system("clear");
	printf("				欢迎进入管理员管理系统!\n");
	printf("		*******************************主菜单****************************\n");
	printf("		*			1 添加学生成绩				*\n");
	printf("		*			2 查找学生成绩				*\n");
	printf("		*			3 删除指定学生				*\n");
	printf("		*	 		4 修改学生信息				*\n");
	printf("		*			5 总分排序信息				*\n");
	printf("		*			6 查看全部信息				*\n");
	printf("		*			7 统计学生人数				*\n"); 
	printf("		*			8 停止程序运行				*\n");					
	printf("		*****************************************************************\n");
}		
void menu2()																			
{ 
	system("clear");
	printf("				欢迎进入学生管理系统!\n");
	printf("		*******************************主菜单****************************\n");
	printf("		*			1 查找学生成绩				*\n");
	printf("		*			2 总分排序信息				*\n");
	printf("		*	 		3 查看全部信息				*\n");
	printf("		*			4 统计学生人数				*\n"); 
	printf("		*		 	5 停止程序运行				*\n");					
	printf("		*****************************************************************\n");
}
void main()
{
	int a,m;
	int b = 1;
	system("clear");
	printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");	
	printf("			教务管理系统欢迎您!\n");
	printf("			请选择您要进入的管理系统 \n");	
 	printf("			1.管理员管理系统。\n");
	printf("			2.学生管理系统。\n");
	printf("			3.退出系统!\n");
	printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
	printf("请您选择: ");
	scanf("%d",&m);
	if(m==1){login1();}
	if(m==2){login2();}
	while (b == 1)
	{
		if(m==1)
		{
			menu1();
			scanf("%d",&a);
			switch(a)
			{
				case 1 :	input();		break;
				case 2 :	search();		 break;	
				case 3 :	dele();			break;	
				case 4 :	change();		 break;
				case 5 :	outputsortsum();	break;
				case 6 :	output();		 break;
				case 7 :	statistic();		break; 
				case 8 :	exit(1);
				default :	printf("输入错误!\n");break;
			}
			printf("\n\n请选择接下来的操作:\n");
			printf(" 1 . 返回主菜单	 2 . 退出程序\n");
			scanf("%d",&b);
		}
		if(m==2) 
		{
			menu2();
			scanf("%d",&a);
			switch(a)
			{
			case 1 :	search();			 break;	
			case 2 :	outputsortsum();		break;
			case 3 :	output();			 break;
			case 4 :	statistic();			break; 
			case 5 :	exit(1);
			default :	printf("输入错误!\n");break;
			}
			printf("\n\n请选择接下来的操作:\n");
			printf(" 1 . 返回主菜单	 2 . 退出程序\n");
			scanf("%d",&b);
		}
		if(m==3)
		exit (1);
	}
}

chunli@Linux:~$



编译运行:

chunli@Linux:~$ gcc main.c  && ./a.out 
★★★★★★★★★★★★★★★★★★★★★★★★★★★
			教务管理系统欢迎您!
			请选择您要进入的管理系统 
			1.管理员管理系统。
			2.学生管理系统。
			3.退出系统!
★★★★★★★★★★★★★★★★★★★★★★★★★★★
请您选择: 1
进入管理员成绩管理系统之前请先输入密码
请输入您的密码 : abcde
				欢迎进入管理员管理系统!
		*******************************主菜单****************************
		*			1 添加学生成绩				*
		*			2 查找学生成绩				*
		*			3 删除指定学生				*
		*	 		4 修改学生信息				*
		*			5 总分排序信息				*
		*			6 查看全部信息				*
		*			7 统计学生人数				*
		*			8 停止程序运行				*
		*****************************************************************
6

	 *************************STUDENT***********************
	 -------------------------------------------------------
	 |	学号|	姓名|	数学|	英语|	C语言|	总分|
	 -------------------------------------------------------
	|	   1 |	lucy|	 12 |	 32|	  0|	 44|
	 -------------------------------------------------------
	|	  45 |	34  |	354 |	343|	4234|	4931|
	 -------------------------------------------------------


请选择接下来的操作:
 1 . 返回主菜单	 2 . 退出程序


本文出自 “魂斗罗” 博客,请务必保留此出处http://990487026.blog.51cto.com/10133282/1792587

【C项目】 文件,结构体,链表,排序, 学生信息管理系统

标签:【c项目】 文件   结构体   链表   排序   学生信息管理系统   

原文地址:http://990487026.blog.51cto.com/10133282/1792587

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!