学生成绩管理系统完整版

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
struct student
{
	int num;
	char name[20];
	float score;
	struct student *next;
	
};
void welcome()
{
	printf("\t\t\t\t-----------------------------------------------------------------\n");
	printf("\t\t\t\t|\t\t\t欢迎使用学生管理系统!\t\t\t|\n");
	printf("\t\t\t\t-----------------------------------------------------------------\n");
	printf("\t\t\t\t!\t\t\t菜单                 \t\t\t!\n");
	printf("\t\t\t\t!\t\t\t----                                    !\n");                        
	printf("\t\t\t\t!\t\t\t1.录入同学信息       \t\t\t!\n");
	printf("\t\t\t\t!\t\t\t-------------                           !\n");
	printf("\t\t\t\t!\t\t\t2.增加同学信息       \t\t\t!\n");
	printf("\t\t\t\t!\t\t\t-------------                           !\n");
	printf("\t\t\t\t!\t\t\t3.删除同学信息       \t\t\t!\n");
	printf("\t\t\t\t!\t\t\t-------------                           !\n");
	printf("\t\t\t\t!\t\t\t4.修改同学信息       \t\t\t!\n");
	printf("\t\t\t\t!\t\t\t-------------                           !\n");
	printf("\t\t\t\t!\t\t\t5.查找同学信息       \t\t\t!\n");
	printf("\t\t\t\t!\t\t\t-------------                           !\n");
	printf("\t\t\t\t!\t\t\t6.同学成绩排序       \t\t\t!\n");
	printf("\t\t\t\t!\t\t\t-------------                           !\n");
	printf("\t\t\t\t!\t\t\t7.退出                \t\t\t!\n");
	printf("\t\t\t\t!\t\t\t-----                                   !\n"); 
	printf("\t\t\t\t-----------------------------------------------------------------\n"); 
}
struct student *input(int n)
{
	struct student *head;
	struct student *p;
	struct student *ptail;
	int i;
	head=NULL;
	i=0;
	while(i<n)
	{
	p=(struct student *)malloc(sizeof(struct student));
	printf("请输入第%d个学生信息:\n",i+1); 
	printf("学号: "); 
	scanf("%d",&p->num);
	printf("姓名: ");
	scanf("%s",p->name);
	printf("成绩:");
	scanf("%f",&p->score);
	if(p->score<0)
	{ 
	printf("请重新输入该学生成绩:");
	scanf("%f",&p->score);
	}
	if(i==0)
	{
		head=p;
		ptail=p;
		i++;
	}
	else
	{
		ptail->next=p;
		ptail=p;
		i++;	
	}
    }
    if(head!=NULL)
    {
    	ptail=NULL;
	}
	return head;
}
void output(struct student *head)
{
	struct student *pi;
	if(head==NULL)
	{
		printf("空链表!\n");
	}
	else
	{
		pi=head; 
	printf("\t\t\t\t学号\t\t姓名\t\t成绩\t\t\n");
	for(pi=head;pi!=NULL;pi=pi->next)
	{
	printf("\t\t\t\t%d\t\t",pi->num);
	printf("%s\t\t",pi->name);
	printf("%.2f\t\t\n",pi->score);
	}
	}
}
struct student *add(struct student *head)
{
	int i,a;
	char ch;
	i=0;
	struct student *p,*ptail;
	p=head;
	while(p->next!=NULL)
	{
		p=p->next;
	}
	printf("你需要增添几个学生信息:");
	scanf("%d",&a);
	while(a>=0)
	{
	printf("请输入第%d个增添的学生信息:\n",i+1);
	ptail=(struct student *)malloc(sizeof(struct student));
	ptail=NULL;
	printf("学号: "); 
	scanf("%d",&ptail->num);
	printf("姓名: ");
	scanf("%s",ptail->name);
	printf("成绩:");
	scanf("%f",&ptail->score);
	if(p->score<0)
	{ 
	printf("请重新输入该学生成绩:");
	scanf("%f",&p->score);
	}
	p->next=ptail;
	p=ptail;	
	i++;
	a--;
    }
	printf("你是否需要继续增添(是输入y否输入n):");
	fflush(stdin); 
	scanf("%c",&ch);
	if(ch=='y')
	{
	add(head);
    }
    if(ch=='n')
    {
    printf("增加以后的学生信息如下:\n");
    output(head);	
    welcome();
	}
	 else
	 printf("输入无效,请重新输入");
	 return head;
} 
void remove(struct student *head)
{
	struct student *pi,*ploc0,*ploc;
	int flag,nr;
	flag=0;
	printf("有以下几种方式,请选择"); 
	printf("1.学号");
	printf("2.姓名");
	printf("你的选择是:");
	scanf("%d",&nr);
	switch(nr)
	{
		case 1:
		int num;
	printf("请输入你要删除的学生的学号:");
	scanf("%d",&num);
	if(head->num==num)
		{
			ploc=head;
			head=head->next;
			free(ploc);
			flag=1;
		}
		else for(pi=head;pi->next!=NULL;pi=pi->next)
		{
			if(head->num==num)
			{
			ploc=pi->next;
			ploc0=pi;
			ploc0->next=ploc->next;
			free(ploc);
			flag=1;
			}
		}
		if(flag==0)
		{
    printf("没有此学号的学生,请重新输入\n");
    remove(head);
        }
    printf("删除以后的学生信息为:"); 
    output(head);
	break;
		case 2:
		char name[20];
	printf("请输入你要删除的学生的姓名:");
	scanf("%s",name);
		if(strcmp(head->name,name)==0)
		{
			ploc=head;
			head=head->next;
			free(ploc);
		}
		else for(pi=head;pi->next!=NULL;pi=pi->next)
		{
			if(strcmp(head->name,name)==0)
			{
			ploc=pi->next;
			ploc0=pi;
			ploc0->next=ploc->next;
			free(ploc);
			flag=1;
			}
		}
		if(flag==0)
		{
			printf("查无此人"); 
			remove(head); 
		}
		default:
		{
		printf("输入的数字无效,请重新输入");
	    remove(head); 
	    }
	    printf("删除以后的学生信息为:"); 
	    output(head);
}
}
void sort(struct student *head)
{
	char t[20];
	double x;
	int n,ns;
	struct student *p,*q,*pmax,*pmin;
	printf("有以下几种排序方式,请选择"); 
	printf("1.分数");
	printf("2.学号");
	printf("3.姓名");
	printf("你的选择是:");
	scanf("%d",&ns);
	switch(ns)
	{
		case 1:
	for(p=head;p->next!=NULL;p=p->next)
	{
		pmax=p;
		for(q=p->next;q!=NULL;q=q->next)
		{
			if(p->score<q->score)
			{
			pmax=q;	
			}
		}
			n=p->score;
			p->score=pmax->score;
			pmax->score=n;
			strcpy(t,p->name);
			strcpy(p->name,pmax->name);
			strcpy(pmax->name,t);
			x=p->num;
			p->num=pmax->num;
			pmax->num=x;
	}
	printf("排序以后为:");
	printf("\n"); 
	output(head);
		break;
		case 2:
	for(p=head;p->next!=NULL;p=p->next)
	{
		pmin=p;
		for(q=p->next;q!=NULL;q=q->next)
		{
			if(p->num>q->num)
			{
			pmin=q;	
			}
		}
			x=p->num;
			p->num=pmin->num;
			pmin->num=x;
			n=p->score;
			p->score=pmin->score;
			pmin->score=n;
			strcpy(t,p->name);
			strcpy(p->name,pmin->name);
			strcpy(pmin->name,t);
	}
	printf("排序以后为:");
	printf("\n"); 
	output(head);
		break;
		case 3:
	for(p=head;p->next!=NULL;p=p->next)
	{
		pmin=p;
		for(q=p->next;q!=NULL;q=q->next)
		{
			if(strcmp(p->name,q->name)>0)
			{
			pmin=q;	
			}
		}
			n=p->score;
			p->score=pmin->score;
			pmin->score=n;
			strcpy(t,p->name);
			strcpy(p->name,pmin->name);
			strcpy(pmin->name,t);
			x=p->num;
			p->num=pmin->num;
			pmin->num=x;
	}
	printf("排序以后为:");
	printf("\n");
	output(head);
		break;
		default:
		{
		printf("输入的数字无效,请重新输入:");
		sort(head); 
	    }
	}
}
void change(struct student *head)
{
	int num,flag,tn;
	char tc[20]; 
	struct student *pi;
	flag=0;
	printf("请输入你要修改同学的学号"); 
	scanf("%d",&num);
	for(pi=head;pi!=NULL;pi=pi->next)
	{
		if(pi->num==num)
		{
			flag++;
			printf("请输入你要修改的信息\n");
			 printf("姓名:");
			 scanf("%s",tc);
			 printf("成绩:");
			 scanf("%d",&tn);
			 pi->num=tn;
			 strcpy(pi->name,tc); 
		}
	}
	if(flag==1)
	{
	printf("修改后的学生信息为:\n");
	output(head);
    }
    if(flag==0)
    {
    	printf("输入学号错误,请重新输入");
    	change(head);
	}
}
void find(struct student *head)
{
	int nf,n;
	struct student *ptail,*p,*pi;
	n=0;
	printf("有以下查找方式,请选择"); 
	printf("1.姓名");
	printf("2.学号");
	printf("你的选择是:");
	scanf("%d",&nf);
	switch(nf)
	{
		case 1:
		char name[20]; 
		printf("请输入你需要查找的姓名:");
		scanf("%s",name);
		for(pi=head;pi!=NULL;pi=pi->next)
		{
			if(strcmp(pi->name,name)==0)
			{
				p=(struct student *)malloc(sizeof(struct student));
				p->num=pi->num;
				strcpy(p->name,name);
				p->score=pi->score;
			}
			if(n==0)
			{
				head=p;
				ptail=p;
				n++;
			}
			else
			{
				ptail->next=p;
				ptail=p;
				n++;
			}
		}
			if(head!=NULL)
			{
				ptail->next=NULL;
			}
	output(head);
		break;
		case 2:
		int num;
		printf("请输入你需要查找的学号:");
		scanf("%d",&num);
		for(pi=head;pi!=NULL;pi=pi->next)
		{
			if(pi->num==num)
			{
				p=(struct student *)malloc(sizeof(struct student));
				p->num=num;
				strcpy(p->name,pi->name);
				p->score=pi->score;
			}
			if(n==0)
			{
				head=p;
				ptail=p;
				n++;
			}
			else
			{
				ptail->next=p;
				ptail=p;
				n++;
			}
		}
			if(head!=NULL)
			{
				ptail->next=NULL;
			}
	output(head);
		break;
		default:
		{
		printf("输入的数字无效,请重新输入");
		find(head); 
	    }
	}
}
void option(struct student *head,int n,int num)
{
	switch(num)
	{
		case 1:
		printf("你已经录入了学生信息--");
		printf("请查看菜单重新选择--");
		printf("请输入你的选择\n");
		printf("你的选择是:");
		scanf("%d",&num); 
	    option(head,n,num); 
		break;
		case 2: 
		add(head);
		break;
		case 3:
		remove(head);
		break;
		case 4:
		change(head);
		break;
		case 5:
		find(head);
		break;
		case 6:
		sort(head);
	    break;
		case 7:
		printf("谢谢使用");	
		break;
		default:
		printf("输入的数字无效,请重新输入");	
	}
}
int main()
{
	int n,num;
	struct student *head; 
	welcome();
	printf("\t\t\t\t请先录入学生信息\n"); 
	printf("\t\t\t\t请输入你要录入的学生人数:");
	scanf("%d",&n);
	head=input(n);
	printf("\t\t\t\t以下是录入的学生信息\n");
	output(head);
	printf("请查看菜单输入你的选择\n");
	printf("你的选择是:"); 
	scanf("%d",&num); 
	option(head,n,num);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值