• C语言PTA练习题(期末考试成绩排名,新生舞会,约瑟夫游戏(序号+姓名+密码),排队点名)


    7-1 期末考试成绩排名

    期末考试结束了,数学成绩已经出来,数学老师请你帮忙编写一个程序,可以帮助老师对班级所有同学的考试分数按照由高到第低进行排序,并输出按照成绩排序后每个同学的学号、姓名、数学成绩。

    输入格式:

    第一行是一个整数n(n<=100),代表班级的总人数。

    接下来n行,每行有3个数据,第一个数据是某个同学的学号(整数),第二个数据是该同学的姓名的拼音(拼音不含空格,不超出20个字符),第三个数据是该同学的数学成绩(成绩是整数)

    输出格式:

    按照数学成绩由高到低输出每个同学的学号、姓名、数学成绩,每行含1个同学的3个数据,3个数据用空格隔开。(如果出现多个同学数学成绩相同,则按照学号由小到大输出,不存在多个同学学号相同的情况)。

    输入样例:

    在这里给出一组输入。例如:

    1. 3
    2. 1 zhangfang 98
    3. 2 liming 100
    4. 3 sunhua 99

    输出样例:

    在这里给出相应的输出。例如:

    1. 2 liming 100
    2. 3 sunhua 99
    3. 1 zhangfang 98
    1. #include
    2. #include
    3. #include
    4. // 定义学生结构体
    5. typedef struct {
    6. int id;
    7. char name[21];
    8. int score;
    9. } Student;
    10. // 比较函数,用于 qsort 排序
    11. int compare(const void *a, const void *b) {
    12. const Student *student1 = (const Student *)a;
    13. const Student *student2 = (const Student *)b;
    14. // 首先按照成绩降序排序,成绩相同时按照学号升序排序
    15. if (student1->score != student2->score) {
    16. return student2->score - student1->score;
    17. } else {
    18. return student1->id - student2->id;
    19. }
    20. }
    21. int main() {
    22. int n;
    23. scanf("%d", &n);
    24. // 分配动态内存来存储学生数组
    25. Student *students = (Student *)malloc(n * sizeof(Student));
    26. // 输入学生信息
    27. for (int i = 0; i < n; i++) {
    28. scanf("%d %s %d", &students[i].id, students[i].name, &students[i].score);
    29. }
    30. // 使用 qsort 函数对学生数组进行排序
    31. qsort(students, n, sizeof(Student), compare);
    32. // 输出排序后的学生信息
    33. for (int i = 0; i < n; i++) {
    34. printf("%d %s %d\n", students[i].id, students[i].name, students[i].score);
    35. }
    36. // 释放动态分配的内存
    37. free(students);
    38. return 0;
    39. }

    7-2 新生舞会

    新生舞会开始了。n名新生每人有三个属性:姓名、学号、性别。其中,姓名用长度不超过20的仅由大小写字母构成的字符串表示,学号用长度不超过10的 仅由数字构成的字符串表示,性别用一个大写字符‘F’或‘M’表示。任意两人的姓名、学号均互不相同。换言之,每个人可被其姓名或学号唯一确定。

    给出m对两人的信息(姓名或学号),判断他们是否能共舞。两人能共舞的充要条件为两人性别相异。

    输入格式:

    第一行一个整数n(2<=n<=1000),表示学生人数。接下来的n行每行依次包含一名新生的姓名、学号、性别,分别用一个空格隔开。

    之后的一行是一个整数m(1<=m<=1000),表示询问的数目。接着的m行每行包含两个信息(姓名或学号),保证两个信息不属于同一人,中间用一个空格隔开。

    输出格式:

    对于每个询问输出一行,如果两人可以共舞,输出一个大写字母‘Y’,否则输出一个大写字母‘N’。

    输入样例:

    在这里给出一组输入。例如:

    1. 4
    2. John 10 M
    3. Jack 11 M
    4. Kate 20 F
    5. Jim 21 M
    6. 3
    7. John 11
    8. 20 Jack
    9. Jim Jack

    输出样例:

    在这里给出相应的输出。例如:

    1. N
    2. Y
    3. N
    1. #include
    2. #include
    3. // 定义学生结构体
    4. typedef struct {
    5. char name[21];
    6. char id[11];
    7. char gender;
    8. } Student;
    9. int main() {
    10. int n;
    11. scanf("%d", &n);
    12. // 定义学生数组
    13. Student students[n];
    14. // 输入学生信息
    15. for (int i = 0; i < n; i++) {
    16. scanf("%s %s %c", students[i].name, students[i].id, &students[i].gender);
    17. }
    18. int m;
    19. scanf("%d", &m);
    20. // 处理每个询问
    21. for (int i = 0; i < m; i++) {
    22. char info1[21], info2[21];
    23. scanf("%s %s", info1, info2);
    24. char gender1, gender2;
    25. int found1 = 0, found2 = 0;
    26. // 查找第一个信息对应的学生的性别
    27. for (int j = 0; j < n; j++) {
    28. if ((strcmp(info1, students[j].name) == 0) || (strcmp(info1, students[j].id) == 0)) {
    29. gender1 = students[j].gender;
    30. found1 = 1;
    31. break;
    32. }
    33. }
    34. // 查找第二个信息对应的学生的性别
    35. for (int j = 0; j < n; j++) {
    36. if ((strcmp(info2, students[j].name) == 0) || (strcmp(info2, students[j].id) == 0)) {
    37. gender2 = students[j].gender;
    38. found2 = 1;
    39. break;
    40. }
    41. }
    42. // 判断两个学生是否能共舞
    43. if (found1 && found2) {
    44. if (gender1 != gender2) {
    45. printf("Y\n");
    46. } else {
    47. printf("N\n");
    48. }
    49. }
    50. }
    51. return 0;
    52. }

    7-3 约瑟夫游戏(序号+姓名+密码)

    编号为1、2、3、...、N的N个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。从指定编号为1的人开始,他的密码为M的初始值,按顺时针方向从1号自己开始顺序报数,报到指定数M时停止报数,报M的人出列,并将他的密码作为新的M值,从他在顺时针方向的下一个人开始,重新从1报数,报到M的人出列;出列人的密码作为下一轮报数的值。依此类推,直至所有的人全部出列为止。请设计一个程序求出出列的顺序,人数N及每个人的姓名、密码值从键盘输入。

    输入格式:

    输入2行。

    第1行为一个正整数N(2≤N≤30),表示参与游戏的人数。

    接下来N行,每行输入,游戏人的的姓名(英文字符,长度不超出20,无空格)和密码M(1≤M≤10)。

    第后一行输入开始游戏的初始密码。

    输出格式:

    按出列顺序依次输出所有游戏者的编号,用空格隔开。

    输入样例:

    在这里给出一组输入。例如:

    1. 4
    2. One 1
    3. Two 3
    4. Three 3
    5. Four 2
    6. 2

    输出样例:

    在这里给出相应的输出。例如:

    1. 2 Two
    2. 1 One
    3. 3 Three
    4. 4 Four
    1. #include
    2. #define N 40
    3. struct People{
    4. char name[20];
    5. int num;
    6. }peo[N];
    7. int con[N];
    8. int main()
    9. {
    10. int n;
    11. scanf("%d",&n);
    12. for(int i=1;i<=n;i++)
    13. {
    14. scanf("%s %d",peo[i].name,&peo[i].num);
    15. }
    16. int m;
    17. scanf("%d",&m);
    18. int count=1;
    19. int idex=1;
    20. while(count
    21. {
    22. for(int i=1;i<=n;i++)
    23. {
    24. if(con[i])
    25. {
    26. continue;
    27. }
    28. if(idex==m&&con[i]==0)
    29. {
    30. count++;
    31. idex=1;
    32. con[i]=1;
    33. printf("%d %s\n",i,peo[i].name);
    34. m=peo[i].num;
    35. }
    36. else if(con[i]==0)
    37. {
    38. idex++;
    39. }
    40. }
    41. }
    42. for(int i=1;i<=n;i++)
    43. {
    44. if(con[i]==0)
    45. {
    46. printf("%d %s\n",i,peo[i].name);
    47. }
    48. }
    49. return 0;
    50. }

    7-4 排队点名

    小X和他的同学们正在上体育课,一共有n位学生编号为1~n,他们已经在操场上排成了一列,这个时候体育老师来了,他觉得他们排成的队伍存在着一些瑕疵,于是按顺序进行了m次点名:

    每次点名会点到一个编号为bi的学生,于是这名学生就会出列并站到队伍的最前面(即最左端),原本在编号为bi前的学生会自动后退一个位置。然后在移动好的队伍上进行下一次点名。

    现在,给定初始队列和m次点名的编号,小X想知道点完名后队伍变成了什么样。

    输入格式:

    第一行一个整数n,表示学生的人数。

    第二行n个整数ai,表示学生的编号,保证ai为长度为n的排列。

    第三行一个整数m,表示点名的次数。

    第四行m个整数bi,表示每次点到的学生的编号。

    【数据范围及约定】

    1≤n,m≤10^5,1≤ai,bi≤n,且序列a为长度为n的排列。

    输出格式:

    一行n个整数,用空格隔开,表示点完名后的队伍(输出的最后不能有多余空格)。

    输入样例:

    在这里给出一组输入。例如:

    1. 6
    2. 6 5 4 3 2 1
    3. 4
    4. 2 4 2 5

    输出样例:

    在这里给出相应的输出。例如:

    5 2 4 6 3 1
    

    样例解释:

    一共4次点名,

    第一次点名点到2,队伍之后变成了2 6 5 4 3 1

    第二次点名点到4,队伍之后变成了4 2 6 5 3 1

    第三次点名点到2,队伍之后变成了2 4 6 5 3 1

    第四次点名点到5,队伍之后变成了5 2 4 6 3 1

    1. #include
    2. #define N 100050
    3. int list[N][2];
    4. int num[N];
    5. int list2[N];
    6. int main()
    7. {
    8. int n;
    9. scanf("%d",&n);
    10. for(int i=1;i<=n;i++)
    11. {
    12. int j;
    13. scanf("%d",&j);
    14. list[j][0]=1;
    15. list[j][1]=i;
    16. }
    17. int m;
    18. scanf("%d",&m);
    19. for(int i=1;i<=m;i++)
    20. {
    21. scanf("%d",&num[i]);
    22. }
    23. int count=0;
    24. for(int i=m;i>=1;i--)
    25. {
    26. if(list[num[i]][0])
    27. {
    28. list[num[i]][0]=0;
    29. printf("%d ",num[i]);
    30. count++;
    31. }
    32. }
    33. for(int i=1;i<=n;i++)
    34. {
    35. if(list[i][0])
    36. {
    37. list2[list[i][1]]=i;
    38. }
    39. }
    40. int count1=1;
    41. for(int i=1;i<=n;i++)
    42. {
    43. if(list2[i]&&count1
    44. {
    45. printf("%d ",list2[i]);
    46. count++;
    47. }
    48. else if(list2[i])
    49. {
    50. printf("%d\n",list2[i]);
    51. break;
    52. }
    53. }
    54. return 0;
    55. }

  • 相关阅读:
    java-net-php-python-jspm现代化社区去也管理系统计算机毕业设计程序
    关于线程池的常见问题
    jar解压修改后,如果再打成jar包
    Golang优雅之道
    【深度学习笔记】计算机视觉——FCN(全卷积网络
    数据治理之数据标准
    创建js对象的几种方式
    Java- 虚拟机学习总结
    组合电路、触发器、时序电路
    【c++】string类的函数模拟实现
  • 原文地址:https://blog.csdn.net/2301_79969279/article/details/139389572