鱼C论坛

 找回密码
 立即注册
查看: 1216|回复: 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
样例解释:
输出中,第一行到第三行是第一天的部分;第四、五行是第二天的部分;第三天没有符合要求的市民;第六行是第四天的部分。最后两行按照出现顺序输出了可能存在身体不适的人员。

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

struct X
{
    char name[11];
    char sfz[21];
    char a;
    char time[5];
};


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

    for(int i = 0;i < d;i++)
    {
        int s,p;
        scanf("%d %d",&s,&p);
        struct X x[s];
        a[i] = x;
    }
  return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-31 08:20:26 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

@sfqxx
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

@sfqxx

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-31 18:39:08 | 显示全部楼层
输入格式复制进来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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[i] = (struct ApplyRecord *)malloc(s * sizeof(struct ApplyRecord));
for (int j = 0; j < s; j++) {
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);
}
}

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

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

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

return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[i])) {
            str[i] = tolower(str[i]);
        } else if (islower(str[i])) {
            str[i] = toupper(str[i]);
        }
    }
    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作答,但内容经过严格的审核流程,不会有错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-2 21:37:45 | 显示全部楼层
你输出了神马
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 05:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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