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;
}