文章目录
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,本学期计导实验完成,这俩代码以后可能会有用。(多么重要的偷懒方式