首页 > 其他分享 >C语言每日一题——第七天

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

时间:2022-10-04 11:24:21浏览次数:44  
标签:int max 每日 times char printf 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;
}

标签:int,max,每日,times,char,printf,C语言,输入,第七天
From: https://www.cnblogs.com/tobe-goodlearner/p/basic_C_programming-day_7.html

相关文章

  • 一点C语言补充知识
    1C知识点1.1传值传指针传引用传值不能改变实参的值,传指针传引用能改变实参值传指针中形参是实参的副本,不能够改变实参的值,但能够通过指针改变对应地址的内容传引用......
  • 数据结构与算法分析——C语言描述(第9章 图论算法)*
    目录9.1若干定义图的表示9.1若干定义一个图(graph)\(G=(V,E)\)由顶点(vertex)的集\(V\)和边(edge)/弧(arc)的集\(E\)组成。每一条边就是一幅点对\((v,w)\),其中\(v,......
  • 数据结构与算法分析——C语言描述(第5章 散列)
    目录5.1一般想法5.2散列函数5.3分离链接法(separatechaining)5.4开放定址法(openaddressing)本章讨论散列表(hashtable)ADT,不过它只支持二叉查找树所允许的一部分......
  • 【C语言_13】多维数组
    1.什么是多维数组?   C语言中的多维数组(multidimensionalarray)其实就是使用数组作为数组的元素。n维数组的元素是n-1维数组。例如,二维数组的每个元素都是一维数......
  • C语言——数据的存储(总结)
    一.数据类型    基本类型    打印类型所占大小(字节)char     字符型    %c  1short    短整型    %d    2int ......
  • C语言与汇编
    C变量C语言是如何把各种类型的变量转换成对应的汇编语言呢?高级语言更容易被工程师理解,而汇编语言这样的低级语言,则更容易被机器解读。这是因为汇编语言里的大部分内容都......
  • C语言入门—明明的随机数
    题目描述明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的......
  • 每日一结
    剑指Offer26.树的子结构判断一棵树是否是另一棵树的子结构,注意子结构与子树的区别子结构不能只利用根节点进行对称性递归,需要构造辅助函数,判断当两棵树根节点值相同时......
  • 【C语言】经典猜数字游戏
    ​​#include<stdio.h>​​​​#include<stdlib.h>​​​​#include<time.h>​​​​voidmenu()​​​​{​​​​printf("**********\n");​​​​printf("*****......
  • 专升本C语言笔记-2022-10-2
    变量名命名规则:1.变量名只能是英文字母(A-Z,a-z)和数字(0-9)或者下划线(_)组成。               2.第一个字母必须是字母或者下划线开头。 ......