| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 558 人关注过本帖
标题:一年中关于C的总结
只看楼主 加入收藏
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
结帖率:98.63%
收藏
 问题点数:0 回复次数:8 
一年中关于C的总结
我现在是大二学生,去年一年中学习了一些C语言,正好学期快结束了,打算将代码做一些总结,我会一点一点贴出自己在这一年里写下或者收集到的代码,在我这个初学者看来有参考价值的代码我都会贴上来,牛人们来看个热闹就行了,如果给一些建议,那就不胜感激了。我想尽量将自己的代码弄得简短,因为大家时间宝贵,谁也不想看那些又臭又长的代码,所以我尽量让代码看得舒服

1. 把句子拆成单词,一行一个单词进行输出,設定一个状态量,IN(在单词内为 1)和OUT(在单词外为 0), 空格结束,碰到第一个字母时,状态从开始的OUT变为IN。
    int main(void) {
        int c, state;
        state = OUT;
        while( (c = getchar() ) != EOF ) {
            if( c == ' ' ||  c == '\n' || c == '\t' ) {            /*  单词结束:碰到空格,看状态,如果是IN,则刚才在单词内,现在出来了, 如果是OUT,则回到while 下一个c*/
                if( state == IN) {
                    putchar("\n");
                    state = OUT;
                }
            }
            else if( state == OUT) {               /* 临界状态,无数个空格之后,终于碰到第一个字母,终于进入单词,所以前一个状态是 OUT */
                    state = IN;
                    putchar( c );
            }
            else
                putchar( c );                            /* 在单词内部,无限输出 */
        }
    }

好了,第一个问题就结束了,等通过管理员之后,我会继续回复更多问题,希望得到大家的支持, 如果大家有自己的解法不妨拿出来一下学习

[ 本帖最后由 madfrogme 于 2012-1-10 22:25 编辑 ]
搜索更多相关主题的帖子: 单词 字母 不胜感激 C语言 
2012-01-10 21:57
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
2. 把連续的空格转换成一个空格, 这个程序主要就是定义一个变量 lastc 来记录前一个字符,首先定义一个非空格量  #define NONBLANK  'a' (这个随意)先看程序
程序代码:
    int main( void ) {
        int c, lastc;
        lastc = NONBLANK;
        while( ( c = getchar() ) != EOF ) {
            if( c != ' ' )                     /*  碰到不是空格就输出*/
                putchar( c );
            if( c == ' ' )                    /*  碰到是空格了,则看前一个字符 lastc 是什么,因为目地就是只输出一个空格 */
                if( lastc != ' ')
                    putchar( c );
            lastc = c;
        }
    }


第二问就这么多

The quieter you become, the more you can hear
2012-01-10 22:13
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
其实第二问的把连续空格转为一个空格还有一种写法是用一个OR 运算符, 将while 部分改为
程序代码:
        while( ( c = getchar() ) != EOF) {
            if( c != ' ' || lastc != ' ' )        /* 不论是'空格空格test' 还是 ‘test空格空格‘ 都没问题O ^^ */
                putchar( c );
            lastc = c;
        }

The quieter you become, the more you can hear
2012-01-10 22:23
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
我就在想,一年肿么就那么少,原来还有

技术问题,请不要以短消息方式提问
2012-01-10 22:37
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
我没办法将内容安排的太过整齐,我只是把自己想到的程序写下来,所以可以跳跃会不小,前后联系也不会太大
看到一个用 XOR 来交換 整数的 macro ,不用多余的 temp 变量,听说这个方法很老了~~
    #define    SWAP( a, b )    ( ( ( a ) ^= ( b ) ) , ( ( b ) ^= ( a ) ) , ( ( a ) ^=  ( b ) ) )


自己试试看吧
连接在下面,自己可以看看哦
还有解释
http://graphics.stanford.edu/~seander/bithacks.html#SwappingValuesXOR

The quieter you become, the more you can hear
2012-01-10 22:39
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
回复 4楼 zaixuexi
呵呵, 以防大家看得太累, 所以一点一点写

The quieter you become, the more you can hear
2012-01-10 22:40
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
3. 接下来是数 bit ,看一个数在机器中用二进制来表示时有几个 1,正好这问可以帮助理解负数是怎样被存贮的~~只是比较奇怪的是要把想计算的数宣言成 unsigned char, 好奇怪啊,谁能解答一下吗
程序代码:
    int bitcount(unsigned char x);

    int main(void){
        unsigned char x = (unsigned char)-1;
        printf("%d\n",bitcount(x));
        return 0;
    }

    int bitcount(unsigned char x) {  
        int count;
        for (count = 0; x!=0; x>>=1)           /* 比较最低位,用 & 来比较,每结束一个向右移一位 */
             if ( x & 01 )     
                  ++count;
        return count;
    }


[ 本帖最后由 madfrogme 于 2012-1-10 23:04 编辑 ]

The quieter you become, the more you can hear
2012-01-10 23:01
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
4. 自己继续努力,说一下 linked list(链表) 怎样把一个 node  推(Push )到 linked list 的头上呢,只有三步
1) Allocate
        struct node* newNode = malloc(sizeof(struct node));
    newNode->data = data;
2) Link Next
        newNode->next = *headRef;
3) Link Head
        *headRef = newNode;
下面的 headRef 可能就是 main() 中宣言的root,
headRef 即为 &root
程序代码:
    void Push(struct node** headRef, int data) {
        struct node* newNode = malloc(sizeof(struct node));
        newNode->data = data;                    
        newNode->next = *headRef;
        *headRef = newNode; 
    }
 

这个Push 只能把Node 推到 头的位置 好比
Push 1
1
Push 2
2 1
Push 3
3 2 1

如果想Push 成 1 2 3还要再加上一点代码滴~~~

[ 本帖最后由 madfrogme 于 2012-1-10 23:40 编辑 ]

The quieter you become, the more you can hear
2012-01-10 23:37
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
以下是引用madfrogme在2012-1-10 23:01:48的发言:

3. 接下来是数 bit ,看一个数在机器中用二进制来表示时有几个 1,正好这问可以帮助理解负数是怎样被存贮的~~只是比较奇怪的是要把想计算的数宣言成 unsigned char, 好奇怪啊,谁能解答一下吗

    int bitcount(unsigned char x);

    int main(void){
        unsigned char x = (unsigned char)-1;
        printf("%d\n",bitcount(x));
        return 0;
    }

    int bitcount(unsigned char x) {  
        int count;
        for (count = 0; x!=0; x>>=1)           /* 比较最低位,用 & 来比较,每结束一个向右移一位 */
             if ( x & 01 )     
                  ++count;
        return count;
    }


关于为什么是unsigned char x , 得高人指点,在下面这个贴子中
https://bbs.bccn.net/thread-359494-1-1.html

The quieter you become, the more you can hear
2012-01-11 00:18
快速回复:一年中关于C的总结
数据加载中...
 
   



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

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