C语言——学生成绩管理系统

/*1.用到链表
  2.增删改查
  3.各种排序显示
*/ 

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

struct Score {                    //定义成绩的结构体 
	
	int math;
	int C;
	int english;
};

struct student{                   //定义学生个人信息的结构体 
	char name[20];
	long num;
	char sex[10];
	struct Score score;
	struct student *next;
};

struct student *creat(int number)                                     //创建链表 
{
	
	int index;                                                        //用于循环变量 
	struct student *head;
	struct student *p1,*p2,*p;
	head = p2 = (struct student *) malloc(sizeof(struct student));    //分配空间 
	for(index = 0;index<number;index++) 
	{
		p1 = (struct student *) malloc(sizeof(struct student));       //p1在链表最前面,为p1分配空间
		p2->next = p1;
		p2 = p1;                                                      //将链表向前推进 
	}
	p2->next = NULL;                                                  //使链表最后的结点为空
	
	
	/*输入学生的信息*/
	
	p = head;                                                  //使p2先指向链表头
	while(p->next!=NULL) 											  //输入成绩 
	{
		printf("请输入学生的姓名:");
		scanf("%s",&p->name);
		printf("请输入学生的学号:");
		scanf("%d",&p->num);
		printf("请输入学生的性别:");
		scanf("%s",&p->sex);
		printf("请分别输入学生的高数、C语言、英语成绩:");
		scanf("%d%d%d",&p->score.math,&p->score.C,&p->score.english);
	    p = p->next;												   //往链表后边推进 
	    
	} 
	return  head;													   //将链表头返回 
}


void  add(struct student *head)                   //插入学生信息 
{

	struct student *p0,*p1,*p2;
	p1 = head;
	p2 = head->next;
	
		system("cls");
		p0=(struct student *)malloc(sizeof(struct student));
		printf("请输入增加学生的姓名:");                    			   //将所有需要插入的内容存储到P0中
		scanf("%s",&p0->name);
		printf("学生的学号:");
		scanf("%d",&p0->num);
		printf("学生的性别:");
		scanf("%s",&p0->sex);
		printf("分别输入学生的高数、C语言、英语成绩");
		scanf("%d%d%d",&p0->score.math,&p0->score.C,&p0->score.english);

	p1->next = p0;
	p0->next = p2;
	
	
}


void decrease(struct student *head)         //删除学生信息 
{
	int number;
	struct student *p2,*p1;
	printf("请输入所需要删除人的学号:\n");
	scanf("%d",&number);                    //输入需要删除的人的学号
    p1=head;                                //使链表从头开始
	p2=head->next;                          //p2在前,p1在后
	if(number==head->num)
		head = p2;
	else
	while(p2->next!=NULL)                         //循环查找所需要删除的学生学号
	{
		if(number==p2->num)
			{
			p1->next=p2->next;              //将所需要删除的学生信息存储的节点从链表中去除
			break;
			}
		p1=p1->next;
		p2=p2->next;
	}
	
}


void change(struct student *head)            //修改学生信息 
{
	int n = 0;
	int number;
	int judge = 1;
	struct student *p1,*p2;
	p1 = (struct student *) malloc(sizeof(struct student));
	while(judge)
	{
		system("cls");
		printf("请输入你要修改的学号:\n");
		scanf("%d",&number);
		p2 = head;
		while(p2->next!=NULL)                     //循环查找需要修改的学生信息
		{
			if(number==p2->num)             //查找到需要修改学生学号,对其进行数据覆盖
			{
				printf("学生的姓名为:");
				printf("%s\n",p2->name);
				printf("学生的学号为:");
				printf("%d\n",p2->num);
				printf("学生的性别为:");
				printf("%s\n",p2->sex);
				printf("学生的高数、C语言、英语成绩分别为:");
				printf("%d %d %d\n",p2->score.math,p2->score.C,p2->score.english);
				judge = 0;
				n++;
			}
			p2=p2->next;
		
			
		}
		if(n==0)                        //若未查找到所需要修改的学生,则报错
			{
				printf("查无此人!");
				judge = 1;
				
			}
 	}
 	
	printf("请输入修改后学生的姓名:");      //对查找到的学生信息数据覆盖
	scanf("%s",&p1->name);
	printf("学生的学号:");
	scanf("%d",&p1->num);
	printf("学生的性别:");
	scanf("%s",&p1->sex);
	printf("分别输入学生的高数、C语言、英语成绩:");
	scanf("%d%d%d",&p1->score.math,&p1->score.C,&p1->score.english);
	p2=p1;
} 


