写的第一个学生成绩管理系统

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

typedef struct Students{
	char digit[11];//十位学号
	char name[20];//姓名
	double gradesTime[3];//三项分别记录学生高数、马克思、C语言平时成绩 
	double gradesExam[3];//考试成绩
	double gradesSum[3];//总成绩
	struct Students* next;
} Student;

//这里只对函数做简单介绍 
int Check(Student* p);//判断输入是否合法
Student* Add(Student* head);//将学生信息添加到链表 
void Read(Student* head);//输出低于平均分人数 
void Find(Student* head);//查找节点 
void Revise(Student* head);//修改链表中的一个节点 
Student* Delete(Student* head);//删除结点
Student* Sort(Student* head);//排序并输出 

int main(int argc,char *argv[])
{
	Student* head=NULL;//创建表头
	
	//根据选择调用操作函数 
	while(1)
	{
		//界面准备 
		int choose;
		printf("\t\t\t\t  ***学生成绩信息管理系统***\n");
		printf("\t\t\t\t\t1.添加学生信息\n");
		printf("\t\t\t\t\t2.统计学生信息\n");
		printf("\t\t\t\t\t3.查找学生成绩\n");
		printf("\t\t\t\t\t4.修改学生成绩\n");
		printf("\t\t\t\t\t5.删除学生信息\n");
		printf("\t\t\t\t\t6.学生信息排序\n");
		printf("\t\t\t\t\t7.退出系统\n");
		printf("\t\t\t\t\t***************\n");
		printf("\t\t\t\t\t请输入操作指令\n");
		scanf("%d",&choose);
		
		switch(choose)
		{
			case 1:head=Add(head);break;
			case 2:Read(head);break; 
			case 3:Find(head);break;
			case 4:Revise(head);break;
			case 5:head=Delete(head);break;
			case 6:head=Sort(head);break;
			case 7:break;
			default:printf("请输入正确的操作指令!\n");break;
		}
		if(choose==7)
		{
			printf("退出成功\n");
			break;
		}
		else
		{
			system("pause");
			system("cls");
		}
	}
	
	return 0;
}

int Check(Student* p)
{
	int result=1;//result作为返回值,1合法,0非法
	for(int i=0;i<3;i++)
	{
		if(p->gradesTime[i]<0||p->gradesTime[i]>100||p->gradesExam[i]<0||p->gradesExam[i]>100)
		{
			result=0;
			break;
		}
	}
	return result;
}

Student* Add(Student* head)
{
	Student* p;//创建临时指针 
	p=(Student*)malloc(sizeof(Student));
	p->next=NULL;
	printf("输入十位学号:");
	scanf("%s",p->digit);
	
	int judge=1;//值为1表示没有重复,为0表示已经储存过该生信息 
	for(Student* i=head;i!=NULL;i=i->next)//判断是否已储存该学生信息 
	{
		if(strcmp(i->digit,p->digit)==0)
		{
			printf("该学生信息已保存\n");
			judge=0;
			break;
		}
	}
	
	if(judge==1)
	{
		printf("输入姓名:");
		scanf("%s",p->name);
		printf("依次输入高数、马克思、C语言平时成绩:");
		scanf("%lf %lf %lf",&p->gradesTime[0],&p->gradesTime[1],&p->gradesTime[2]);
		printf("依次输入上述考试成绩:");
		scanf("%lf %lf %lf",&p->gradesExam[0],&p->gradesExam[1],&p->gradesExam[2]);
		
		while(Check(p)==0)//判断成绩是否合法 
		{
			printf("输入的成绩应该在0-100之间,请重新输入!\n");
			printf("依次输入高数、马克思、C语言平时成绩:");
			scanf("%lf %lf %lf",&p->gradesTime[0],&p->gradesTime[1],&p->gradesTime[2]);
			printf("依次输入上述考试成绩:");
			scanf("%lf %lf %lf",&p->gradesExam[0],&p->gradesExam[1],&p->gradesExam[2]);
		}
		
		//输入完成,计算总成绩
		p->gradesSum[0]=0.3*p->gradesTime[0]+0.7*p->gradesExam[0];
		p->gradesSum[1]=0.5*p->gradesTime[1]+0.5*p->gradesExam[1];
		p->gradesSum[2]=0.4*p->gradesTime[2]+0.6*p->gradesExam[2];
		
		//将成绩存进链表
		Student *tail;
		if(head==NULL)//判断表头是否为空 
			head=p;
		else
		{
			for(tail=head;tail->next!=NULL;tail=tail->next);//找尾巴
			tail->next=p; 
		}
	}
	
	return head;	
}

