2019秋期计导实验十三(结构体与指针综合运用)

D. 世界杯

运行时间限制: 1000 运行内存限制: 65536
作者: scshuanghai 是否specialjudge: False
题目描述
世界杯小组赛的32支参赛队分为八个小组,每组四队进行比赛。每支球队都必须和其他三支球队进行且只进行一场比赛,胜者得三分,负者不得分,打平双方各得一分。每个小组的前两名出线。小组赛出线规则如下:
a、积分高者排名靠前
b、小组中总净胜球高者排名靠前
c、小组中总进球数高者排名靠前
假设依次采用a、b、c三条规则后没有排名相同的队伍,请写出判断各个队伍排名的程序。
输入:4行,每行一个字符串和3个整数,字符串为国家的名字(只包含大小写字母且长度不会超过20),3个整数(大于等于0且小于20)依次为该队的总进球数、总失球数和积分。注:总净胜球指的是该队总的进球数减去总的失球数。

要求:
1)通过typedef struct team TEAM语法格式定义存储球队信息的结构体。
2)设计三个函数,如下:
// 函数功能:比较两个队伍的信息,如果p2排名靠前则返回1,否则返回0
//参数p1,p2为指向被比较的两个结构体的指针,返回值为比较结果
int Comp(TEAM *p1,TEAM *p2);

//函数功能:将两个结构体的数据进行交换,即将两支球队的所有数据交换
//参数p1,p2为指向被交换的两个结构体的指针
void Swap(TEAM *p1,TEAM *p2);

//函数功能 依据排名规则降序排列
//参数team为指向待排序数据的指针,n为数组长度
void Sort(TEAM *teams,int n) ;
3)函数Sort中需要调用前两个函数,主函数只能调用Sort进行排序。

输入样例
Brazil 3 7 4
China 10 0 9
Germany 4 7 4
Italy 3 6 4
输出样例
China
Germany
Italy
Brazil

记录一下,没准什么时候对世界杯感兴趣了,可以拉出来直接用。
这题主要卡在逻辑判断,没有理清什么时候返回1,什么时候返回0.

#include<stdio.h>
struct team{
	char name[21];
	int total,lose,score;
};
typedef struct team TEAM;
int Comp(TEAM *p1,TEAM *p2);
void Swap(TEAM *p1,TEAM *p2);
void Sort(TEAM *teams) ;
int main()
{
	TEAM team[5];
	int i;
	for(i=0;i<4;i++)
	{
		scanf("%s",team[i].name);
		scanf("%d%d%d",&team[i].total,&team[i].lose,&team[i].score);
		//getchar();
		//puts(team[i].name);
	}
	Sort(team);//排序
	for(i=0;i<4;i++)//输出排名
	{
		puts(team[i].name);
	}
}
void Sort(TEAM *teams) 
{
	int i,j;
	for(i=0;i<4;i++)//冒泡排序,将小的冒到最后
	for(j=0;j<4-i-1;j++)
	{
		//printf("COMP_%d\n",Comp(teams+j,teams+j+1));
		if(Comp(teams+j,teams+j+1)==1)//此时teams[j+1]应在teams[j]前
		{
			//printf("Comp_1\n");
			Swap(teams+j,teams+j+1); 			
		}
	}
}
int Comp(TEAM *p1,TEAM *p2)//1表示前者小于后者,冒到后面,否则,不冒
{
	//printf("score_%d %d\n",p1->score,p2->score);
	if((p1->score)<(p2->score))//逻辑判断应理清
	return 1;//总分能直接排名
	else if((p1->score)==(p2->score)&&(((p1->total)-(p1->lose))<((p2->total)-(p2->lose))))//总分相等,根据净进球
	return 1;
	else if((p1->score)==(p2->score)&&(((p1->total)-(p1->lose))==((p2->total)-(p2->lose)))&&(p1->total)<(p2->total))
	return 1;
	else return 0;
}
void Swap(TEAM *p1,TEAM *p2)//交换两结构体
{
	//printf("Swap_1\n");
	//printf("%s\n",p1->name);printf("%s\n",p2->name);
	TEAM temp;
	temp=*p1;
	*p1=*p2;
	*p2=temp;
	//printf("%s\n",p1->name);printf("%s\n",p2->name);
}
/*
baxi 3 1 4
keluo 5 3 3
mo 1 0 4
kemai 0 5 0
*/

E. 学生信息管理系统

运行时间限制: 1000 运行内存限制: 65536
作者: scshuanghai 是否specialjudge: False
题目描述
创建学生信息管理系统,具体要求如下:
学生信息包括:学号 姓名 数学成绩 英语成绩 计算机成绩
功能1:添加学生信息
执行1时,输入学号,姓名,三门科目成绩;如果添加学生成功则输出“Add success”,如果学生已存在则输出“Students already exist”
功能2:删除学生信息
执行2时,输入学号信息;如果学生不存在,输出“Students do not exist”,如果存在,则输出“Delete success”
功能3:更改学生成绩信息
执行3时,输入学号信息;如果学生不存在,输出“Students do not exist”,如果存在,输出“Update success”
功能4:显示学生平均分成绩
执行4时,输入学号信息;如果学生不存在,输出“Students do not exist”,如果存在,则输出学生信息,如下格式:
Student ID:2019989890
Name:Jerry
Average Score:89.3
其中平均分为三门科目相加除以3,保留一位小数,每行之间换行。

