C++ 循环结构   的课堂笔记以及知识点

#include "iostream"
using namespace std;
int main()
{ int i;
  cin>>i;
  switch(i)
 {  
   case 1:
   case 2: putchar('i');
   case 3: cout<<i<<endl; break;
   default: cout<<"OK!\n";
 }
 return 0;
}
******switch()语句的执行过程
首先从键盘上输入一个整数,赋给整型变量i,
然后将i的值和case 后面的值进行比较,如果输入i的值等于1,则执行putchar('i')语句,该语句的作用是输出字符常量i,即字符i
执行完之后由于putchar('i')后面没有break语句,所以会继续执行cout<<i<<endl;语句,即输出整型数1,由于后面有break,所以会跳出switch()语句。
运行结果:输入1回车得到i1
运行结果:输入2回车得到i2
          输入3回车得到3
          输入1、2、3以外的数回车得到OK!




*******编程时书写while循环语句要养成的良好书写习惯:
第一步:
  while(  )
  {
   
  }
第二步:
 往圆括号( )内添加循环控制条件表达式(满足什么条件要循环);
 往花括号内{ }添加循环体语句(也就是每次循环要干什么);
第三步:
 往while(){}前面添加循环初值表达式(即循环从什么时候开始)。


这样写的好处可以避免很多易犯的错误:
 1、忘了在表达式外面加圆括号,例如while x==1的写法是错误的;
 2、很多同学经常会在圆括号外面加上一个分号,例如很多同学经常写成以下形式:
a=1;   
while(a<10);
{ sum+=a;a++;}
    
 这种写法是错误的。
 3、当满足条件时要执行多条语句时,很多初学者容易忘了加上花括号,即很多同学经常写成以下形式:
   while(a<10)
    sum+=a;a++;
   这种写法是错误的。


******编写循环结构程序的关键是从问题描述中提取出循环三要素:
1、循环从什么时候开始(循环初值表达式)
2、满足什么条件要循环(循环控制条件表达式)
3、每次循环要干什么(循环体语句)


例:要计算1+2+3+...+100,即求出前100个自然数的和。
#include "iostream"
using namespace std;
int main()
{
  int sum,i;
  sum=0;
  i=1;       //添加循环初值表达式,即循环从什么时候开始
  while(i<=100) //添加循环控制条件表达式:当i<=100时候要循环
  {
     sum=sum+i;
     i++;    
     //添加循环体语句,即每次循环要干什么
  }
  cout<<"1+2+...+100="sum<<endl;  
  return 0;
}


****编程时书写do-while循环语句要养成的良好书写习惯:
第一步:
  do
  {
   
  }while();
第二步:
  往花括号内{ }添加循环体语句(也就是每次循环要干什么);
  往圆括号( )内添加循环控制条件表达式(满足什么条件要循环);
第三步:
 往do{}while;前面添加循环初值表达式(即循环从什么时候开始)。


#include "iostream"
using namespace std;
int main()
{
 int sum, i;
 sum=0; 
 i=1;
 do
  {
    sum=sum+i;
    i=i+1;
  }while(i<=100);
  cout<<"1+2+...+100="sum<<endl;
  return 0;
}




******提出问题:上例中循环体语句的顺序能颠倒吗?
答案是否定的。why?自己消化理解。颠倒以后的结果是多少?答案是5150,why?它计算的不是1+2+...+100,而是2+3+...+101.


while和do-while循环的最大区别就是:
while循环体执行的次数为大于等于0次;而do-while循环体执行的次数为大于等于1次。




*******编程时书写for循环语句要养成的良好书写习惯:
第一步:
  for(;;)
  {
   
  }
第二步:
  往圆括号()内添加三个表达式,第一个表达式为循环初值表达式(即循环从什么时候开始),放在圆括号内第一个分号的前面;第二个表达式为循环控制条件表达式(即满足什么条件要循环),放在圆括号内第二个分号的前面;第三个表达式为循环增量表达式(即每次循环时循环变量的变化情况),放在圆括号内第二个分号的后面;
  往花括号内{ }添加循环体语句(也就是每次循环要干什么),不包括循环增量表达式。


