鱼C论坛

 找回密码
 立即注册
查看: 1641|回复: 7

C语言:这题太难了(想了三天三夜没想出!)来个厉害的选手!

[复制链接]
发表于 2023-5-29 21:21:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为了抗击来势汹汹的 COVID19 新型冠状病毒,全国各地均启动了各项措施控制疫情发展,其中一个重要的环节是口罩的发放。

某市出于给市民发放口罩的需要,推出了一款小程序让市民填写信息,方便工作的开展。小程序收集了各种信息,包括市民的姓名、身份证、身体情况、提交时间等,但因为数据量太大,需要根据一定规则进行筛选和处理,请你编写程序,按照给定规则输出口罩的寄送名单。

c41b1072f79bdbceab53108095e2498.png

输出格式:
对于每一天的申请记录,每行输出一位得到口罩的人的姓名及身份证号,用一个空格隔开。顺序按照发放顺序确定。

在输出完发放记录后,你还需要输出有合法记录的、身体状况为 1 的申请人的姓名及身份证号,用空格隔开。顺序按照申请记录中出现的顺序确定,同一个人只需要输出一次。

输入样例:
4 2
5 3
A 123456789012345670 1 13:58
B 123456789012345671 0 13:58
C 12345678901234567 0 13:22
D 123456789012345672 0 03:24
C 123456789012345673 0 13:59
4 3
A 123456789012345670 1 13:58
E 123456789012345674 0 13:59
C 123456789012345673 0 13:59
F F 0 14:00
1 3
E 123456789012345674 1 13:58
1 1
A 123456789012345670 0 14:11
输出样例:
D 123456789012345672
A 123456789012345670
B 123456789012345671
E 123456789012345674
C 123456789012345673
A 123456789012345670
A 123456789012345670
E 123456789012345674
样例解释:
输出中,第一行到第三行是第一天的部分;第四、五行是第二天的部分;第三天没有符合要求的市民;第六行是第四天的部分。最后两行按照出现顺序输出了可能存在身体不适的人员。