void Read(Student* head)
{
	if(head==NULL)
		printf("暂没有学生信息\n");
	else
	{
		double average[3];//记录三门平均分 
		int n=0;//记录学生人数 
		
		for(Student* i=head;i!=NULL;i=i->next)//遍历链表 
		{
			average[0]+=i->gradesSum[0];
			average[1]+=i->gradesSum[1];
			average[2]+=i->gradesSum[2];
			n++;
		}
		for(int i=0;i<3;i++)
		average[i]/=n;
		
		int count[3]={0};//记录三门低于平均分人数 
		for(Student* i=head;i!=NULL;i=i->next)//遍历链表 
		{
			for(int j=0;j<3;j++)
			{
				if(i->gradesSum[j]<average[j])
				count[j]++;
			}
		}
		
		printf("高数低于平均分的学生数=%d\n",count[0]);
		printf("马克思低于平均分的学生数=%d\n",count[1]);
		printf("C语言低于平均分的学生数=%d\n",count[2]);
	}
}

void Find(Student* head)
{
	char tem[11];//临时储存要查找学生的学号 
	printf("输入要查找学生的十位学号:");
	scanf("%s",tem);
	
	int judge=1;//值为1表示没有重复,为0表示已经储存过该生信息 
	for(Student* i=head;i!=NULL;i=i->next)//判断是否已储存该学生信息 
	{
		if(strcmp(i->digit,tem)==0)
		{
			printf("姓名:%s\n",i->name);
			printf("高数、马克思、C语言平时成绩分别为:%.2f %.2f %.2f\n",i->gradesTime[0],i->gradesTime[1],i->gradesTime[2]);
			printf("考试成绩分别为:%.2f %.2f %.2f\n",i->gradesExam[0],i->gradesExam[1],i->gradesExam[2]);
			printf("总成绩分别为:%.2f %.2f %.2f\n",i->gradesSum[0],i->gradesSum[1],i->gradesSum[2]);
			judge=0;
			break;
		}
	}
	
	if(judge==1)
	printf("没有该学生信息\n");
}

void Revise(Student* head)
{
	char tem[11];//临时储存要查找学生的学号 
	printf("输入要修改的学生的十位学号:");
	scanf("%s",tem);
	getchar();
	
	int judge=1;//值为1表示没有重复,为0表示已经储存过该生信息 
	for(Student* i=head;i!=NULL;i=i->next)//判断是否已储存该学生信息 
	{
		if(strcmp(i->digit,tem)==0)
		{
			printf("查找到该生姓名为%s,是否进行修改?(Y/N)",i->name);
			char a;
			scanf("%c",&a);
			if(a=='Y')
			{
				Student* p;//创建临时指针 
				p=(Student*)malloc(sizeof(Student));
				*p=*i;
				printf("依次输入修改后的高数、马克思、C语言平时成绩:");
				scanf("%lf %lf %lf",&p->gradesTime[0],&p->gradesTime[1],&p->gradesTime[2]);
				printf("依次输入修改后的上述考试成绩:");
				scanf("%lf %lf %lf",&p->gradesExam[0],&p->gradesExam[1],&p->gradesExam[2]);
		
				while(Check(p)==0)//判断成绩是否合法 
				{
					printf("输入的成绩应该在0-100之间,请重新输入!\n");
					printf("依次输入修改后的高数、马克思、C语言平时成绩:");
					scanf("%lf %lf %lf",&p->gradesTime[0],&p->gradesTime[1],&p->gradesTime[2]);
					printf("依次输入修改后的上述考试成绩:");
					scanf("%lf %lf %lf",&p->gradesExam[0],&p->gradesExam[1],&p->gradesExam[2]);
				}
		
				//输入完成,计算总成绩
				p->gradesSum[0]=0.3*p->gradesTime[0]+0.7*p->gradesExam[0];
				p->gradesSum[1]=0.5*p->gradesTime[1]+0.5*p->gradesExam[1];
				p->gradesSum[2]=0.4*p->gradesTime[2]+0.6*p->gradesExam[2];
				
				*i=*p;
				printf("修改成功\n");
			}
			else
				printf("请重新输入操作指令\n");
				
			judge=0;
			break;
		}
	}
	
	if(judge==1)
	printf("没有该学生信息\n");
}

