循环结构程序设计

介绍在程序设计中,经常需要反复执行某一条语句或一个语句块,这种结构称为“循环结构”或者“重复结构”。计算机最擅长的就是重复做一件事情,所以循环结构在程序设计中应用非常广泛。

第一课.while语句

重点内容:

while语句的格式如下:

while(表达式){

      循环体

}

其含义为:先计算表达式(一般称为循环条件)的值,当表达式的值为真(循环条件成立)时,去执行一次循环体。和if语句不同的是,执行完一次循环体后,while语句又回到开始处,继续计算和判断表达式的真假,决定是否再次执行循环体。也就是“当表达式成立时,不断重复执行循环体”,所以又称为“当型循环”。

典型例题:

1.输出10个“@”:

int i=1;

while(i<=10){

      printf("@");

       i++

}

如果把"i++"修改为"i+=2;",运行发现,程序输出5个“@”。如果再把“i<=10”修改为“i<1;”,运行发现,程序没有任何输出,因为第一次循环条件就不成立,循环体一次也没有执行。如果不小心将循环体中的语句“i++”漏了,程序会一直执行“printf("@");”语句,永远也不会结束。这种情况称为"死循环"。

2.统计正数

#include<iostream>

using namespace std;

int main(){

     int x,s=0;

     cin>>x;

     while(x!=0){

           if(x>0) s++;

           cin>>x;

     }

     cout<<s<<endl;

     return 0;

}

 

第二 课.do-while语句

重点内容:

do-while语句的格式如下:

do{

       循环体

}while(表达式);

do-while是用于解决至少执行一次重复操作(循环体)的循环语句。其含义:先执行一次循环体,然后判断表达式是否成立,如果成立,则返回继续执行循环体,直到表达式不成立,才退出循环。一般称之为"直到型循环"。do-while语句和while语句都可以实现循环结构,区别是:do-while语句先执行循环体,在判断表达式。所以do-while语句至少执行一次循环体。

典型例题:

比较while语句和do-while语句的区别:

1.输出一行十个"@"。

#include<cstdio>

using namespace std;

int main(){

     int i=1;

     do{

         printf("@");

         i++;

     }while(i<=10);

     return 0;

}

2.统计正数

#include<cstdio>

using namespace std;

int main(){

     int i=1;

     do{

         printf("@");

         i++;

     }while(i<=10);

     return 0;

}

第三课:for语句

重点内容:

for语句的格式如下:

for(表达式1;表达式2;表达式3){

        循环体

}

在实际应用中,如果重复执行的操作(循环体)次数是固定的,已知的,则一般使用for语句。

其含义为:先执行表达式1,再执行表达式2,如果表达式二成立,则执行循环体,执行循环体后执行表达式3,执行表达式三后回到表达式2,如果表达式2成立,继续执行上述操作,如果不成立,则结束操作。

典型例题:

比较while语句do-while语句for语句的区别:

1.输出一行十个"@"。

#include<cstdio>

using namespace std;

int main(){

     for(int i=1;i<=10;i++)

           printf("@");

     printf("\n");

     return 0;

}

2.正数统计

由于for语句执行循环次数是固定的,而此题执行循环的次数不固定,所以不能用for语句。

第四课:循环嵌套

重点内容:

在第三单元中,已经介绍了分支结构的嵌套。循环结构与之类似,也可以在一个循环语句的循环体里出现另一个循环语句,不管是while语句,do-while语句还是for语句。这样的循环结构称之为"循环嵌套"。

典型例题:

1.输出矩形。

#include<cstdio>

using namespace std;

int main(){

      int n,m;

      scanf("%d %d",&n,&m);

      for(int i=1; i<=n;i++){

           for(int j=1;j<=m;j++)printf("*");

           printf("\n");

           }

          return 0;

}

2.与7无关的数

#include<iostream>

using namespace std;

int main(){

     int n,ans=0;

     cin>>n;

     for(int i=1;i<=n;i++){

           int flag1=1,flag2=1;

           if(i%7==0) flag1=0;

           int x=i;

           while(x&&flag2){

                if(x%10==7) flag2=0;

                x=x/10;

            }

            if(flag1 && flag2) ans++;

     }

     cout<<ans<<endl;

      return 0;

} 

第五课:break和continue语句

重点内容:

1.break语句:在循环体中遇到break语句,就会立刻跳出循环体,执行循环结构后面的语句。

2.continue语句:在循环体中遇到continue语句,就会忽略本次循环的后续语句而去执行下一次循环。

典型例题:

1.用break语句:与7无关的数

#include<iostream>

using namespace std;

int main(){

     int n,ans=0;

     cin>>n;

     for(int i=1;i<=n;i++){

           int flag1=1,flag2=1;

           if(i%7==0) flag1=0;

           int x=i;

           while(x){

                 if(x%10==7){flag2=0;break;}

                 x=x/10;

          }

          if(flag1&&flag2) ans++;

    }

    cout<<ans<<endl;

    return 0;

}