#include "iostream"
using namespace std;
int main()
{  
  int sum,i;
  sum=0;
  for(i=1;i<=100;i++)
  {
    sum=sum+i;
  }
  cout<<"1+2+...+100="<<sum<<endl;  
  return 0;
}
上面for循环语句的执行顺序:
第一步:执行i=1;
第二步:对表达式i<=100进行判断,判断结果有两种情况:
 若i<=100为真,则先执行sum=sum+i;然后再执行i++,执行完i++之后重新回过头去判断i<=100;
 若i<=100为假,则跳过for循环执行for循环体后面的语句。


*****for语句最规范的写法:


  for(表达式1;表达式2;表达式3)
  { 
    语句;
  }
例如:
for(i=1;i<=100;i++)
  {
     sum+=i;
   }


*****在所有的循环语句当中,for语句用的场合最多,因为它最灵活,我们可以对它做各种形式的变换。


第一种:省略表达式1,但分号不能省略(省略不是删除,而是将表达式1进行外上提):
i=1;
for(;i<=100;i++)
  {
     sum+=i;
   }


第二种:省略表达式2,分号不能省略,但需要在循环体中加上条件判断语句控制循环的结束。
for(i=1;;i++)
  {
     sum+=i;
     if(i>100) break;
   }


第三种:省略表达式3(省略不是删除,而是将表达式3进行内下放,注意内下放的顺序):
for(i=1;i<=100;)
  {
     sum+=i;
     i++;
   }


省略循环体(即让循环体变成空语句,同时将原来的循环体语句放在表达式3的前面,而且要注意的时循环体语句和表达式3之间是用逗号隔开,不是用分号隔开,因为for语句圆括号内只能有三个表达式):
for(i=1;i<=100;sum=sum+i,i++)
{  
  ;







*******编写循环语句时最忌讳死循环
死循环经典名言:如果你从来没有碰到过死循环,那么你一定不是一个编程高手。










******break和continue的最大区别有两点:
第一点:break是退出当前层循环,而continue的作用是结束本次循环,继续下一次循环;
第二点:break除了可以用于循环结构当中,还可以用于switch语句当中,但不能用于if语句。
   continue只能用于循环语句中,不能用于其他语句,包括switch语句。


*****break语句的程序举例:
例如:求555555的约数中最大的三位数是多少?
解题思路:
1、理解题意,想一下该用什么语句来实现?答案是for语句
2、做到灵活性,题目虽然规定是求555555的约数中最大的三位数,但是有实际应用价值的程序应该是求任何一个数的约数中最大的三位数,这也就是说编程中需要用到输入语句来灵活输入任何一个数;
3、提取关键字,联想一下需要用到哪些知识点,第一个关键字是约数,什么叫约数?能够被它整除的数,C++中如何判断某一个数是否被它整除?用求余运算符%来实现;讲到求余运算符,大家立马要想起一点:求余运算符的运算对象必须是整型,而且余数的符号是与被除数相同的,例如(-19)%(-4)=-3。第二个关键字是三位数,如何判断某一个数是三位数:i属于100到999之间;第三个关键字是最大的三位数,即循环应该从999开始。
4、接下来就尝试编程


 #include "iostream"
 using namespace std; 
 int main()
 {
    int num,i;
    cin>>num;
    for(i=999;i>=100;i--)
    {
      if(num%i==0)
      {
        cout<<"最大的三位约数是"<<i<<endl;
      }
    }
    return 0;
 }


以上程序的功能是:按从大到小的顺序依次输出能够被num整除的三位数。
但是这个题目的意思是只需要求最大的三位数的约数,也就是说找到了第一个最大的三位数约数之后不要继续找其他的三位数约数了。即需要用break语句跳出整个循环,即程序应该修改为如下形式:
 #include "iostream"
 using namespace std; 
int main()
 {
    int num,i;
    cin>>num);
    for(i=999;i>=100;i--)
    {
      if(num%i==0)
      {
        cout<<"最大的三位约数是"<<i<<endl;
        break;
      }
    }
  return 0;
 }




