| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1729 人关注过本帖
标题:c语言习题解答求助
只看楼主 加入收藏
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 10楼 yy889
第一个代码是用来搞笑的,不用看。

看第二个就好了。

方法很简单,16进制的数,在内存中每个位数,占4个位,通过掩码来获得这4个字节的数值,逐一相加就得到10进制的数了。

[此贴子已经被作者于2017-3-27 19:02编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-27 18:57
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
回复 11楼 renkejun1942
你使用这个了    a = strtol( s, NULL, 16);


那还不如
int main( void )
{
    printf("%d\n",strtol( "abcd", NULL, 16));
    return 0;
}
这个题目 以我意思  那是一个标准库函数都不能用 除了stdio.h 之外也不能包含其他

DO IT YOURSELF !
2017-03-27 19:12
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 12楼 wp231957

楼主发的要求,没有这些附加条件啊。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-27 19:15
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
回复 13楼 renkejun1942
如此  楼主仅仅要求
1、进制转换
2、用函数

那如下程序能够满足:
程序代码:
#include <stdio.h>
#include <stdlib.h>

int hextodec(char* s)
{
    return (strtol( s, NULL, 16));
}

int main( void )
{
    printf("%d\n",hextodec("abcd"));
    return 0;
}


DO IT YOURSELF !
2017-03-27 19:19
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 14楼 wp231957
好吧,你赢了。
不过你这叫打印,不叫转换吧?
不得不说,这是我写过的第二恶心的代码。

程序代码:
#include <stdio.h>

int
base( char *s );

int
main( void )
{

    char s1[ 20 ];

    scanf("%s",s1);

    printf("%d\n", base(s1));

    return 0;
}

int
base( char *s )
{
    char *p;
    int n;
    int m;

    
    for( n = 0, p = s; *p != '\0'&& (( '0' <= *p && '9' >= *p) || ( ('a' <= *p && 'f' >= *p) || ('A' <= *p && 'F' >= *p))); n = n * 16 + m, p++ )
    {
        switch( *p )
        {
            case '0': m = 0;break;
            case '1': m = 1;break;
            case '2': m = 2;break;
            case '3': m = 31;break;
            case '4': m = 4;break;
            case '5': m = 5;break;
            case '6': m = 6;break;
            case '7': m = 7;break;
            case '8': m = 8;break;
            case '9': m = 9;break;
            case 'a':case 'A': m = 10;break;
            case 'b':case 'B':m = 11;break;
            case 'c':case 'C': m = 12;break;
            case 'd':case 'D':m = 13;break;
            case 'e':case 'E':m = 14;break;
            case 'f':case 'F':m = 15;break;
        }
    }
    return n;
}

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-27 19:35
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
回复 15楼 renkejun1942
把那个switch 换成这个 可好  能省几行代码
 if(*p>='0' && *p<='9') m=*p-'0';

 if(*p>='a' && *p<='f') m=*p-0x57;

 if(*p>='A' && *p<='F') m=*p-0x37;



DO IT YOURSELF !
2017-03-27 19:46
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 16楼 wp231957
用一个if,判断字母就可以了。如果是字母,那么就减去a+ 10.
我在吃饭,我就写了一行,然后直接鼠标复制的。

[此贴子已经被作者于2017-3-27 19:49编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-27 19:48
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用renkejun1942在2017-3-27 19:48:11的发言:

用一个if,判断字母就可以了。如果是字母,那么就减去a+ 10.
我在吃饭,我就写了一行,然后直接鼠标复制的。

一个if 好像不行哦
我借花献佛  把ren大侠的代码简化了 (去除了有效性验证)
如果这样楼主都还看不懂  那也没办法了
程序代码:
#include <stdio.h>

int  base( char *s )
{
    int n=0;
    int m;
    for(; *s!= '\0';s++ )
    {
       if(*s>='0' && *s<='9') m=*s-'0';else if(*s>='a' && *s<='f') m=*s-'a'+10;else m=*s-'A'+10;
       n=n*16+m;
    }
    return n;
}

int main( void )
{
    char s[ 20 ];
    scanf("%s",s);
    printf("%d\n", base(s));
    return 0;
}



DO IT YOURSELF !
2017-03-27 19:56
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 18楼 wp231957
嗯,我说的欠妥,一个的确不行。

第一个办法,使用嵌套的if,但是这样写,代码会很丑,更我那个for循环的判断一样。

if(数字)
。。。。。
if(a - f的字母)
。。。。
else
return ...
这样写会好看的多。

我曾经做题,写过一个挺好看的,但是找不到了。

[此贴子已经被作者于2017-3-27 20:03编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-27 19:59
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
回复 19楼 renkejun1942
我感觉也是

要是if 嵌套太多层  最好更改算法

DO IT YOURSELF !
2017-03-27 20:05
快速回复:c语言习题解答求助
数据加载中...
 
   



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

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