| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 10300 人关注过本帖, 11 人收藏
标题:0夜紫小店_循环套餐
只看楼主 加入收藏
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
结帖率:100%
收藏(11)
 问题点数:0 回复次数:54 
0夜紫小店_循环套餐
夜紫小店_循环套餐
————————
掌柜:pgy

————————
店权声明:
    本店一律免费^_^
    来不来本店是你的权力
    尝了产生感想不发出是你的过失,刮刮鼻子
    尝了发现错误不指出是你的错误,打打PP
    尝了有好见解不提出是你的罪过,拉出去砍啦!
    纠错提意见请呼叫本店扣扣:513358249(一直在隐身,从未下过线)

————————————
套餐简介:
    本套餐主要是说循环的那点事儿。
    比如:
        怎样循环更有效率
        怎样写循环更规范
        怎样理解循环更快
        and so on……
    菜单:
        0. 本页
        1. 外层小循环内层大循环
        2. 循环体的变化操作和定位操作
        3. 别打扰,我正在循环
        4. 饭后小甜品

————————————
    “客官,您瞧好叻,小二,上菜~~~~!”
收到的鲜花
  • lonmaor2010-03-13 12:07 送鲜花  50朵   附言:我很赞同
  • hahayezhe2010-04-30 20:02 送鲜花  49朵   附言:好文章
搜索更多相关主题的帖子: 套餐 
2010-03-08 17:20
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:0 
1. 外层小循环内层大循环


————————
————————
******************
题目:写一个输出10*2的整型数据(赋初值而知)矩阵的代码。
******************
代码:
void main(void)
{
    int a[10][2] = {省略};
    int i=0;
    int j=0;
    for (i=0; i<2; i++)                //for(i=0; i<10; i++)
        for(j=0; j<10; j++)            //    for(j=0; j<2; j++)
        {                //    {
            printf("%5d\n", a[j][i]);    //        printf("%5d\n", a[i][j]);
        }                //    }
}
————————
————————

//////////
我们的讲解:
    代码和注释差异于循环方式的写法。我就说说二者的优点。前者是“把最大的循环写到最里层”,这样写的优点是提高程序执行速度。后者是“用合适题目描述的方式写循环”,这样写的优点是易懂。另外,这两种写法的各自优点就是另一种写法的缺点。
PS:
    像这个例子中的循环,用注释中的好,因为效率都差不多,而注释中的易懂。但在很大的多重循环中,应该“把最大的循环写到最里层”。
    所以捏,客官们都要记住咯
    “外层小循环,内层大循环。”
————————
————————

我可好玩啦...不信你玩玩^_^
2010-03-08 17:20
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:0 
2. 循环体的变化操作和定位操作


————————
————————
******************
题目:有字符串a[] = "ChangeAndLocate",编写程序,使a中每个元素加1后存为字符串b并输出。
******************
代码:
#include <stdio.h>

char *str(char pb[], char pa[])
{   
    char *p = pb;
   
    while (*pa != '\0')
    {
        *pb = *pa + 1;    //注释1:变化操作
        pa++;        //注释2:定位操作
        pb++;        //注释3:定位操作
    }
    *pb = '\0';
   
    return (p);
}

void main(void)
{
    char a[] = "ChangeAndLocate";
    char b[] = "";
   
    puts(str(b, a));
}
————————
————————

//////////
我们的讲解:
    所谓循环操作,即重复的做某种操作组合。这个组合可以由1或n个基本操作组成。我觉得呢,基本操作按作用不同可分为:变化操作和定位操作。
    变化操作即实现循环根本功能的语句。比如上面的代码,循环最根本的功能是为了把a中每个元素加1,对应的就是注释1处的操作。
    因为变化操作只负责实现“变化”功能,但对谁变化,它可不管。所以需要定位操作语句来为变化操作定位操作对象。在上面的代码中,每变化操作一次,操作对象便后移一位,转到下一个操作对象。又因为在循环语句中,这种定位是有一定顺序的(依次来的嘛),所以可以更形象的称为“循环定位”。
    所以呢,循环体由知道“干啥”的变化操作同学和知道“找谁干啥”的定位操作同学一起来决定(还有起始点和终结条件,这里不说了,可以自己思考,哈)。
    for循环中,比如for(i=0; i<10; i++),i++就是定位操作。因为for循环的定位操作和变化操作在语句的书写上就是分开的,所以大家一般会感觉使用for语句比其它循环语句更清晰。借鉴这一点,我们得出下面的建议第一项。

//////////
我们的体会:
    当遇到循环体复杂时,可以采取下列一些建议提高循环体的清晰度。
    1. 把变化操作和定位操作分开想,分开写。最后组合到一起。比如上面的循环体中,不要写(*pb++) = (*pa++) + 1。

    2. 别在for循环体内执行定位操作,效率一样,但不直观,使程序缺少易读性(换言之,程序写‘丑’了^_^)。

    3. 当遇到变化操作和定位操作同时要用某一个对象进行操作时,可以设置另外一个变量来记录这个要操作的对象。然后分开进行操作。比如把单链表A、B交叉组合成单链表C时,分别指向A、B当前项的两个指针,即要让指针交叉指向下一项,又要定位到下一项。但先定位,那交叉指向时会指错;先变化,也会指错。此时就可以用一个变量记录,那么这个记录的变量和原来的变量就可以一个负责变化一个负责定位了。(本例看不懂的自己写写‘把单链表A、B交叉组合成单链表C’的算法)

    4. 别什么循环都想用for循环,或者转换成for循环(喂~你用不腻啊?(⊙o⊙))。比如上面的代码中,如果不知道字符串长度,用while循环代码更清晰。前提是循环体的操作写的清晰。

    5. 变化操作和定位操作在一次循环中一般是成对出现的,别少掉谁,或多了谁。要不然在下一个循环中你就掉大了^_^(把这种观念加到对链表的理解中,因为链表老要“扫描”)。

————————
————————

我可好玩啦...不信你玩玩^_^
2010-03-08 17:20
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:0 
3. 别打扰,我正在循环


————————
————————
******************
题目:有一群未知数量未知性别的人,但知道她/他(反正不是‘它’^_^)们要么都是GG,要么都是MM,写出统计GG或MM的人数
******************
代码1:
while (还有人)
{
    if (是MM)
    {
        MM++;
    }
    else
    {
        GG++;
    }
}
————————
代码2:
if (是MM)
{
    while (还有人)
    {
        MM++;
    }
}
else
{
    while (还有人)
    {
        GG++;
    }
}
————————
————————

我们的讲解:
    前者虽然更易懂,后者却在2个判断写了2个循环。BUT,代码2是连续性的循环做一件事,即该循环只统计人数(因为对于性别判断已在循环外的if中得出)。前者总要第一步判断性别,第二步统计人数。代码1的循环就没有代码2有连续性。
    你想啊,假如计算机是个装箱工人,你要它装箱零件,它能很快;但你又让它在循环装箱的时候检查该零件是否合格,然后根据零件是否合格再装进箱子,速度是不是慢了呢?^_^
    所以我们要先检查好零件,然后循环装箱。分工操作,合作完成。要不然工人就要抱怨:
    “别打扰,我正在循环。”
————————
————————

我可好玩啦...不信你玩玩^_^
2010-03-08 17:21
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:0 
4. 饭后小甜品


————————
————————
1. for循环条件写成半开半闭格式,比如
    for(i=0; i<10; i++)        (本山大叔说:“好~~~!”)
   
    for(i=0; i<=9; i++)        (老毕说:“哎呀,真委婉~~~”)

理由在这里^_^:
    夜紫说:“同学们跟我读,十减去零等于十,九减去零等于九。”
    很明显,这两种循环都是循环十次;也很明显,本山那句更直观,很实在。
    如果你还是写成老毕那句,就知道你丫没跟着读,哼!再跟我读一遍:“十减去零等于十,九减去零等于九”
    乖孩子,来吃糖~~~^_^

————————
————————
2. “我叫‘goto’,请别怕我。”
    goto同学‘一直被争议,从未被删除’。
    goto至少可以在多层嵌套的for循环中,当遇到一个结束标志时,‘咻~~~’的一下跳出来,省掉so many的break语句,很好很快很强大哟^_^。
    “你可以少用、慎用我,但别禁止用我。”因为
    “我叫‘goto’,请别怕我。”