*****continue语句的程序举例:
编程实现从键盘中输入10个整数,求其中正整数的和以及正整数的个数。


对于这个程序该怎么编?
第一大步:先编写一个从键盘上输入10个整数,求这10个整数的和。
找循环三要数:
1、从什么时候开始循环,i=1;
2、满足什么条件要循环,i<=10;
3、每次循环要干什么,要做三步操作,第一步从键盘输入一个数,用cin语句实现,第二步将当前输入的数(例如n)进行累加,用sum+=n;第三步是对计数器加1.


用什么语句实现?答案是for语句。


int i, n, sum=0;
for(i=1;i<=10;i++)
{
  cin>>n;
  sum+=n;   
}


第二大步,进行细化。
在第一大步的操作中我们没有对整数进行分类,而题目要求我们是求正整数的和及正整数的个数,即忽略统计负整数和0的值。
int i, n, sum=0,count=0;
for(i=1;i<=10;i++)
{
 cin>>n;
 if(n<=0){continue;} 
 sum+=n;  
 count++; /*count是用来统计正整数的个数*/
}
cout<<"正数的个数是:"<<count<<"正数的和是:"<<sum<<endl;




****如果改成要求任意输入的10个整数中正整数的个数以及平均值该怎么办?


根据数学知识,平均值等于和除以个数。
c++中表示除法用/运算符,注意C++中除法运算和数学中除法运算的区别。c++中除法运算,当两个运算对象都是整数的时候,结果也为整数。即5/2=2而不是等于2.5.


