回 帖 发 新 帖 刷新版面

主题:[原创]我学习C多重循环的心得(绝对原创)

我学C用的书是清华出版的谭老爷子写的《C程序设计(第二版)》。虽然现在网上有一部分人把他和他的书骂得一钱不值,但是在我看来那些人心态有点.....好拉,个人有个人的观点吧。题外话我就不多说了。我感觉他的书除了在写程序的风格方面不好,没有用Microsoft的匈牙利风格以外,其他的还是很不错的。是编程入门者学习的好书。
   下面我就来谈谈我在学习循环方面的心得:
首先,要有大无畏的精神也就是不要怕循环,可以这样说,循环对初学者来说确实很难理解,但是它是个重点,一定要搞定它,不然对于后面要学的数组,函数等都有困难。
   C语言中的循环语句有4个(一般的书只说有3种),即while,do....while,for,if...goto,
其中if...goto一般是不用的,因为它会破坏结构化程序设计方法,在什么时候用呢?就是在你想要从多重循环中跳到最外层时,还有可以提高程序的运行效率时用,否则,千万不要使用。while和for是当型循环,什么是当型循环呢?就是当条件为真时就循环,一旦条件为假了就停止循环,而do...while是直到型循环,就是直到条件为假了就停止循环,当型循环和直到型循环在一般情况在可以互用,当条件一开始就为假,就不能互用了,因为当型循环可以不执行循环体里的语句,而直到型循环至少要执行一次,这就是它们之间最大的区别。嘿嘿。。
   在C语言的循环语句中,for语句的功能最为强大,可以完全代替while语句,至于for语句的使用格式,请读者看书,我在这里就不再说了。
   请看几个程序,你会在这几个程序中领悟到循环的真谛。。。嘿嘿。。。
   1.打印出所以的"水仙花数"。
     所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
     分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
     程序代码:
main()
{
        int i,j,k,n;
        printf("water flower number is:\n");
        for(n=100;n<1000;n++)
         {
            i=n/100;
            j=(n-i*100)/10;
            k=n%10;
              if(i*i*i+j*j*j+k*k*k==n)
                printf("%d\n",n);
  }
}
   再看看另外一种方法:
   分析:我们可以用一个三重循环来解决这个问题:
   程序代码:
main()
{
        int i,j,k,n;
        printf("water flower number is:\n");
        for(i=1;i<=9;i++)
         for(j=0;j<=9;j++)
          for(k=0;k<=9;k++)
           {if(100*i+10*j+k==i*i*i+j*j*j+k*k*k)
              printf("%d%d%d\n",i,j,k);
           }
}
  两段不同代码都得出了同样一个结果,其实对于同一个编程题有许许多多种解法,就看你怎么做了。嘿嘿。。
    我们再来看一个题:
   公元钱五世纪,我国古代数学家张丘建在《算经》一书中提出了“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
   分析:用枚举法来做。
   程序代码:
main( )
{
     int cocks,hens,chicks;
      for(cocks=0;cocks<=19;cocks++)
       {
         for(hens=0;hens<=33;hens++)
          {
            chicks=100-cocks-hens;
              if(5*cocks+3*hens+chicks/3==100&&chicks%3==0)
                printf("%d,%d,%d\n",cocks,hens,chicks);

          }

       }
}

要想理解循环其实也很容易,只要你深刻的理解了循环语句,嘿嘿,自己去体会吧,我就不多说了。
  如果觉得好就请回个帖,鼓励一下我,如果不好也请回个帖说说。谢谢。

回复列表 (共18个回复)

沙发


我觉得循环是最爽的,不会循环就等于不会编程


写的不错的,挺适合初学者看,文采不错

板凳

从楼主编的两个程序就可以看出谭老爷的编程水平了。其实我认为学C语言最好的方法是看手册,不知道各位有多少人手头有C的手册?
建议:
1. j=(n-i*100)/10;    ====> j=(n % 100) / 10;   否则n很大了,如何处理?  
2.
         for(hens=0;hens<=33;hens++)
          {
            chicks=100-cocks-hens;
              if(5*cocks+3*hens+chicks/3==100&&chicks%3==0)
                printf("%d,%d,%d\n",cocks,hens,chicks);

          }

=====>

         for(hens=0;hens<=33;hens++)
          {
            chicks=100-cocks-hens;
            if (chicks % 3 == 0)    //chicks必为3的倍数。
              if(5*cocks+3*hens+chicks/3==100)
                printf("%d,%d,%d\n",cocks,hens,chicks);

          }

3 楼

en
真好那~

4 楼

我一般都。。。喜欢goto,因为他快速。
一般比while快1/13,比do..while快1/15
比for快1/4,比repeat..until快1/15
比until快1/13
。。。
最大特点是灵活,如果不灵活就没法活,比如:
for(i=1,i>=6,i+=3)printf("%d",i);
i=1;while(i>=6){printf("%d",s);i+=3}
    非得移好别人给的函数才能活啊?
    你不会自己算啊!

5 楼

喜欢goto?无语了。
请教4楼def一下:
1. QB有OOP吗?
2. QB做数据库比delphi好在哪里?

6 楼

看到2楼说的话,我....沉默。

7 楼

哈哈
反对就直说啊
我想略知皮毛兄会解释给你听的
哦?

8 楼

呵呵,大家是讨论问题,不必介意,这样改是有道理的。如果楼主看过谭老爷的配套习题集的答案,你会更有体会的。记得有一题求5位数的每一位的题目(在条件语句那一章的习题),他的答案相信很多人都看过,看的时候有什么感觉?
对初学者来说,从一开始就养成良好的编程习惯和编程风格是非常重要的,而谭老爷的书上根本就是只字不提。建议楼主还是看 K&R写的《C程序设计语言》

9 楼

QB当然可以OOP...而且需要自己做函数...
QB做数据库当然可以而且非常方便,可以用random文件。。。

10 楼

我承认,我的编程能力远远不及略知皮毛,但是他说看到我的两个程序就知道谭老爷子的编程水平那就太武断了,我不想争论什么,后人自会评价。

我来回复

您尚未登录,请登录后再回复。点此登录或注册