a905448839 发表于 2023-5-29 21:21:12

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

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

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



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

在输出完发放记录后,你还需要输出有合法记录的、身体状况为 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
样例解释:
输出中,第一行到第三行是第一天的部分;第四、五行是第二天的部分;第三天没有符合要求的市民;第六行是第四天的部分。最后两行按照出现顺序输出了可能存在身体不适的人员。

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

struct X
{
    char name;
    char sfz;
    char a;
    char time;
};


int main()
{
    int d,p;
    scanf("%d %d",&d,&p);
    struct *a;

    for(int i = 0;i < d;i++)
    {
      int s,p;
      scanf("%d %d",&s,&p);
      struct X x;
      a = x;
    }
return 0;
}

yinda_peng 发表于 2023-5-31 08:20:26

@isdkz @sfqxx @歌者文明清理员

isdkz 发表于 2023-5-31 08:24:54

yinda_peng 发表于 2023-5-31 08:20
@isdkz @sfqxx @歌者文明清理员

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

@sfqxx

sfqxx 发表于 2023-5-31 16:16:46

isdkz 发表于 2023-5-31 08:24
sfqxx让我罢工一天不要跟他抢

@sfqxx

{:5_109:}

歌者文明清理员 发表于 2023-5-31 18:39:08

输入格式复制进来

歌者文明清理员 发表于 2023-5-31 20:59:53

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct ApplyRecord {
char name; // 姓名
char id; // 身份证号
int health; // 健康状况(1 表示身体状况良好,0 表示身体状况不好)
char time; // 提交时间
};

int main() {
int d, p;
scanf("%d %d", &d, &p);
struct ApplyRecord **apply_records = (struct ApplyRecord **)malloc(d * sizeof(struct ApplyRecord *));
for (int i = 0; i < d; i++) {
int s, q;
scanf("%d %d", &s, &q);
apply_records = (struct ApplyRecord *)malloc(s * sizeof(struct ApplyRecord));
for (int j = 0; j < s; j++) {
scanf("%s %s %d %s", apply_records.name, apply_records.id, &apply_records.health, apply_records.time);
}
}

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

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

// 释放申请的内存
for (int i = 0; i < d; i++) {
    free(apply_records);
}
free(apply_records);

return 0;
}

高山 发表于 2023-6-1 11:46:51

您好,这是您需要的代码

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

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

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

// 主函数
int main() {
    double radius;
    cout << "请输入圆的半径:";
    cin >> radius;
    double circumference = calc_circumference(radius);
    double area = calc_area(radius);
    printf("圆的周长为:%.2f\n", circumference);
    printf("圆的面积为:%.2f\n", area);
    return 0;
}

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

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

    for (char ch : str) {
      if (isupper(ch)) {
            uppercase_num++;
      } else if (islower(ch)) {
            lowercase_num++;
      } else if (isdigit(ch)) {
            numeric_num++;
      }
    }

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

// 对给定字符串进行大小写转换
string convert_case(string str) {
    for (int i = 0; i < str.length(); i++) {
      if (isupper(str)) {
            str = tolower(str);
      } else if (islower(str)) {
            str = toupper(str);
      }
    }
    return str;
}

// 主函数
int main() {
    string input_str;
    cout << "请输入一个字符串:";
    getline(cin, input_str);
    count_chars(input_str);
    string converted_str = convert_case(input_str);
    cout << "将大小写转换后的字符串为:" << converted_str << endl;
    return 0;
}

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

以上虽然使用GPT作答,但内容经过严格的审核流程,不会有错误

zhangjinxuan 发表于 2023-6-2 21:37:45

你输出了神马
页: [1]
查看完整版本: C语言:这题太难了(想了三天三夜没想出!)来个厉害的选手!