如何通过循环对比出生年月日判断三人中最年轻者?C语言person结构体实现
代码修正方案
原有代码核心问题
- C语言不支持
a > b > c连续比较语法,该写法实际会先计算a>b得到0/1的布尔值,再和c比较,逻辑完全错误 - 大于等于运算符应为
>=,不是=> - 结构体定义中无
lastname字段,且用%d格式符输出字符串类型的name属于类型不匹配,会触发运行错误 - 函数未定义返回值类型,无return语句,无法接收执行结果
- 未使用循环逻辑,硬编码分支冗余度极高,易出错且扩展性差
修正后完整可运行代码
#include <stdio.h> #include <string.h> // 补全person结构体定义,你原有代码中遗漏的lastname可按需调整 typedef struct { char name[50]; char lastname[50]; // 匹配原有打印逻辑补充的字段 char day; char month; int year; } person; // 函数返回最年轻人员在数组中的下标,cnt参数为人员数量,支持扩展到3人以上场景 int the_youngest(person s[], int cnt) { if (cnt <= 0) return -1; int youngest_idx = 0; // 循环遍历对比所有人员 for (int i = 1; i < cnt; i++) { person *cur = &s[i]; person *y = &s[youngest_idx]; // 优先对比出生年:出生年越大年龄越小 if (cur->year > y->year) { youngest_idx = i; continue; } // 年相同对比出生月 if (cur->year == y->year) { if (cur->month > y->month) { youngest_idx = i; continue; } // 月相同对比出生日 if (cur->month == y->month) { if (cur->day > y->day) { youngest_idx = i; continue; } } } } return youngest_idx; } int main() { // 测试用3个人员数据,可按需修改 person s[3] = { {"张三", "三", 10, 5, 2000}, {"李四", "四", 20, 3, 2001}, {"王五", "五", 5, 12, 2001} }; // 调用函数,传入人员数组和数量3 int o = the_youngest(s, 3); if (o < 0) { printf("人员数据为空\n"); return 0; } // 同龄判断逻辑,匹配原有无法确定唯一最年轻者的需求 int same_cnt = 0; for (int i = 0; i < 3; i++) { if (s[i].year == s[o].year && s[i].month == s[o].month && s[i].day == s[o].day) { same_cnt++; } } if (same_cnt > 1) { printf("It isn't possible to decide, who's the youngest\n"); } else { printf("%s %s is the youngest\n", s[o].name, s[o].lastname); } return 0; }
逻辑说明
- 循环逻辑默认第一个人为初始最年轻者,依次和后续所有人员对比,实时更新最年轻者下标,完全符合你的实现要求
- 无需硬编码大量判断分支,可直接扩展到3人以上的人员查找场景,仅需要修改传入的cnt参数即可
- 补充了同龄重叠判断逻辑,匹配你原有代码中无法确定唯一最年轻者的输出要求
内容的提问来源于stack exchange,提问作者Mira0002
相关产品推荐
相关产品推荐

