51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1350|回复: 6
打印 上一主题 下一主题

PCL老师,有关程序问题请进

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2006-7-27 16:58:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
8进制转换函数:
#include <iostream.h>
#include <stdio.h>
#include <math.h>
int main()
{
        char *p;
                char s[6];
                int n;
                p=s;
                cout<<"enter you want num to change !"<<endl;
                //printf("enter you want num to change!");
                gets(p);
                n=0;
                while ((*(p)!='\0'))
                {
                        n=n*8+*p-'0';
                        p++;
                }
                cout<<"the num is "<<n<<endl;
                //printf("%d",n);
                return 0;
}
里面的n=n*8+*p-'0';是什么意思?为什么用到'0'?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2006-7-27 19:29:24 | 只看该作者
因为 s[6]数组是char型, n是int型,当求n=n*8+*p-‘0’时,*p所指的是字符,以其ASCII值带入式子计算
举例:
实际计算中当输入八进制数10时,
第一次循环中 如不加-‘0’,则n=n*8+*p执行后 n的值变为49,即1的ASCII值,加上-‘0’ 后n=1的ASCII值-0的ASCII值=49-48=1,等于实际值;
同理第二次循环后,n=1*8+'0'-'0'=8+0的ASCII值-0的ASCII值=8,等于实际值;
而不加-‘0’后输出值变为440,即n=49*8+48=440。

[ 本帖最后由 夏晓雨 于 2006-7-27 19:38 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2006-7-27 20:32:21 | 只看该作者
首先非常感谢老乡的答复,害您多费脑力了
这个函数有问题
其实想问的是问题出在哪里,输入大于10的16进制字母时这段函数自动跳出,实在想不明白问题出在哪里。
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2006-7-27 22:21:06 | 只看该作者
你是说象如果输入 ‘A'就跳出?
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2006-7-28 01:27:58 | 只看该作者
复制下来研究一下...
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2006-7-29 20:35:47 | 只看该作者
我调试了一下,没跳出啊!
回复 支持 反对

使用道具 举报

该用户从未签到

7#
发表于 2006-7-30 20:47:58 | 只看该作者

测试还是调试?

程序是8进制转换为10进制吗?程序至少是不严密的。输入输出的范围?都是正数?
看程序应限制输入为8进制5位正数。一旦超过5位就溢出了。
输入后应先检查是否8进制。在(0~7)之间,不然出错是必然的,不出错是偶然的。
如果是测试程序输入非86进制,超长,负数,跳出是完全可能的。

试改如下:
//正8进制转换10进制函数:
#include <iostream.h>
#include <stdio.h>
#include <math.h>
int main()
{
        char *p;
                char s[6];
                int n;
                p=s;
                cout<<"enter you want num to change !(请输入需转换数(最多5位8进制正数,例如76512)"<<endl;
                //printf("enter you want num to change!");
                gets(p);
                n=0;
                s[5]=0;//强制截断5位;
                while ((*(p)!='\0'))
                {
                       if((*p)<'0')||(*p)>'7')      //看是否8进制
                       {
                                   cout<<"输入的不是8进制正数 ,程序结束"<<n<<endl;
                                   return(1);
                       }
                        n=n*8+*p-'0';
                        p++;
                }
                cout<<"the num is "<<n<<endl;
                //printf("%d",n);
                return 0;
}
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-18 22:44 , Processed in 0.064316 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表