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 可以在运行时自动输入命令行参数,点击位于在开发界面的右上角的调试设置,选择“编辑配置”

CLion命令行参数设置_1

在配置框中的“程序实参”填入要输入的参数,多个参数间用空格分隔。如同所示,该配置将在运行时将额外传递两个参数I[给程序。

CLion 程序执行参数配置 2


解答

#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的适当使用等等。

posted @ 2022-09-27 21:33  风吹云动  阅读(289)  评论(0编辑  收藏  举报