程序设计基础2020实验08-09:结构与链表
发布于 2021-01-05 12:10
代码仅供参考,有不足之处请指出。
01:按平均成绩排序
有n行数据。每行4个数据。第一个数据是一个字符串(字符串长度不超过10个字符,字符串中没有空格),代表同学的名字,接下来有3个整数,分别是数学,英语和程序设计课的成绩。
输入
第一行是一个整数n,表示以下会有n行。每行4个数据。第一个数据是一个字符串(字符串长度不超过10个字符),代表同学的名字,接下来有3个整数,分别是数学,英语和程序设计课的成绩。
输出
按平均成绩,从高到低输出同学们的名次和信息。每行输出一个同学的信息,每个数据之间以空格隔开。如果有几位同学平均成绩相等,则按原名单中的顺序输出(即平均成绩相等的同学,在原名单中先出现的应该先输出)。
样例输入
6
Mary 86 75 90
James 77 80 92
Nancy 80 85 78
John 67 89 95
Annie 90 92 83
Jack 91 80 85样例输出
1 Annie 90 92 83
2 Jack 91 80 85
3 Mary 86 75 90
4 John 67 89 95
5 James 77 80 92
6 Nancy 80 85 78
using namespace std;
typedef struct student{
string name;
int g1,g2,g3,sumGrade=0;
} Stu;
void readStu(Stu s[],int n)
{
for(int i=0;i<n;i++)
{
cin>>s[i].name>>s[i].g1>>s[i].g2>>s[i].g3;
s[i].sumGrade=s[i].g1+s[i].g2+s[i].g3;
}
}
void printStu(Stu s[],int n)
{
for(int i=0;i<n;i++)
cout<<i+1<<" "<<s[i].name<<" "<<s[i].g1<<" "<<s[i].g2<<" "<<s[i].g3<<endl;
}
bool insert(Stu s[],int n,Stu k)
{
for(int i=n-1;i>=0;i--)
{
if (s[i].sumGrade<k.sumGrade) s[i+1]=s[i];
else
{
s[i+1]=k;
return 1;
}
}
s[0]=k;
return 0;
}
void sortStu(Stu s[],int n)
{
for (int i=1;i<n;i++)
insert(s,i,s[i]);
}
int main()
{
Stu s[100];
int n;
cin>>n;
readStu(s,n);
sortStu(s,n);
printStu(s,n);
return 0;
}
02:生日相同
在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的学号,出生月日。试找出所有生日相同的学生。
输入
第一行为整数n,表示有n个学生,n<100。
此后每行包含一个字符串和两个整数,分别表示学生的学号(字符串长度小于10)和出生月(1<=m<=12)日(1<=d<=31)。
学号、月、日之间用一个空格分隔。输出
对每组生日相同的学生,输出一行,
其中前两个数字表示月和日,后面跟着所有在当天出生的学生的学号,数字、学号之间都用一个空格分隔。
对所有的输出,要求按日期从前到后的顺序输出。
对生日相同的学号,按输入的顺序输出。样例输入
5
00508192 3 2
00508153 4 5
00508172 3 2
00508023 4 5
00509122 4 5样例输出
3 2 00508192 00508172
4 5 00508153 00508023 00509122
using namespace std;
int a[13][32];
typedef struct student
{
string id;
int m,d;
} Stu;
void initD()
{
for(int i=0;i<13;i++)
for(int j=0;j<32;j++)
a[i][j]=0;
}
void readStu(Stu s[],int n)
{
for(int i=0;i<n;i++)
{
cin>>s[i].id>>s[i].m>>s[i].d;
a[s[i].m][s[i].d]++;
}
}
void printStu(Stu s[],int n,int m,int d)
{
cout<<m<<" "<<d<<" ";
for(int i=0;i<n;i++)
if(s[i].m==m&&s[i].d==d)
cout<<s[i].id<<" ";
cout<<endl;
}
int main()
{
int n;
cin>>n;
Stu s[200];
initD();
readStu(s,n);
for(int i=0;i<13;i++)
for(int j=0;j<32;j++)
if(a[i][j]>1)
printStu(s,n,i,j);
return 0;
}
03:约瑟夫问题
约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
输入
每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m,n <=300)。最后一行是:
0 0输出
对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号
样例输入
6 2
12 4
8 3
0 0样例输出
5
1
7
using namespace std;
typedef struct monky
{
int id;
struct monky *next=NULL;
} *Mon;
int readMon(Mon &head,int n)
{
head = new(monky);
Mon p=head;
p->id=1;
for(int i=2;i<=n;i++)
{
p->next=new(monky);
p=p->next;
p->id=i;
}
p->next=head;
}
void printMon(Mon head)
{
Mon p;
for(p=head;p->next!=head;p=p->next)
cout<<p->id<<" ";
cout<<p->id<<endl;
}
void delMon(Mon &head,int m)
{
Mon p=head;
while(p->next!=p)
{
for(int i=0;i<m-1;i++)
p=p->next;
p->id=p->next->id;
p->next=p->next->next;
}
head=p;
}
int main()
{
Mon head;
int m,n;
while(cin>>m>>n)
{
if(m==0&&n==0)
break;
readMon(head,m);
delMon(head,n);
cout<<head->id<<endl;
}
return 0;
}
网址:http://qdacm.openjudge.cn/
本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。
相关素材