如何在 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
输出:
.-..
..-.
-.
我的两个问题如下:
1° 如何让这段代码只转换位数。例如,我程序中的“47”返回“-...”而不是“-”。这是我的目标。
2° 我怎样才能让这段代码在完成 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;
}
我是编程新手,正在努力应对挑战。我想要做的是一个程序,它读取整数并 returns 它用“。”替换偶数。和带有“-”的奇数 (从单位开始,然后是十,然后是百和千。所以像 8878 这样的数字正在向后读取:8788)。
例如:
输入:
8878
2122
47
输出:
.-..
..-.
-.
我的两个问题如下:
1° 如何让这段代码只转换位数。例如,我程序中的“47”返回“-...”而不是“-”。这是我的目标。
2° 我怎样才能让这段代码在完成 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;
}