| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1953 人关注过本帖
标题:C++初级编程的问题(一道难题)
只看楼主 加入收藏
a6162058
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-5-8
收藏
 问题点数:0 回复次数:17 
C++初级编程的问题(一道难题)

大题:用递归法将一个整数n转换成字符串。例如,输入483,应输出字符串“483”。n的位数不确定。

书上的答案是这样的:

#include<iostream>
using namespace std;
int main()
{
void convert(int n);
int number;
cout<<"input an integer:";
cin>>number;
cout<<"output:"<<endl;
if(number<0)
{
cout<<"-";
number=-number;
}
convert(number);
cout<<endl;
return 0;
}

void convert(int n)
{
int i;
char c;
if((i=n/10)!=0)
convert(i);
c=n%10+'0';
cout<<" "<<c;
}


问题:(1) c=n%10+'0'; 该句如何理解? +'0' 是什么意思?
(2)假如number=345,执行步骤就是
n=345 i=34
n=34 i=3
n=3 i=0
则n=34 c=…… 然后输出c
但是convert函数是如何实现“流程返回上一次函数调用处的”?返回到n=345??


[此贴子已经被作者于2006-5-8 22:10:08编辑过]

搜索更多相关主题的帖子: number 难题 int convert 
2006-05-08 22:09
刘半仙
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2006-2-11
收藏
得分:0 
c=n%10是把数字按位分离出来再加上'0'是让分离出的数字变成其对应字符串的ACSII码

2006-05-08 22:47
lbwxqh
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2006-4-12
收藏
得分:0 
楼主在哪看到的题目啊

楼主在哪看到的题目啊

[此贴子已经被作者于2006-5-8 22:54:22编辑过]

2006-05-08 22:51
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

如果没有c=n%10+'0';如果没有这句话输出的将不是你想要的结果,就拿你说的345来说,你想最开始输出3,但是输出的却是ACSII码为3的字符.所以必须用这句调整.
递归函数的调用,就是调用自身的函数,在输出c之前判断条件,若条件成立,则继续想下一层调用,直到条件不满足,开始返回.
这个过程实际是进栈出栈的过程.


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-09 01:50
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 

C++库函数可以直接做到,一行程序就可以了。
#include<iostream>
#include <sstream>
using namespace std;

int main()
{
int number;
stringstream ss;

cout<<"input an integer:";
cin>>number;

ss << number;
cout<<"output:"<< ss.str();
return 0;
}


http://myajax95./
2006-05-09 06:51
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
但是convert函数是如何实现“流程返回上一次函数调用处的”?返回到n=345?? (返回到经过一次处理后的)
通过他拉 if((i=n/10)!=0)(这句话意思是当I不是一个一位数时,条件成立)
convert(i);
楼主好象对%与/ 不是很了解
%是求余运算符 他把你给的数除以10,余下的数就是结果(你要是%3,结果就是0,1,2,中选一个多用于求范围数,例如彩票(INT%37)+1)
/简单的除号除10 但是当除完10剩下小数,因为你的数据类型是INT,所以小数被丢弃(大多用来把数最后位去掉)

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-05-09 12:07
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
c=n%10+'0'; 该句如何理解? +'0' 是什么意思?
字符'0'与其他'1','2','3'ASCII码差值正好是0与1,2,3的差值
这样,n%10后的余数 例如是3
3+'0'就是'3'了
这里'0'可以理解为'0'的ASCII码里面的位置,位置下移3位

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-05-09 12:12
a6162058
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-5-8
收藏
得分:0 

第一个问题我理解了,可第2个呢?
但是convert函数是如何实现“流程返回上一次函数调用处的”?返回到n=345??

2006-05-09 21:35
hulvbing
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-5-10
收藏
得分:0 
这个问题确实不好理解,楼主的意思可能是这样.第一次在c=n%10+'0'中的n是4,照理说函数应该就此结束了,因为后面没有任何支持循环的语句,但为何又继续输出8呢,而且接着输出了3,函数的这个循环是如何实现的??循环的终止条件是什么??
2006-05-10 13:24
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
if((i=n/10)!=0)
convert(i);
c=n%10+'0';
cout<<" "<<c;
因为第一次调用过程时
到了IF那里符合条件
则convert(i);
此时函数不再继续进行
而是又进入第二个convert(i);
此时剩下48(if((i=n/10)!=0)这里i已经是n处理完的后的)
又符合if条件
继续进入convert(i);
此时剩下4.不符合if条件
这时才执行c=n%10+'0';
cout<<" "<<c;
即第一个输出为4;
因为这个函数void 所以直接回到剩下48的那个地方
然后才往下执行c=n%10+'0';
cout<<" "<<c;
即为8
然后又回到第一次调用时483,c=n%10+'0';
cout<<" "<<c;
即为3;
我解释的够详细了吧
提醒楼主一下
大题:用递归法将一个整数n转换成字符串。例如,输入483,应输出字符串“483”。n的位数不确定。
这里不是输出字符串 是单个单个输出字符 你是char c

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-05-10 13:40
快速回复:C++初级编程的问题(一道难题)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018597 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved