C语言每日一题——第七天

第七天

小明在最近的学习中了解到了函数。他决定利用函数递归的特性实现不定长文本的输出。

程序具有交互式设计。首先通过命令行参数获取最大输入次数;程序运行时,打印与已获取输入的次数相同的空格,之后打印冒号,并获取输入字符。若达到“最大输入次数”或输入字符为q,终止输入;否则重复打印并继续获取输入。结束输入后,打印输入的镜像内容。

运行:main.exe D

输出:

:1
 :2
  :3
   :4
   :4
  :3
 :2
:1

注:前四个数字为输入内容,由于达到最大输入次数,停止输入,并打印了输入时的镜像内容。

运行:main.exe Z

输出:

:a
 :2
  :C
   :q
   :q
  :C
 :2
:a

注:输入了q,停止继续输入。

输入

程序通过命令行参数输入获取参数,参数格式为最大输入次数

为了方便输入,将数字统一移动64个,即 ASSCII 码表为 65 的符号(即A)代表数字1。

输出

见上文。

提示

由于scanf对换行符的处理方法,我们需要单独处理换行符。请使用:

scanf("%c", &the_char);
getchar()

scanf("\n%c", &the_char);

获取正确的字符。

关键

函数与递归的应用


解答

首先是递归函数解法:

#include <stdio.h>


void printer(int, int);


int main(int cnt, char **argv) {
    int max_times;

    if (cnt != 2) {
        printf("Input value error!\n");
        return -1;
    }

    max_times = (*argv[1]) - 'A' + 1;

    printer(max_times, 0);

    return 0;
}


/**
 * @brief            打印函数。递归执行获取和打印
 * @param max_times: 最大输入次数
 * @param times:     以获取输入的次数
 */
void printer(int max_times, int times) {
    int i;
    char print_char;

    // 检查是否继续运算
    if (times >= max_times) {
        return;
    }
    // 打印符号
    for (i = 0; i < times; i++) {
        printf(" ");
    }
    printf(":");
    // 获取字符
    scanf("%c", &print_char);
    getchar();

    // 判断是否递归
    if (print_char != 'q') {
        printer(max_times, times + 1);
    }

    // 第二次打印符号,结束递归时运行
    for (i = 0; i < times; i++) {
        printf(" ");
    }
    printf(":%c\n", print_char);
}

由于编译器并不建议我们使用递归,且递归确实存在占用内存大、易造成溢出等风险,我们也可以使用数组来实现:

#include <stdio.h>


#define MAX_TIMES 100


int main(int cnt, char **argv) {
    int max_times, i, j;
    char char_array[MAX_TIMES];

    if (cnt != 2) {
        printf("Input value error!\n");
        return -1;
    }

    max_times = (*argv[1]) - 'A' + 1;

    // 手动检查是否超过最大输入次数
    if (max_times > MAX_TIMES - 1) {
        printf("The `max_times` too large!\n");
        return -2;
    }

    for (i = 0; i < max_times; i++) {
        // 打印
        for (j=0; j < i; j++) {
            printf(" ");
        }
        printf(":");

        // 获取输入
        scanf("%c", &char_array[i]);
        getchar();

        // 检查输入
        if (char_array[i] == 'q') {
            break;
        }
    }

    // 打印"尾巴"
    for (i--; i >= 0; i--) {
        for (j=0; j < i; j++) {
            printf(" ");
        }
        printf(":%c\n", char_array[i]);
    }

    return 0;
}
posted @ 2022-10-04 11:06  风吹云动  阅读(132)  评论(0编辑  收藏  举报