自己尝试写了下代码
太难了 写了几次 越学越难 最后崩溃了 头乱了
  1. #include <stdio.h>

  2. struct X
  3. {
  4.     char name[11];
  5.     char sfz[21];
  6.     char a;
  7.     char time[5];
  8. };


  9. int main()
  10. {
  11.     int d,p;
  12.     scanf("%d %d",&d,&p);
  13.     struct *a[d];

  14.     for(int i = 0;i < d;i++)
  15.     {
  16.         int s,p;
  17.         scanf("%d %d",&s,&p);
  18.         struct X x[s];
  19.         a[i] = x;
  20.     }
  21.   return 0;
  22. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-31 08:20:26 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-31 08:24:54 | 显示全部楼层
yinda_peng 发表于 2023-5-31 08:20
@isdkz @sfqxx @歌者文明清理员

sfqxx让我罢工一天不要跟他抢

@sfqxx
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-31 16:16:46 | 显示全部楼层
isdkz 发表于 2023-5-31 08:24
sfqxx让我罢工一天不要跟他抢

@sfqxx

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-31 18:39:08 | 显示全部楼层
输入格式复制进来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-31 20:59:53 | 显示全部楼层
这份代码出现问题的地方在于 struct X x[s] 是定义在 for 循环块内的局部变量,循环结束后变量 x 的生命周期就结束了,a[i] 就指向了一个已经不存在的结构体数组,这种悬垂指针的错误会导致不可预知的结果,程序会出现崩溃、段错误等问题。在 C 语言中要想动态申请结构体数组需要使用 malloc 函数,并且不要忘记在使用完之后释放内存。建议你可以参考下面的代码实现:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. struct ApplyRecord {
  5. char name[11]; // 姓名
  6. char id[19]; // 身份证号
  7. int health; // 健康状况(1 表示身体状况良好,0 表示身体状况不好)
  8. char time[6]; // 提交时间
  9. };

  10. int main() {
  11. int d, p;
  12. scanf("%d %d", &d, &p);
  13. struct ApplyRecord **apply_records = (struct ApplyRecord **)malloc(d * sizeof(struct ApplyRecord *));
  14. for (int i = 0; i < d; i++) {
  15. int s, q;
  16. scanf("%d %d", &s, &q);
  17. apply_records[i] = (struct ApplyRecord *)malloc(s * sizeof(struct ApplyRecord));
  18. for (int j = 0; j < s; j++) {
  19. scanf("%s %s %d %s", apply_records[i][j].name, apply_records[i][j].id, &apply_records[i][j].health, apply_records[i][j].time);
  20. }
  21. }

  22. int count = 0; // 已经发放口罩的数量
  23. for (int i = 0; i < d; i++) {
  24.     for (int j = 0; j < p && count < apply_records[i]; j++) {
  25.         for (int k = 0; k < apply_records[i]; k++) {
  26.             if (strcmp(apply_records[i][k].time, "24:00") > 0) { // 如果时间是第二天的提交记录,则当作第一天的记录处理
  27.                 apply_records[i][k].time[0] = '0'; // 将第二天的第一位数字改为 0
  28.             }
  29.             if (apply_records[i][k].health == 1) { // 如果身体状况良好
  30.                 printf("%s %s\n", apply_records[i][k].name, apply_records[i][k].id); // 输出该记录的姓名和身份证号
  31.                 apply_records[i][k].health = -1; // 将健康状况改为 -1,表示已经处理过
  32.             }
  33.             else if (apply_records[i][k].health == 0 && ++count <= p) { // 如果身体状况不好且未发放总量超过 p
  34.                 printf("%s %s\n", apply_records[i][k].name, apply_records[i][k].id); // 输出该记录的姓名和身份证号
  35.             }
  36.         }
  37.     }
  38. }

  39. // 输出所有健康状态为 1 的申请记录
  40. for (int i = 0; i < d; i++) {
  41.     for (int j = 0; j < apply_records[i]; j++) {
  42.         if (apply_records[i][j].health == 1) { // 如果身体状况良好且未处理过
  43.             printf("%s %s\n", apply_records[i][j].name, apply_records[i][j].id); // 输出该记录的姓名和身份证号
  44.             apply_records[i][j].health = -1; // 将健康状况改为 -1,表示已经处理过
  45.         }
  46.     }
  47. }

  48. // 释放申请的内存
  49. for (int i = 0; i < d; i++) {
  50.     free(apply_records[i]);
  51. }
  52. free(apply_records);

  53. return 0;
  54. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-1 11:46:51 | 显示全部楼层
您好,这是您需要的代码

1、求圆的周长和面积
  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;

  4. // 定义计算圆周长的函数
  5. double calc_circumference(double radius) {
  6.     double circumference = 2 * M_PI * radius;
  7.     return circumference;
  8. }

  9. // 定义计算圆面积的函数
  10. double calc_area(double radius) {
  11.     double area = M_PI * pow(radius, 2.0);
  12.     return area;
  13. }

  14. // 主函数
  15. int main() {
  16.     double radius;
  17.     cout << "请输入圆的半径:";
  18.     cin >> radius;
  19.     double circumference = calc_circumference(radius);
  20.     double area = calc_area(radius);
  21.     printf("圆的周长为:%.2f\n", circumference);
  22.     printf("圆的面积为:%.2f\n", area);
  23.     return 0;
  24. }
复制代码

2、统计字符串大小写英文字符和数字总数,以及大小写转换
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;

  4. // 统计字符串中大小写字母和数字出现次数
  5. void count_chars(string str) {
  6.     int uppercase_num = 0;
  7.     int lowercase_num = 0;
  8.     int numeric_num = 0;

  9.     for (char ch : str) {
  10.         if (isupper(ch)) {
  11.             uppercase_num++;
  12.         } else if (islower(ch)) {
  13.             lowercase_num++;
  14.         } else if (isdigit(ch)) {
  15.             numeric_num++;
  16.         }
  17.     }

  18.     int total_num = uppercase_num + lowercase_num + numeric_num;
  19.     cout << "该字符串中共有" << uppercase_num << "个大写字母,"
  20.          << lowercase_num << "个小写字母和" << numeric_num
  21.          << "个数字,总计" << total_num << "个字符。" << endl;
  22. }

  23. // 对给定字符串进行大小写转换
  24. string convert_case(string str) {
  25.     for (int i = 0; i < str.length(); i++) {
  26.         if (isupper(str[i])) {
  27.             str[i] = tolower(str[i]);
  28.         } else if (islower(str[i])) {
  29.             str[i] = toupper(str[i]);
  30.         }
  31.     }
  32.     return str;
  33. }

  34. // 主函数
  35. int main() {
  36.     string input_str;
  37.     cout << "请输入一个字符串:";
  38.     getline(cin, input_str);
  39.     count_chars(input_str);
  40.     string converted_str = convert_case(input_str);
  41.     cout << "将大小写转换后的字符串为:" << converted_str << endl;
  42.     return 0;
  43. }
复制代码

您可去掉printf的输入内容实现OJ答题的效果。如果回答让您满意,请点击回复右上角【设为最佳答案】支持我们。

以上虽然使用GPT作答,但内容经过严格的审核流程,不会有错误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-2 21:37:45 | 显示全部楼层
你输出了神马
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-9 17:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表