void sort_num(struct student *head)         //按总分排序,列出学生成绩 
{
	struct student *p1,*p2,*p3;
	long num[100];
	int score[100];
	int index = 0,indexj = 0,i = 0,j = 0;
	p3=head;
	while(p3->next!=NULL)
	{
		num[j] = p3->num;
		j++;
		p3=p3->next;
	}
	p1=head;
	while(p1->next!=NULL)//循环控制b的内容(单个学生的总成绩)
	{
		
		score[i]=p1->score.math+p1->score.C+p1->score.english;//将学生所有科目成绩相加
		i++;
		p1=p1->next;
	}
	for(index = 0;index<i;index++)
	{
		for(indexj = 0;indexj<i-index;indexj++)
		{
			if(score[indexj]<score[indexj+1])
			{
				int temp1;
				long temp2;
				temp1 = score[indexj+1];
				score[indexj+1] = score[indexj];
				score[indexj]  = temp1;
				
				temp2 = num[indexj+1];
				num[indexj+1] = num[indexj];
				num[indexj] = temp2;
			}
		}
	}
	printf("所有学生的总分排序为:\n");
	for(index = 0;index<i;index++)
	{
		printf("%d\t%d\n",num[index],score[index]);
	}
}


void sort_math(struct student *head)
{
	struct student *p1,*p2,*p3;
	long num[100];
	int score[100];
	int index = 0,indexj = 0,i = 0,j = 0;
	p3=head;
	while(p3->next!=NULL)
	{
		num[j] = p3->num;
		j++;
		p3=p3->next;
	}
	p1=head;
	while(p1->next!=NULL)//循环控制b的内容(单个学生的总成绩)
	{
		
		score[i]=p1->score.math;//将学生所有科目成绩相加
		i++;
		p1=p1->next;
	}
	for(index = 0;index<i;index++)
	{
		for(indexj = 0;indexj<i-index;indexj++)
		{
			if(score[indexj]<score[indexj+1])
			{
				int temp1;
				long temp2;
				temp1 = score[indexj+1];
				score[indexj+1] = score[indexj];
				score[indexj]  = temp1;
				
				temp2 = num[indexj+1];
				num[indexj+1] = num[indexj];
				num[indexj] = temp2;
			}
		}
	}
	printf("所有学生的高数排序为:\n");
	for(index = 0;index<i;index++)
	{
		printf("%d\t%d\n",num[index],score[index]);
	}
} 


void sort_C(struct student *head)
{
	struct student *p1,*p2,*p3;
	long num[100];
	int score[100];
	int index = 0,indexj = 0,i = 0,j = 0;
	p3=head;
	while(p3->next!=NULL)
	{
		num[j] = p3->num;
		j++;
		p3=p3->next;
	}
	p1=head;
	while(p1->next!=NULL)//循环控制b的内容(单个学生的总成绩)
	{
		
		score[i]=p1->score.C;//将学生所有科目成绩相加
		i++;
		p1=p1->next;
	}
	for(index = 0;index<i;index++)
	{
		for(indexj = 0;indexj<i-index;indexj++)
		{
			if(score[indexj]<score[indexj+1])
			{
				int temp1;
				long temp2;
				temp1 = score[indexj+1];
				score[indexj+1] = score[indexj];
				score[indexj]  = temp1;
				
				temp2 = num[indexj+1];
				num[indexj+1] = num[indexj];
				num[indexj] = temp2;
			}
		}
	}
	printf("所有学生的C语言排序为:\n");
	for(index = 0;index<i;index++)
	{
		printf("%d\t%d\n",num[index],score[index]);
	}
 } 
 
 
