| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1574 人关注过本帖
标题:大家帮帮忙,还是不明白
取消只看楼主 加入收藏
zqmillet
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:108
注 册:2008-7-20
结帖率:100%
收藏
 问题点数:0 回复次数:8 
大家帮帮忙,还是不明白
稍稍改了一下:发现输入分数时函数bd的返回值不是0,而是根据分子来决定返回值。
而单独使用bd函数却没有这个问题,请问这是什么原因啊?
bd这个函数的返回值好像经过bd函数被另一个函数调用后,返回值发生了变化,这是怎么回事啊,什么地方出错了?

#include<stdio.h>
#include<conio.h>
#include<string.h>

int bd(char *num);                        /* 判断字符串是什么类型,整数型返回1,小属型返回2,分数型返回0,错误型返回4,负整数返回-1,负小数返回-2 */
double strtod(char *num);                 /* 将字符串转化成浮点数 */
double dten (int a);

void main ()
{
    char num[20];
    double x;
    while(1)
    {
        printf("\n输入数字:");
        gets(num);
        x=strtod(num);
        printf("\n%d\n%f",bd(num),x);
    }
}

int bd (char *num)
{
    int i,len;
    int x,d,s,o,f;                /* x为斜杠个数,d为逗点个数,s数字个数,o其他字符个数,f负号个数 */
    char *p1,*p2;
    x=0;
    d=0;
    s=0;
    o=0;
    f=0;
    len=strlen(num);
    /* 统计各个符号的个数 */
    for (i=0;i<len;i++)
    {
        if (*(num+i)=='/')
        {
            x++;
        }
        else if (*(num+i)=='.')
        {
            d++;
        }
        else if (*(num+i)>='0'&&*(num+i)<='9')
        {
            s++;
        }
        else if (*(num+i)=='-')
        {
            f++;
        }
        else
        {
            o++;
        }
    }
    /* 判断是什么数字类型 */
    /* 非分数型 */
    if (o==0&&x==0)
    {
        /* 正数型 */
        if (f==0)
        {
            /* 正整数型 */
            if(d==0)
            {
                return 1;
            }
            /* 正小数型 */
            else if (d==1)
            {
                if (*(num)!='.'&&*(num+len-1)!='.')
                {
                    return 2;
                }
                else
                {
                    return 4;
                }
            }
            /* 错误型 */
            else
            {
                return 4;
            }
        }
        /* 负数型 */
        else if (f==1)
        {
            /* 负整数 */
            if (d==0)
            {
                if (*(num)=='-')
                {
                    return -1;
                }
                else
                {
                    return 4;
                }
            }
            /* 负小数 */
            else if (d==1)
            {
                if (*(num)=='-')
                {
                    if (*(num+1)!='.'&&*(num+len-1)!='.')
                    {
                        return -2;
                    }
                    else
                    {
                        return 4;
                    }
                }
                else
                {
                    return 4;
                }
            }
            else
            {
                return 4;
            }
        }
        else
        {
            return 4;
        }
    }
    /* 分数型 */
    else if (o==0&&x==1)
    {
        if (*(num)!='/'&&*(num+len-1)!='/')
        {
            p1=strtok(num,"/");
            p2=strtok(NULL,"\0");
            if (bd(p1)==4||bd(p2)==4)
            {
                return 4;
            }
            else
            {
                return 0;
            }
        }
        else
        {
            return 4;
        }
    }
    /* 错误型 */
    else
    {
        return 4;
    }
}

double strtod(char *num)
{
    int i,j,k,len;
    double x=0,y=0;
    char *p1,*p2;
    if (bd(num)==1)                    /* 整数型 */
    {
        len=strlen(num);
        for (i=0;i<len;i++)
        {
            x=x+((*(num+len-1-i))-48)*dten(i);
        }
    }
    else if (bd(num)==2)               /* 小数型 */
    {
        len=strlen(num);
        for (i=0;*(num+i)!='.';i++)
        {
        }
        k=i;
        for (i=0;*(num+i)!='.';i++)
        {
            x=x+(double)((*(num+k-1-i))-48)*dten(i);
        }
        for (k=1,j=i+1;j<len;k++,j++)
        {
            x=x+(double)((*(num+j))-48)/dten(k);
        }
    }
    else if (bd(num)==-1||bd(num)==-2)           /* 负整数,负小数 */
    {
        p1=strtok(num,"-");
        x=-strtod(p1);
    }
    else if (bd(num)==0)                         /* 分数 */
    {
        p1=strtok(num,"/");
        p2=strtok(NULL,"\0");
        x=strtod(p1);
        y=strtod(p2);
        x=x/y;
    }
    return x;
}

double dten (int a)
{

    long int b=1,i;
    for(i=0;i<a;i++)
    {
        b=b*10;
    }
    return (double)(b);
}

[[it] 本帖最后由 zqmillet 于 2008-8-9 18:08 编辑 [/it]]
搜索更多相关主题的帖子: value control paths num not 
2008-08-08 11:35
zqmillet
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:108
注 册:2008-7-20
收藏
得分:0 
...

[[it] 本帖最后由 zqmillet 于 2008-8-8 17:03 编辑 [/it]]
2008-08-08 11:37
zqmillet
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:108
注 册:2008-7-20
收藏
得分:0 
输入小数整数都没问题,只要是分数结果就不对,我看了一天了,该怎么办啊,麻烦大家了
2008-08-08 11:39
zqmillet
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:108
注 册:2008-7-20
收藏
得分:0 
再问一个问题:打印浮点数用%f,那double用什么?
2008-08-08 11:41
zqmillet
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:108
注 册:2008-7-20
收藏
得分:0 
[bo][un]keenofmyheart[/un] 在 2008-8-8 13:02 的发言:[/bo]

楼主说一下这程序是拿来干什么的?而且里面的流程有问题,程序没有退出口!

这是我用来测试strtod这个函数的,用while(1)是为了一次能测试更多的数据,不是最终的程序
这个函数是用来吧字符串转化成双精度浮点型,且比 atof功能强,能将分数也转化成浮点数,且返回值不同,能很清楚的指出用户输入错误
2008-08-08 14:47
zqmillet
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:108
注 册:2008-7-20
收藏
得分:0 
怎么没有人解答?
2008-08-08 16:05
zqmillet
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:108
注 册:2008-7-20
收藏
得分:0 
谢谢楼上的回答,问一下:有点看不懂,上面那个函数i能大于19吗,不是已经赋过值了吗?
2008-08-08 16:32
zqmillet
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:108
注 册:2008-7-20
收藏
得分:0 
问题我在1楼的开始有说明,希望有人解答
2008-08-09 17:40
zqmillet
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:108
注 册:2008-7-20
收藏
得分:0 
吃完饭回来看看
2008-08-09 18:04
快速回复:大家帮帮忙,还是不明白
数据加载中...
 
   



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

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