2.用continue语句:与7无关的数

#include<iostream>

using namespace std;

int main(){

     int n,ans=0;

     cin>>n;

     for(int i=1;i<=n;i++){

            int flag=1;

            if(i%7==0) continue;

             int x=i;

             while(x){

                   if(x%10==7){flag=0;break;}

                   x=x/10;

            }

             if(flag) ans++;

        }

        cout<<ans<<endl;

         return 0;

}

3.素数的统计

输入两个正整数m,n,判断m,n之间(含m,n)一共有多少个素数。

#include<iostream>

#include<cmath>

using namespace std;

int main(){

     int m,n,i,j,ans=0;

     cin>>m>>n;

     for(i=m;i<=n,i++){

          for(j=2;j<sqart(i);j++)

                if(i%j==0) break;

            if(j<sqrt(i)) continue;

            ans++;

     }

     cout<<ans<<endl;

    return 0;

}

感受总结:

         已经学完了C++中的三大结构,虽然写程序对于我来说依旧很困难,但是通过这三大结构,基本可以解决所有问题,这也是让我很兴奋的。又可以掌握一项新技能啦!

        回想起前几天做程序题的时候,我现在还有一点小激动⊙∀⊙!每天晚上洗漱完了,一个宿舍的人都在床上举着手机打程序,有时做不出来,到了隔天早自习,还会接着做。一个程序平均要用2个小时,虽然很浪费时间,但每每做出一道题时心里的激动是无法形容的。有时一个很简单的问题,程序表达出来是很难的,可是越是这样,我越觉得我能做出来,就这样,我虽是个急性子,但是我还是忍着心里的烦躁与不甘,做完了所有题。在做题的过程中,我还上网搜了一些关于编程的小知识点,例如:我学会了setw()函数,等等。

           通过那几天的艰辛岁月,我也深深地相信写程序是真的会掉头发,也真的会让人上瘾。那几天我为了C++,我抛弃了数分和高代,希望老师不要生气啊!同时我也更加明确了我要学信息与计算科学这门专业的目标。

 

第六课:程序的调试与跟踪

重点内容:

1.静态查错:常见错误:语句顺序、思路、逻辑是否有误;语法是否有误,如关键字是否录入错误、变量是否没有定义就使用、变量的大小写问题、用错标点符号等 。还有其他常见的错误,如下:

(1)变量未赋初值

例如以下程序段是要输出a数组中的最大元素,但却没有给max赋初值,很有可能会造成输出答案错误(比如输入的全是负数)。   

 for(int i=1;i<=n;i++)

        if(a[i]>max) max=a[i];

   cout<<max<<endl;

(2)中间运算结果越界

例如以下几条语句:       

 int a=100000;

         int b;

         b=a*a/100;

         cout<<b<<endl;

很明显,100000*100000/100=100000000,但是输出结果是错误的。原因是C++在进行编译时,先计算出"a*a",把它放到一个中间变量中,然后再把"/100"放到b中。而"a*a"的结果超出了int范围,这就是造成错误的根本原因。

(3)if-else语句混乱

初学者在使用if-else语句的嵌套时经常会出错。if-else语句的规则是:if语句可以没有else语句与之相匹配;else语句总是与它前面的、最近的if语句匹配。例如下面这个例子:     

 if(条件a)

          if(条件b) 代码段b

     else 代码段a

本例的原意是让“代码段a”在"条件a"不成立时执行,但由于else语句总是匹配最近的if语句,因此这个else语句是与“if条件b”这个语句相匹配的。也就是说,代码段a要满足条件a成立,条件b不成立才会执行,与原意相差甚远。

(4)实数比较出错

在比较两个实数是否相等是,如果直接用等号,往往会造成错误。这是浮点运算所造成的。解决办法是使用两数差的绝对值与一个相对极小量进行比较。

2.通过添加输出语句调试程序

这是在C++中调试程序常用的方法。

但是,一定要注意,使用这种方法调试程序结束后,一定要删去或注解掉"调试语句"。

比如想查看以下程序中,当“x%i==0”成立时变量x和i的值,则可以在if语句里面输出这两个变量的值。

#include<iostream>

using namespace std;

int main(){

                int x;

                cin>>x;

                for(int i=2;i<x;i++){

                      if(x%i==0){

                           cout<<x<<" "<<i<<endl;  //用于查看x和i的值

                  。。。。。。。。。(此程序下面省略)

 

 

3.借助IDE的调试工具实施单步跟踪

 

感受总结:

调试程序是编程很重要的一步,虽然用IDE很是方便,但依赖性太强。就我而言,能发现自己的错误并能正确纠正,也是一种技能,是学好程序设计这门课的必备条件。在以后的学习中,希望我,也希望大家能塌下心来,一步一步,静水流深,不急不缓。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值