程序设计基础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
#include<iostream>#include<stdio.h>#include<sstream>#include<string.h>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
#include <iostream>#include<stdio.h>#include<cstring>#include<cmath>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
#include <iostream>#include<stdio.h>#include<cstring>#include<cmath>#include<sstream>#include<algorithm>#include <iomanip>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 我们将第一时间删除。

相关素材