选修课学生信息管理--洛谷AC

题目背景

选修课初期涉及学生的选修和退修,后期涉及成绩的报送和查询。此题模拟实现简单的选修管理。

题目描述

学生信息包括:学号、姓名、学院、平时成绩、期末成绩、总评成绩,编写程序实现对学生和成绩的管理。要求完成以下功能:
1) 初始学生信息的录入,学生按学院输入,各项成绩初始为0;
2) 补充新到学生的信息,要求增加后仍保持按学院有序;
3) 删除退修的学生信息;
4) 录入平时成绩和期末成绩,计算总评成绩(平时成绩和期末成绩各占50%);
5) 查询输出学生的完整信息。

输入格式

101 zs dxxy
201 ls jdxy
205 wxe jdxy
405 ww ttxy
407 ze ttxy
-1
0 205
1 104 lw dxxy
-1
101 zs dxxy 80 90
104 lw dxxy 70 80
201 ls jdxy 60 70
405 ww ttxy 90 90
407 ze ttxy 50 90
-1
201
输入说明:
每组数据以-1分隔
第一组数据为初始学生选修名单
第二组数据为退修和补充的学生信息;0开头行表示退修学生学号,1开头行表示补充学生信息;注:退修和补充的学生人数可能不止一个。
后面一组数据是期末成绩单,包括平时成绩和期末成绩;
最后一行输入是需要查询输出的学生学号

输出格式

101 zs dxxy 80 90 85
104 lw dxxy 70 80 75
201 ls jdxy 60 70 65
405 ww ttxy 90 90 90
407 ze ttxy 50 90 70
201 ls jdxy 60 70 65
输出说明:
输出学生的完整信息,包括:学号 姓名 学院 平时成绩 期末成绩 总评成绩
如果没有找到,输出-1

输入输出样例

在这里插入图片描述

#include<iostream>
#include <stdlib.h>
#include <stdio.h>
#include<string.h>
using namespace std;
struct Student{
    
    
	int ID;
	string name;
	string academy;
	float regular_grade;
	float final_grade; 
	float total_mark;
}; 
typedef struct LNode{
    
    
	struct Student data;
	struct LNode *next;
}LNode,*LinkList;
//***头插法 
LNode* CreateLinkList(){
    
    
	LinkList L=new LNode;
	L->next=NULL;
	LNode *temp,*p;
	p=L;
	while(1){
    
    
		temp=new LNode;
		cin>>temp->data.ID;
		if(temp->data.ID==-1) break;
		cin>>temp->data.name>>temp->data.academy;
		temp->data.regular_grade=0;
		temp->data.final_grade=0;
		temp->data.total_mark=0;
		p->next=temp;
		p=temp;
	}
	p->next=NULL;
	return L;
}
//***补充学生,添加函数 
void Ladd(LinkList L,Student s)
{
    
    
	LNode *pre,*p,*q;
	int i=0,j=0;
	q=L;
	pre=L;
	while(q->data.academy!=s.academy&&q!=NULL)
	{
    
    
		q=q->next;
		i++;
	}
	while(j<i&&pre!=NULL)
	{
    
    
		pre=pre->next;
		j++;
	}
	p=new LNode;
	s.regular_grade=0;
	s.final_grade=0;
	s.total_mark=0;
	p->data=s;
	p->next=pre->next;
	pre->next=p;
}

//***退修删除函数
void Ldelete(LinkList L,int i) 
{
    
    
	LNode *p,*q;
	p=L;
	while(p->next!=NULL)
	{
    
    
		if(p->next->data.ID==i)
		{
    
    
			q=p->next;
			p->next=p->next->next;
			free(q);
		}
		else p=p->next;
	}
	
}
//***录入成绩函数
void Insert(LinkList L) 
{
    
    
	LNode *p;
	int a,b,c,num;
	string str1,str2;
	p=L->next;
	while(1){
    
    
		cin>>num;
	    if(num==-1) break;
		cin>>str1>>str2;
		cin>>a>>b;
		c=(a+b)/2;
		p->data.ID=num;
		p->data.name=str1;
		p->data.academy=str2;
		p->data.regular_grade=a;
		p->data.final_grade=b;
		p->data.total_mark=c;
		p=p->next;
	}
}
//***按学院有序排序 
LinkList Ltraver(LinkList L) 
{
    
    
    struct Student temp;
    LinkList p,q;
    p=q=L;
    while(q)
    {
    
    
    	p=q->next;
    	while(p)
    	{
    
    
    		if(q->data.academy>p->data.academy)//strcmp()>0
    		{
    
    
    			temp=q->data;
    			q->data=p->data;
    			p->data=temp;
			}
			p=p->next;
		}
		q=q->next;
	}
	return L;
}

//***按学号查询函数并显示学生全部信息 
LNode *Lsearch(LinkList &L,int a) 
{
    
    
	LNode *p;
	p=L->next;
	while(p->data.ID!=a&&p->next!=NULL)
		p=p->next;
	if(p->data.ID==a)
      cout<<p->data.ID<<" "<<p->data.name<<" "<<p->data.academy<<" "<<p->data.regular_grade<<" "<<p->data.final_grade<<" "<<p->data.total_mark<<endl;
	else cout<<"-1";
}
//***显示信息函数
void show(LinkList L)
{
    
    
	LNode *p;
	p=L->next;
	while(p)
	{
    
    
		cout<<p->data.ID<<" "<<p->data.name<<" "<<p->data.academy<<" "<<p->data.regular_grade<<" "<<p->data.final_grade<<" "<<p->data.total_mark<<endl;
		p=p->next;
	}
} 
 
 
int main(){
    
    
	LinkList La;
	La=CreateLinkList();
	int i,j;
	Student s;
	int a;
	while(1)
	{
    
    
		cin>>a;
		if(a==-1) break;
		switch(a)
		{
    
    
			case 0:cin>>i;Ldelete(La,i);break;
			case 1:cin>>s.ID>>s.name>>s.academy;Ladd(La,s);La=Ltraver(La);break;
		}
	}
	Insert(La);
	show(La);
	cin>>j;
	Lsearch(La,j);
	system("pause");
	return 0;
}

Guess you like

Origin blog.csdn.net/weixin_45800653/article/details/107954274