输入:第一行为一个整数n(0<n<130),后边共n行,每一行表示执行一种功能。其中1,2,3,4分别对应执行上面4种功能,具体格式见输入样例。
测试用例保证:学号和名字均为长度不超过10的字符串,各门课成绩为0到100之间的整数。
输出:依据各功能要求输出。具体见输出样例。

输入样例
8
1 201817123 Tom 89 80 76
1 2019989890 Jerry 78 99 67
4 201817123
2 201817123
4 201817123
4 2019989890
3 2019989890 79 90 99
4 2019989890
输出样例
Add success
Add success
Student ID:201817123
Name:Tom
Average Score:81.7
Delete success
Students do not exist
Student ID:2019989890
Name:Jerry
Average Score:81.3
Update success
Student ID:2019989890
Name:Jerry
Average Score:89.3

这是我目前写过最长的代码,
思路很好想,把功能分成一块块函数就好,其中我使用了全局变量来记录学生个数。
遇到的问题是,
1.必须要将输入内容都存储,不然会造成下一个输入内容接收出错
2.faction2中删除该学生后,学生个数应减少,不然最最后的ptr+j会和ptr+j+1一样造成错误。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stusys{
	char id[11],name[11];
	int math,Eng,com;
};
int count=0;
void faction1(struct stusys *ptr);//add students' information
void faction2(struct stusys *ptr);//delete students' information
void faction3(struct stusys *ptr);//change students' information about grades.
void faction4(struct stusys *ptr);//reveal students' average grade 
int main()
{
	struct stusys stu[131];
	struct stusys *ptr=stu;//突然发现这里少了&,竟然过了
	//应该是struct stusys *ptr=&stu;
	int n,f,i;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&f);
		if(f==1)faction1(ptr);
		if(f==2)faction2(ptr);
		if(f==3)faction3(ptr);
		if(f==4)faction4(ptr);
	}
	return 0;
}
void faction1(struct stusys *ptr)//add students' information
{
	char id[11],name[11];
	int num1,num2,num3,i,flag=1;//用于检验是否需要添加students' information 
	scanf("%s%s",id,name);//必须要将输出内容都存储,不然会造成下一个输入内容接收出错
	scanf("%d%d%d",&num1,&num2,&num3);
	for(i=0;i<count;i++)
	{
		if(strcmp((ptr+i)->id,id)==0)//比较两串是否相等
		{
			flag=0; 
			printf("Students already exist\n");
			break;	
		}
	}
	if(flag==1)
	{
		strcpy((ptr+count)->id,id);
		strcpy((ptr+count)->name,name);
		//scanf("%d%d%d",&(ptr+count)->math,&(ptr+count)->Eng,&(ptr+count)->com);
		(ptr+count)->math=num1;
		(ptr+count)->Eng=num2;
		(ptr+count)->com=num3;
		printf("Add success\n");	
		//printf("%s\n%s\n",(ptr+count)->id,(ptr+count)->name);
		//printf("%d\n%d\n%d\n",(ptr+count)->math,(ptr+count)->Eng,(ptr+count)->com);
		count++;
	}
	
}
void faction2(struct stusys *ptr)//delete students' information
{
	char id[11];
	int i,j,flag=1;//用于检验学生是否存在 ,1学生不存在,0为学生已被删 
	scanf("%s",id);
	for(i=0;i<count;i++)
	{
		if(strcmp((ptr+i)->id,id)==0)
		{
			flag=0;
			for(j=i;j<count-1;j++)
			{
				*(ptr+j)=*(ptr+j+1);//会出现一样的  ? (解决方法即count--)
			} 
			count--; //关键,删除该学生后,学生个数应减少,不然最最后的ptr+j会和ptr+j+1一样
			printf("Delete success\n");
			break;	
		}
	}
	if(flag==1) printf("Students do not exist\n");
}
void faction3(struct stusys *ptr)//change students' information about grades.
{
	char id[11];
	int i,flag=1,num1,num2,num3;
	scanf("%s%d%d%d",id,&num1,&num2,&num3);
	for(i=0;i<count;i++)
	{
		if(strcmp((ptr+i)->id,id)==0)
		{
			flag=0; 
			(ptr+i)->math=num1;
			(ptr+i)->Eng=num2;
			(ptr+i)->com=num3;
			printf("Update success\n");
			break;	
		}
	}
	if(flag==1)//students don't exist
	printf("Students do not exist\n");
}
void faction4(struct stusys *ptr)//reveal students' average grade 
{
	char id[11];
	int i,flag=1;
	scanf("%s",id);
	for(i=0;i<count;i++)
	{
		if(strcmp((ptr+i)->id,id)==0)
		{
			flag=0; 
			float aver;
			aver=((ptr+i)->math+(ptr+i)->Eng+(ptr+i)->com)/3.0;
			printf("Student ID:%s\nName:%s\n",(ptr+i)->id,(ptr+i)->name);
			printf("Average Score:%.1f\n",aver);
			break;	
		}
	}
	if(flag==1)//students don't exist
	printf("Students do not exist\n");
}

在这里插入图片描述
ok,本学期计导实验完成,这俩代码以后可能会有用。(多么重要的偷懒方式

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值