void sort_english(struct student *head)
 {
	struct student *p1,*p2,*p3;
	long num[100];
	int score[100];
	int index = 0,indexj = 0,i = 0,j = 0;
	p3=head;
	while(p3->next!=NULL)
	{
		num[j] = p3->num;
		j++;
		p3=p3->next;
	}
	p1=head;
	while(p1->next!=NULL)//循环控制b的内容(单个学生的总成绩)
	{
		
		score[i]=p1->score.english;//将学生所有科目成绩相加
		i++;
		p1=p1->next;
	}
	for(index = 0;index<i;index++)
	{
		for(indexj = 0;indexj<i-index;indexj++)
		{
			if(score[indexj]<score[indexj+1])
			{
				int temp1;
				long temp2;
				temp1 = score[indexj+1];
				score[indexj+1] = score[indexj];
				score[indexj]  = temp1;
				
				temp2 = num[indexj+1];
				num[indexj+1] = num[indexj];
				num[indexj] = temp2;
			}
		}
	}
	printf("所有学生的英语排序为:\n");
	for(index = 0;index<i;index++)
	{
		printf("%d\t%d\n",num[index],score[index]);
	}
 }
 

void sort(struct student *head)
{
	
 	int k=1,choose;
 	while(k==1)
 	{	
 		system("cls");
	  	void sort_num();
		void sort_math();
		void sort_C();
		void sort_english(); 
	 	printf("\n\n\n\n\n");
		printf("\t\t\t\t\t\t****************\n");
		printf("\t\t\t\t\t\t----------------\n");
		printf("\t\t\t\t\t\t 请选择排序方式 \n");
		printf("\t\t\t\t\t\t----------------\n");
		printf("\n\t\t\t\t\t\t1.按总分排序  \n");
		printf("\n\t\t\t\t\t\t2.按高数排序  \n");
		printf("\n\t\t\t\t\t\t3.按C语言排序 \n");
		printf("\n\t\t\t\t\t\t4.按英语排序  \n");
		printf("\n\t\t\t\t\t\t5.返回主界面  \n");
		printf("\t\t\t\t\t\t****************\n");
		printf("\t\t\t\t\t\t");
		while(1)
		{
			scanf("%d",&choose);
			switch(choose)
			{
				case 1:system("cls");sort_num(head);system("pause");break;
				case 2:system("cls");sort_math(head);system("pause");break;
				case 3:system("cls");sort_C(head);system("pause");break;
				case 4:system("cls");sort_english(head);system("pause");break;
				case 5:k = 0;break;
			}
			break;
		}
	}
} 


void find_number(struct student *head)          //按照学号查找函数
{
	int n=0;
	long i;                              //定义变量
	struct student *p2;                  //定义指针
	p2=head;                       //使链表从头开始
	printf("请输入您所要查找的学生学号:");//提示信息
	scanf("%d",&i);                      //输入查找的学生学号
	while(p2->next!=NULL)                      //循环查找输入的学生学号
	{
	if(i==p2->num)                       //输入查找的学号已找到
	{   system("cls");
	    printf("\n\n\n\t您所要查找的学生的姓名为:");//输出查找到的学生信息
		printf("%s\n",p2->name);
		printf("\t学生的学号为:");
		printf("%d",p2->num);
		printf("\t学生的性别为:");
		printf("%s\n",p2->sex);
		printf("\t学生的高数、C语言、英语成绩分别为:");
		printf("%d %d %d \n",p2->score.math,p2->score.C,p2->score.english);
		n++;
		break;
	}
	p2=p2->next;//使链表向前推进
	}
	if(n==0)//判断是否找到需要查找的学号
	printf("\t\t查无此人!");
	system("pause");
}


void find_name(struct student *head)//按照姓名查找函数
{
	char a[30];//定义字符数组,用于存储需要查找的学生姓名
	int n=0;
	struct student *p2;//定义指针
	printf("请输入你所需要查找的姓名:");
	scanf("%s",a);//输入所需要查找的学生姓名
	p2=head;//使链表从头开始
	while(p2->next!=NULL)//循环查找输入的姓名
	{
		if(strcmp(a,p2->name)==0)//对链表中的信息与输入的姓名进行对比
		{
		system("cls");
		printf("学生的姓名为:");
		printf("%s\n",p2->name);
		printf("学生的学号为:");
		printf("%d",p2->num);
		printf("学生的性别为:");
		printf("%s\n",p2->sex);
		printf("学生的高数、C语言、英语成绩分别为:");
		printf("%d %d %d\n",p2->score.math,p2->score.C,p2->score.english);n++;
		system("pause");
		}
		p2=p2->next;
		
	}
	if(n==0)//判断是否找到需要查找的姓名
	{
	printf("\t\t查无此人!");
	system("pause");
	}	
}


