如何在 C 中制作一个将 int 替换为 char(不使用 while/for)的程序?

How do I make a program that replaces int to char (without using while/for) in C?

我是编程新手,正在努力应对挑战。我想要做的是一个程序,它读取整数并 returns 它用“。”替换偶数。和带有“-”的奇数 (从单位开始,然后是十,然后是百和千。所以像 8878 这样的数字正在向后读取:8788)。

例如:

输入:

8878
2122
47

输出:

.-..
..-.
-.

我的两个问题如下:

如何让这段代码只转换位数。例如,我程序中的“47”返回“-...”而不是“-”。这是我的目标。

我怎样才能让这段代码在完成 10 个输入之前一直要求下一个输入(并且不使用 while/for)?

#include <stdio.h>

int main() {
int number;

scanf("%d", &number);

int unit = number % 10;
int ten = number / 10 % 10;
int hundred = number / 100 % 10;
int thousand = number / 1000 % 10;

char even = '.';
char odd = '-';

// unit

if (unit % 2 == 0) {
    printf("%c", even);
} else if (unit % 2 != 0) {
    printf("%c", odd);
} else {
    printf("");
}

// ten

if (ten % 2 == 0) {
    printf("%c", even);
} else if (ten % 2 != 0) {
    printf("%c", odd);
} else {
    printf("");
}

// hundred

if (hundred % 2 == 0) {
    printf("%c", even);
} else if (hundred % 2 != 0) {
    printf("%c", odd);
} else {
    printf("");
}

// thousand

if (thousand % 2 == 0) {
    printf("%c", even);
} else if (thousand % 2 != 0) {
    printf("%c", odd);
} else {
    printf("");
}

return 0;
}

在写代码之前,准确的分析一下需求可能会有所帮助。我们有:

  • 没有循环:好的,这是一个要使用递归的提示
  • 处理相反数的数字:好的,我们可以提取相反数的数字,方法是使用数字对10进行模数,然后将数字除以10
  • 显示 . 表示偶数,' 表示奇数:好的,最后一位是偶数,当且仅当数字是 - 是的,不需要模...
  • 我们将每行显示一个 processed 个数字:好的,在每个数字后写一个新行
  • 只处理正数:好的,我们将使用 unsigned int 类型

极端情况

一个 0 数字应该显示为 .,而它将是我们递归中的标记值:将处理拆分为一个将测试 0 值的外部函数和一个递归内部函数处理数字的函数。

现在编写 C 代码变得微不足道了:

#include <stdio.h>

// recursively discrimates even/odd digits
void do_describe(unsigned int n) {
    if (n == 0) return; // the sentinel aka the stop condition
    putchar(n % 2 ? '-' : '.');
    do_describe(n / 10);
}

// processes one number and displays it on its own line
void describe(unsigned int n) {
    // first the 0 corner case
    if (n == 0) {
        putchar('.');
    }
    else {
        do_describe(n);
    }
    putchar('\n');
}

int main() {
    // external loop: read integers one at a time
    for (;;) {
        unsigned int n;
        // stop when not a positive integer or on end of file
        if (scanf("%u", &n) != 1) break;
        describe(n);
    }
    return 0;
}

在上面的代码中,main 仍然包含一个循环,因为它在 C 中更惯用,比递归更 robust/efficient。但是很容易转化为递归函数:

int recursive_loop(unsigned int max) {
    unsigned int n;
    if (max == 0) return 0;   // again the stop condition for recursion
    if (1 != scanf("%u", &n)) return 0;
    describe(n);
    return recursive_loop(max - 1);
}

int main() {
    // external recursive loop: read at most 10 integers
    recursive_loop(10);
    return 0;
}