Student* Delete(Student* head)
{
	char tem[11];//临时储存要删除学生的学号 
	printf("输入要删除的学生的十位学号:");
	scanf("%s",tem);
	getchar();
	
	int judge=1;//值为1表示没有重复,为0表示已经储存过该生信息
	Student *p1,*p2;
	for(p1=p2=head;p1!=NULL;p2=p1,p1=p1->next)//判断是否已储存该学生信息
	{
		if(strcmp(p1->digit,tem)==0)
		{
			printf("查找到该生姓名为%s,是否进行删除?(Y/N)",p1->name);
			char a;
			scanf("%c",&a);
			if(a=='Y')
			{
				if(p1==head)//删除表头情况
				head=head->next;
				else
				{
					p2->next=p1->next;
					free(p1);
				}
			}
			else
				printf("请重新输入操作指令\n");
				
			judge=0;
			break;
		}
	}
	
	if(judge==1)
	printf("没有该学生信息\n");
	
	return head;
}

Student* Sort(Student* head)
{
	if(head==NULL)
		printf("暂没有学生信息\n");
	else
	{
		int choose;
		printf("按照哪一门成绩进行降序排序?(1.高数  2.马克思  3.C语言)\n");
		scanf("%d",&choose);
		int n=0;//n用于统计学生人数好确定冒泡次数
		for(Student* i=head;i!=NULL;i=i->next,n++);
		
		for(int i=0;i<n-1;i++)//进行冒泡排序 
		{
			Student *p1,*p2;
			for(p1=p2=head;p1!=NULL&&p1->next!=NULL;p2=p1,p1=p1->next)
			{
				if(p1->gradesSum[choose-1]<p1->next->gradesSum[choose-1])//满足条件,进行链表顺序前后交换 
				{
					Student* tem;
					tem=p1->next->next;
					
					if(p1==head)//更换表头的情况
					{
						head=p1->next;
						head->next=p1;
						p1->next=tem;
						p1=head;//这句话很关键! 
					}
					else
					{
						p2->next=p1->next;
						p1->next->next=p1;
						p1->next=tem;
						p1=p2->next;//这句话很关键!
					} 
				}
			}
		}
		
		int m=1;
		for(Student* i=head;i!=NULL;i=i->next,m++)
		{
			printf("——以下为成绩第%d的同学的信息——\n",m);
			printf("学号:%s\n",i->digit);
			printf("姓名:%s\n",i->name);
			printf("高数、马克思、C语言平时成绩分别为:%.2f %.2f %.2f\n",i->gradesTime[0],i->gradesTime[1],i->gradesTime[2]);
			printf("考试成绩分别为:%.2f %.2f %.2f\n",i->gradesExam[0],i->gradesExam[1],i->gradesExam[2]);
			printf("总成绩分别为:%.2f %.2f %.2f\n",i->gradesSum[0],i->gradesSum[1],i->gradesSum[2]);
		}
	}
	
	return head;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值