程序设计入门C语言-念整数

这次的代码设计也不是很好,希望可以起到抛砖引玉的作用。

一、题目及要求

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(" ");//判断是否输出空格 当最后一位时不输出
		}
	}
}

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值