void cover()                                       //定义封面函数 
{
    printf("\n\n\n\n\n\n\n\n\n");
	printf("\t\t\t\t\t\t****************\n");
	printf("\t\t\t\t\t\t----------------\n");
	printf("\t\t\t\t\t\t学生成绩管理系统\n");
	printf("\t\t\t\t\t\t----------------\n");
	printf("\t\t\t\t\t\t****************\n");
	printf("\n\t\t\t\t\t\t    欢迎您    \n");
	printf("\t\t\t\t\t\t----------------\n");
	printf("\n\n\n\n\n\n\n\t\t\t\t\t\t");

	system("color  0e");                          //调整颜色为黑色背景黄色字体 
	system("pause");                              //暂停,防止里面弹回功能界面 
}


void function()                                          //定义功能界面函数 
{
	system("cls");                                       //清屏 
	printf("\n\n\n\n\n\n\n\n\n");
	printf("\t\t\t\t\t\t****************        \n");
	printf("\t\t\t\t\t\t----------------        \n");
	printf("\t\t\t\t\t\t        功能区          \n");
	printf("\t\t\t\t\t\t----------------        \n");
	printf("\t\t\t\t\t\t1.------输入信息        \n");
	printf("\t\t\t\t\t\t2.------进行排序        \n");
	printf("\t\t\t\t\t\t3.------按学号查询      \n");
	printf("\t\t\t\t\t\t4.------按姓名查询      \n");
	printf("\t\t\t\t\t\t5.------增加学生        \n");
	printf("\t\t\t\t\t\t6.------删除学生        \n");
	printf("\t\t\t\t\t\t7.------修改学生信息    \n");
	printf("\t\t\t\t\t\t8.------关于成绩管理系统\n");
	printf("\t\t\t\t\t\t9.------退出            \n");
	printf("\n\t\t\t\t\t\t选择要执行的功能        ");
	
}


void version()                           //定义版本信息 
{
	
	system("cls");
	printf("\n\n\n\n\n");
	printf("\t\t\t\t\t-------------------------------  \n");
	printf("\t\t\t\t\t*******************************  \n");
	printf("\t\t\t\t\t-------------------------------  \n");
	printf("\t\t\t\t\t-------成绩管理系统 1.0--------\n\n");
	printf("\t\t\t\t\t              By____18060207104\n\n");
	printf("\t\t\t\t\t--------------------- 2019/1/10\n\n");
	printf("\t\t\t\t\t版本更新------   已经是最新版本\n\n");
	printf("\t\t\t\t\t\t");
	system("pause");
	
}



int main()
{
	struct student * head;
	int n;
	
	
//	struct student *creat();

	
	cover();
	
	int h = 1,choose;
	while(h==1)                                 //while语句可以再次进行switch选择 
		{ 	
		function();                            //显示功能界面 
		scanf("%d",&choose);                       //选择执行的操作
		switch(choose)
			{
				case 1:system("cls");printf(" 请输入您所要创建的学生人数(接下来步骤请按照提示完成):");
					   scanf("%d",&n);             //输入creat的参数,控制创建节点的数量
					   head = creat(n);break;      //选择1进行输入信息操作 
				case 2:sort(head);break;               //选择2进行排序操作 
				case 3:find_number(head);break;        //选择3进行按学号查找操作 
				case 4:find_name(head);break;          //选择4进行按姓名查找操作 
				case 5:add(head);break;
				case 6:decrease(head);break;
				case 7:change(head);break;
				case 8:version(head);break;            //选择5进行输出操作 
				case 9:h=0;break;                  //选择7进行退出操作 
			}
			system("cls");                                            //清屏 
			printf("\n\n\n\n\n\n\n");
			printf("\t\t\t\t\t\t感谢您的使用!\n");
			printf("\t\t\t\t\t\t\t\t期待与您的再次相遇!\n");
			printf("\t\t\t\t\t\t");
	
    	}
	

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值