这次的代码设计也不是很好,希望可以起到抛砖引玉的作用。
一、题目及要求
1、题目
题目内容:
你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。
如输入1234,则输出:
yi er san si
注意,每个字的拼音之间有一个空格,但是最后的字后面没有空格。当遇到负数时,在输出的开头加上“fu”,如-2341输出为:
fu er san si yi
2、要求
输入格式:
一个整数,范围是[-100000,100000]。
输出格式:
表示这个整数的每一位数字的汉语拼音,每一位数字的拼音之间以空格分隔,末尾没有空格。
3、样例
输入样例:
-30
输出样例:
fu san ling
二、分析及代码
1、难点分析
1)如何对一个整数从左到右正序输出?
假设一个正整数的的位数是n,要取得其第一位数字,只需要整除该正整数数位的 10^(n-1) 次方。逐次计算就可以得到其从左到右正序输出的结果。
于是,又产生了两个问题,第一个问题是怎样设计代码,使得该正整数正序输出?第二个问题是 如何得到该正整数的位数?
对于第一个问题:假设该正整数是 1234 ,其数位为 4 。整除数位的 10^(n-1) 次方,得到第一位数字;对数位的 10^(n-1) 次方取模,可消减掉第一位数字。因此,得到以下代码。
#include <stdio.h>
#include <math.h>
int main(){
int number = 1234;
int count;// number的位数
for (count = 4; count!=0; count--){
// 调用 math 库的 pow 函数,计算number位数 10^(n-1) 次方
int p = pow(10,count-1);
int digit = number/p;
number %= p;
printf("%d ",digit);
}
}
对于第二个问题:取得该正整数的位数,只需设定一个 countDigit 函数,通过数数的方法,得到其数位。有以下代码。
//定义一个函数 帮助求得x的位数
int countDigits(int num){
int count;
//引入的num本质上是循环的判断条件 当num = 0时 循环结束
for (count=0; num>0; count++){
num /= 10;
}
return count;
}
2)如何实现拼音输出?
这个问题比较简单,只需要设置一个函数numStr,调用这个函数输出想要的拼音结果即可。需要注意的是,在设置函数类型的时候选择void类型。
3)如何满足输出要求的格式?
只需要对所有非最后一项加上空格即可,由于最后一项时 p 会小于10,所以利用其进行条件判断。具体代码如下(p 变量是1 中number数位的 10^(n-1)次方)。
if (p>9){//用p判断 因为number的值可能为0
printf(" ");//判断是否输出空格 当最后一位时不输出
}
4)处理代码中无法实现的一些特殊值。
首先,是当数值为负数时的处理方式,仅需要此时调用 numStr 函数中设定的特殊值(-1);进行输出后,再将数值转化为其相反数即可。
其次,对于数值为0时的问题,由于在 countDigits 函数设定的循环条件为 num > 0,因此,利用一个if 判断 手动设定 count 的数值,最后 goto out 语句跳过循环即可。
二、代码设计
最终的代码设计如下:
#include <stdio.h>
#include <math.h>
//读拼音 输入一个数字 从左到右读出其中的内容
//定义一个函数 帮助求得x的位数
int countDigits(int num){
int count;
if (num == 0){
count = 1;
goto out;
}
for (count=0; num>0; count++){
num /= 10;
}
out:
return count;
}
//拼音输出
void numStr(int n){
switch (n){
case -1: printf("fu"); break;
case 0: printf("ling"); break;
case 1: printf("yi"); break;
case 2: printf("er"); break;
case 3: printf("san"); break;
case 4: printf("si"); break;
case 5: printf("wu"); break;
case 6: printf("lv"); break;
case 7: printf("qi"); break;
case 8: printf("ba"); break;
case 9: printf("jiu"); break;
}
}
int main(){
int number;
scanf("%d",&number);
//处理number为负数的情况
if (number < 0) {
number = -number;
numStr(-1);
printf(" ");
}
int count;
for (count = countDigits(number); count!=0; count--){
int p = pow(10,count-1);
int digit = number/p;
number %= p;
//输出部分
numStr(digit);
if (p>9){//用p判断 因为x的值可能为0
printf(" ");//判断是否输出空格 当最后一位时不输出
}
}
}