1 2 5 -2 -6
int i, num, count=0,sum=0;
for(i=1;i<=10;i++)
{
  cin>>num;
  if(num>0)
  {
     count++;
     sum=sum+num;
  }
  else continue;

cout<<"正数的个数是:"<<count<<"正数的平均值是:"<<1.0*sum/count<<endl;


****以上程序仍然得不到满分,why?
因为有可能输入的10个整数没有一个是正整数。这也就意味着count=0,而除法运算中允许分母为零吗?答案是不允许。具体代码大家课后去完善。


*******关于素数的判断:
9不是一个素数,因为9能被3整除;
11是一个素数,因为11只能被1和11整除,判断11能不能被2整除,如果不能,继续判断11能不能被3整除,一直要判断到11能不能被10整除为止。从这里我们可以看出来判断某一个数是否为素数,就应该从2开始,重复判断该数能否被2以及后面的一些整数(直到该数-1为止)整除。


 cin>>m
 for(i=2;i<=m-1;i++)
 {
   if(m%i==0)
   {
      cout<<m<<"不是一个素数!\n";
      break;
   }
 }




****在这个for循环语句当中,退出循环有两种情况:
第一种:如果它不是素数,例如9,此时应该是通过break语句退出的;退出循环时i=3,仍然满足i<9的条件;
第二种:如果它是一个素数,例如11,此时break语句永远不会执行,说明循环的退出不是通过break语句实现,但一个有意义的程序不可能是死循环,意味着for语句肯定会正常终止,正常终止的条件是循环控制条件表达式为假的情况,即i==m的情形。
m=11时:
第一次i=2:
  2<=10,所以进入循环,但if条件不满足,却仍然要执行i++;此时i变为3;
第二次i=3:
  3<=10,所以进入循环,但if条件不满足,却仍然要执行i++;此时i变为4;
......


第九次i=10:
   10<=10,所以进入循环,但if条件不满足,却仍然要执行i++;此时i变为11;


第10次i=11:
   11<=10吗?答案是否定的,所以应该要退出循环,此时i=11,而11就是m,因此退出循环时i==m.


因此要实现判断m是否为素数的程序代码段应该描述如下:


 cin>>m;
 for(i=2;i<=m-1;i++)
 {
   if(m%i==0)
   {
      cout<<m<<"不是一个素数!\n";
      break;
   }
 }
 if(i==m)  {cout<<m<<"是一个素数!\n";}




******判断m是否素数
  素数:只能被1和它本身(m)整除的数,也就是说不能被2、3、4、...、m-1整除的数。


  k=sqrt(m); /*m的平方根*/
  for(i=2;i<=k;i++)
   if(m%i==0)   break;
对于此for循环,结束循环有两种情形:
第一种:通过i>k正常结束循环.意味着m是素数。例如m=17,sqrt(17)<5,所以只需要判断17能否被2、3、4整除就可以了,根据所学知识,可以得知17不能被2、3、4整除,退出循环的时候i=5.但17是素数。
第二种:通过break非正常结束.意味着m不是素数。例如m=16, 由于16能被2整除,所以不要继续判断他能不能被3、4整除,应该立即退出循环。


*******将1、2、3、4组成任意的三位数输出
  设i为个位数,j为十位数,k为百位数。
  for(i=1;i<=4;i++)
    for(j=1;j<=4;j++)
       for(k=1;k<=4;k++)    
        { cout<<k*100+j*10+i<<" ";}






*******将1、2、3、4组成任意互不相同的三位数输出。


设i为个位数,j为十位数,k为百位数。
for(i=1;i<=4;i++)
    for(j=1;j<=4;j++)
       for(k=1;k<=4;k++)
         { if(i!=j && i!=k && j!=k)
               { cout<<k*100+j*10+i<<" ";}
          }


程序运行结果:
123 132 124 142 134 143 213 214 231 242 234 243 312 321 314 341 324 342 412 421 413 431 432 423  


以上循环的执行过程:
 i=1:
     j=1:
         k=1:cout语句不执行
         k=2:cout语句不执行
         k=3:cout语句不执行
         k=4:cout语句不执行
     j=2:    
         k=1:cout语句不执行
         k=2:cout语句不执行
         k=3:cout语句执行,输出123
         k=4:cout语句执行,输出124
     j=3:    
         k=1:cout语句不执行
         k=2:cout语句执行,输出132
         k=3:cout语句不执行
         k=4:cout语句执行,输出134
     j=4:    
         k=1:
         k=2:
         k=3:
         k=4:


i=2:
     j=1:
         k=1:
         k=2:
         k=3:
         k=4:
     j=2:    
         k=1:
         k=2:
         k=3:
         k=4:
     j=3:    
         k=1:
         k=2:
         k=3:
         k=4:
     j=4:    
         k=1:
         k=2:
         k=3:
         k=4:


将1、2、3、4组成任意互不相同的三位数输出,并统计符合条件的个数。
count=0;
for(i=1;i<=4;i++)
    for(j=1;j<=4;j++)
       for(k=1;k<=4;k++)
          if(i!=j && i!=k && j!=k)
               {
                 cout<<k*100+j*10+i<<" ";
                 count++;
                }
cout<<"符合条件的个数是:"<<count;


程序运行结果:123 132 124 142 134  143 213 214 231 242 234 243 312 321 314 341 324 342 412 421 413 431 432 423符合条件的个数是:24




将1、2、3、4组成任意互不相同的三位数输出,每行控制输出3个数。
count=0;
for(i=1;i<=4;i++)
    for(j=1;j<=4;j++)
       for(k=1;k<=4;k++)
          if(i!=j && i!=k && j!=k)
               {
                 cout<<k*100+j*10+i<<" ";
                 count++;
                 if(count%3==0)
                   cout<<endl;
                }


程序运行结果:
123 132 124
142 134 143
213 214 231
242 234 243
312 321 314
341 324 342
412 421 413 
431 432 423



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值