————————
————————
3. 循环条件语句要简明意骇
    典型代表1:
        for (i=5; i; i--)    (这样写的不是好孩子,乖孩子别学哟^_^)

    典型代表2:
        for (i=0; i<11; i+=2)    printf("%d\n",i);    //输出0、2、4、6、8、10,应改为下面
        for (i=0; i<6; i++)    printf("%d\n",2*i);

    又不是世界混乱代码大赛,为了易读性,客官们要
    “宁可简明,不可意骇” (我觉得‘明’是重中之重)

————————
————————
4. 循环起始条件变量最好和定义此变量时一样
    int i = 0;        \\注意默认值
   
    for (i=1; i<10; i++)
    改为
    int i = 1;
   
    for (i=1; i<10; i++)
    没啥好说的,好看呗,嘿嘿^_^

————————
————————
5. 循环重点?
    一般循环重点在于:1起始点的判断 2循环的操作 3结束的判断及其后的操作
    如果深谙循环之道,大可不必了解循环中语句怎么弄的了;
    但如果不是很理解,可以自己模拟写出一些循环中的过程,可以加深对循环的理解。(哈哈,这个好玩,我在看循环的时候把循环拆成非循环一步步的想,有些复杂的还一步步的写出来,都是循环操作。在我不是很懂的时候,这样做理解更快^_^)
    所以循环的重点在哪里,要看大家对循环的渗悟了。

    建议‘崭新’的新手或遇到棘手的循环的老手,在理解时,可以尝试不用循环思想,一步步的想,多想几步就会发现“耶?怎么刚才想的几步都一样?”,有这种感觉的时候,再一总结想想。OK,congratulations!

————————
————————
6.该不该省呢?
代码1:
int i = 0;
int n = 0;
scanf("%d", &n);
for (i=1; i<n; i++)
{
   
}
代码2:
int n = 0;
scanf("%d", &n);
for ( ; n>0; n++)
{
   
}
    代码1清晰,代码2省略了一个变量

————————
————————

我可好玩啦...不信你玩玩^_^
2010-03-08 17:21
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:0 
欢迎下次光临!


————————
————————   
不知客官是否吃好了?如果有任何意见请跟帖留言,或拨打本店扣扣:513358249(一直在隐身,从未下过线)提出宝贵改善意见!^_^
    “小二,来送送客官!”
    “来叻~~~,客官,您慢走,您走好!欢迎下次光临!”
    (掌柜和店小二热泪中目送客官身影的缓缓离去……)

————————
————————

    “别忘记洗手哟~~~~!”
水○水○水○水◢█▉◣○水○水○水○水○水○水○  
水○水○水████████○水○水○水○水○水○  
水○水○水████████○水○水○水○水○水○  
水○水○水○水○██水○水○水○水○水○水○水○  
水○水○水○◢████◣水○水○水○水○水○水○  
水○水○水◢██████◣○水○水○水○水○水○  
███○水████████○水○水○水○水○水○  
██████████████████◣○水○水○  
███████████████████◣水○水○  
████████████████████◣○水○  
███○水○水████○水○水○◥████○水○  
水○水○水○水○水○水○水○水○水████○水○  
水○水○水○水○水○水○水○水○水○◢◣水○水○  
水○水○水○水○水○水○水○水○水◢██◣○水○  
水○水○水○水○水○水○水○水○◢████◣水○  
水○水○水○水○水○水○水○水○██████水○  
水○水○水○水○水○水○水○水○◥████◤水○

我可好玩啦...不信你玩玩^_^
2010-03-08 17:21
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:0 
Cherry-Cherry Boom-Boom...GaGa~~~

我可好玩啦...不信你玩玩^_^
2010-03-08 17:22
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
我想吃 肉丝面

我就是真命天子,顺我者生,逆我者死!
2010-03-08 17:25
longlong89
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:小飞侠
威 望:6
帖 子:1043
专家分:2754
注 册:2009-8-18
收藏
得分:0 
up

想象力征服世界
2010-03-08 18:14
dydsdyds
Rank: 6Rank: 6
来 自:Java
等 级:侠之大者
帖 子:217
专家分:457
注 册:2010-2-14
收藏
得分:0 
循环,确实学的不大好……

c语言刚开一学期,就换开VB...
2010-03-08 19:29
快速回复:0夜紫小店_循环套餐
数据加载中...
 
   



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

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