C语言每日一题——第一天
第一天
题目
小明想要给他的朋友写一个生日祝福程序,在运行时,会根据输入的日期输出不同的结果。
若在平时运行程序(例如9月28日):
执行:$ main.exe I \\
输出:
09-28 :
+3?-15
而在朋友生日(12月13日)当天:
执行:$ main.exe L M
输出:
12-13 :
% % % % % % % % %
% 4bd %
% ^ ^ %
% |------| %
% +------+ %
% +--------+ %
% % % % % % % % % Happy birthday LM!
输入
程序通过命令行参数输入获取参数,参数格式为月份 日期
。
为了方便输入,将数字统一移动64个,即 ASSCII 码表为 65 的符号(即A
)代表数字1。
输出
在输出中,第一行为月份-日期
,其中若月份或日期不为两位数,则在左侧用0补齐两位。
非生日日期时,在第一行后输出 生日月份 与 当前月份 数字之差,和 生日日期 与 当前日期 数字之差,并强制显示正负号,两个数字间以问好为分隔。
生日日期时,在第一行后输出如上图所示的字符画,且包含按十六进制表示的月份日期
生日日期(即示例中的4bd
, 它是十六进制的1213
)。
关键
printf
的序列化写法,字符本身是数字。
提示
CLion 可以在运行时自动输入命令行参数,点击位于在开发界面的右上角的调试设置,选择“编辑配置”
在配置框中的“程序实参”填入要输入的参数,多个参数间用空格分隔。如同所示,该配置将在运行时将额外传递两个参数I
和[
给程序。
解答
#include <stdio.h>
#include <iso646.h>
#define BIRTHDAY_DATE_MONTH 12
#define BIRTHDAY_DATE_DAY 13
int main(int cnt, char **argv) {
int day, month;
// 获取输入的日期
if (cnt != 3) {
// 第一个参数是获得的参数数量, 若数量不正确, 说明输入错误, 这时程序打印错误停止运行, 返回 -1
printf("Input value error!\n");
// 函数在运行到 return 后便会退出, 不会运行之后的代码
return -1;
}
// 获取“真正的”月份和日期
month = ((int) *argv[1]) - 64;
day = ((int) *argv[2]) - 64;
// 打印第一行
printf("%02d-%02d :\n", month, day);
// 判断是否是生日
if (day == BIRTHDAY_DATE_DAY and month == BIRTHDAY_DATE_MONTH) {
// 是生日
printf("%% %% %% %% %% %% %% %% %%\n");
printf("%% %03x %%\n", BIRTHDAY_DATE_MONTH * 100 + BIRTHDAY_DATE_DAY);
printf("%% ^ ^ %%\n");
printf("%% +------+ %%\n");
printf("%% +------+ %%\n");
printf("%% +--------+ %%\n");
printf("%% %% %% %% %% %% %% %% %% Happy birthday %c%c!\n", *argv[1], *argv[2]);
} else {
// 不是生日
printf("%+d?%+d\n", BIRTHDAY_DATE_MONTH - month, BIRTHDAY_DATE_DAY - day);
}
return 0;
}
杂谈
本题同时涉及到了C程序的一些代码风格。例如,将标准库引用放到最前面,下面是宏定义,变量声明放在函数第一行,以及前大括号不换行,iso646.h
的适当使用等等。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)