当前位置: 首页 > news >正文

嵌入式0基础开始学习 ⅠC语言(4)循环结构

0.问题引入

      求0~100数据之和:
         int sum = 0;
         sum = 1+2+3+4+....+100;
        
         废手,那么有没有一种好的方法取操作呢?
         
         int sum = 0;
         int i =1;
         sum = sum +i;  // sum = 0+1;
         i = i+1 ;     // i = 2;
        
         sum = sum +i ;
         i = i + 1;
        
         将上面的那两行代码重复执行100次,
         那么0~100和就出来了!
        
         循环!!!
         循环的本质==>重复!!!
         所有重复的代码,都可以用循环来实现。
        
         在c语言中,能达到循环效果的语句
              (1)for语句
              (2)while语句
              (3)do....while语句
              (4)goto 和 if 构成循环
            

1. goto语句

        goto “去哪儿”
        goto:无条件跳转
              让cpu到指定的地方去执行
              
        语句:
               goto 行标识符:
                    
                    行标识符:
                               标识符,用来表示某一行。
                               写在一行的最前面,不需要顶格,可以有空白符
                               
                    如:想办法让计算机重复执行如下两条语句
                            sum = sum +i ;
                            i = i + 1;
                            
                    loop :
                           sum = sum +i ;
                           i = i + 1;
                           goto loop;
                           
                        像上面的这个语句块,可以实现循环效果,重复执行“sum = sum +i ; i = i + 1;”
                        但是上面语句块,构成了一个死循环。
                        所以说,goto语句 一般需要和if语句配合使用,避免造成“死循环”
                        
                    如:想办法让计算机重复执行如下两条语句100次
                            sum = sum +i ;
                            i = i + 1;
                            
                           int sum = 0;
                           int i = 1;
                        loop:
                              sum = sum+i;
                              i = i +1;
                              if(i<=100)//循环次数在100之内
                              {
                                 goto loop;
                              }
                              
                练习:请各位大佬,写一个程序,求100以内3的倍数之和(用goto语句实现)//3,6,9,12
                        #include <stdio.h>
                         int main()
                         {
                            int sum = 0;
                            int i = 3;
                            loop:
                                 sum = sum +i;
                                 i = i+3
                                if(i<=99)
                                {
                                   goto loop;
                                }
                            printf("%d\n",sum);     
                         }
                        
                    NOTE:
                          建议要限制使用goto,
                          并不是goto语句有问题,但是使用goto语句的人有问题
                          建议不使用goto!!!
                         

2.while语句

            语法:
                    while(表达式)
                                循环体语句;
            执行顺序:
                       当(while)“表达式”的值为非0,则执行“循环体语句”,执行完循环体语句之后
                       再跳转到上面继续判断“表达式”的值;
                       ......
                       当(while)”表达式“的值为0,结束循环
            表达式: C语言中任意合法表达式都OBJK    
            语句:
                    单语句:只有一个;号的语句
                    复合语句:
                             {}/if/switch/while....
 
                    例子:
                          int i = 1;
                          int sum = 0;
                          while(i<=100)                        
                           sum = sum +i;
                           i = i+1;
                    上面的这个while,只能够管到    “sum = sum +i;”    这一行语句,表达式的值一直为真
                    所以上面是一个“死循环”,因为i的值,一直为1,“表达式”的值一直为1(永远为真)

                    so:
                        不管while后面有没有语句,先打一对{},以确定while循环的管辖范围

                练习:  
                        用while循环来实现:逆序输出一个非负数的各个位上面的数字。
                            12345
                            54321
                            
                        S1:    定义一个整型变量,从键盘赋值
                            int a;
                            scanf("%d",&a);
                        S2:输出a的个位上的数字
                            geiwe = a%10;
                            printf("%d",gewei);    
                        s3:然后干掉个位
                            a = a/10;
                        s4:回到s2,知道当a为0结束循环    

            上面的程序,能不能用do...while来实现?
                        int a;
                        scanf("%d",&a);
                        do
                        {
                          //输出个位上的数字
                           geiwe = a%10;
                           printf("%d",gewei);
                           a = a/10;                           
                        }while(a!=0);   

3.do....while

    语法:
            do
             {
                 循环体语句;
             }
              while(表达式);
        执行顺序:  
                   先执行“循环体语句”,然后再判断“表达式的值”,如果表达式的值为非0
                    则回到上面,继续执行“循环体语句”;
                    ....
                    直到“表达式”的值为0,结束循环

            例子:求1-100之和
                int i = 1;
                int sum = 0;
                do
                    sum += i;
                    i++;
                while(i<=100);
                
                "sum += i;
                  i++;" 这两行代码既不是单语句,也不是复合语句。
                          导致do没有和它匹配while,编译出错!!!
                
                建议:不管do后面有没有语句,先打一对{}!!!

        练习:
              求n!(n是用户输入的一个正整数)
              n! = 1*2*3*...*(n-1)*n
              
              int n;
              scanf("%d",&n);
              
              int i = 1;//变量累加
              int s = 1;//保存n!
              
              s =s*i ;//s = 1*1
              i++ ; // i = 2
              
              s = s*i; // s = 1*2
              i++;// i = 3
              .....
              重复语句
              
              do
              {
                 s = s*i;
                 i++;
              }
              while(i<=n);
              
              c语言代码;
                        int n;
                        scanf("%d",&n);
                        int i = 1;//变量累加
                        int s = 1;//保存n!
                        do
                       {
                         s = s*i;
                         i++;
                       }
                       while(i<=n);
                       printf("%d",s);
                      

4.for循环

        语法:
             for(表达式1;表达式2;表达式3)
                  循环体语句;
        执行顺序:先执行表达式1,然后再判断表达式2的值,如果为非0,则执行循环体语句,然后再跳到上面执行
                  再执行表达式3;
                  然后再判断表达式2的值;
                  ....
                  直到表达式2的值为0,结束循环
                  
            表达式1;表达式2;表达式3:
                  任意表达式都可以
                  并且“表达式1;表达式2;表达式3”都可以省略,但是两个;
                  是不能省略的!!!!
                  如果表达式2省略,则表示for循环的执行条件永远为真。
                  for(表达式1;;表达式3)
                    循环体语句;
                  ====》
                  for(表达式1;1;表达式3)
                     循环体语句;
                    
                例子:求1~100
                     int sum = 0;
                     int i;
                     for(i=1;i<=100;i++);// i=101
                      sum = sum +i;//sum = 0+101
                     printf("%d\n",sum);//101
                    
                     没有语法问题!!!
                               for循环中的“循环体语句”如果没有{},那么for语句它只能管到一个;!!!!
                               so:
                                   不管这个for后面有没有语句,先打一对{}
                                   for(;;)
                                   {
                                    
                                   }
                    
            练习:
                  1.打印所有的“水仙花数”(100-999)
                     水仙花数: 是一个三位数,并且这个三位数的个位,十位,百位上的数字的
                                立方和等于其本身。
                                
                                如:
                                   149 != 1*1*1 +4*4*4 +9*9*9
                                   
                                 思路;
                                      x为一个三位数
                                      a,b,c分别为x的个位,十位,百位
                                      
                                      x = 100
                                      a = x%10
                                      b = x/10%10
                                      c = x/100
                                      if(a*a*a+b*b*b+c*c*c)
                                      {
                                         printf x
                                      }
                                      
                                      x++
                                       
                                      a = x%10
                                      b = x/10%10
                                      c = x/100
                                      if(a*a*a+b*b*b+c*c*c==x)
                                      {
                                         printf x
                                      }
                                      .....
                                   
                    c语言代码:
                                int x,a,b,c;
                                for(x=100;x<1000;x++)
                                {
                                  a = x%10;
                                  b = x/10%10;
                                  c = x/100;
                                  if(a*a*a + b*b*b + c*c*c ==x)
                                  {
                                     printf("%d\n",x);
                                  }
                                }
                                153,370,371,407
                                
                  2.判断一个整数是否为质数
                     质数:除了1和它本身之外,没有其他的因数,称之为质数
                    
                    伪代码;
                            i =>[2,x-1]
                            scanf x
                            i= 2
                            x%i == 0?
                            
                            i++                            
                            x%i == 0?
                            
                            i++                            
                            x%i == 0?
                        
                        int i,x;
                        scanf("%d";&x);
                        int flag = 0; // 0 -是质数
                                      // 1 -不是质数
                        for(i=2;i<x;i++)
                        {
                           if(x%i==0)
                           {
                             flag =1;
                             break;
                           }
                           
                        }
                        if(flag==0)
                        {
                           printf("shi");
                        }
                        else
                        {
                          printf("bushi");
                        }
                    
                  

5.break 和 continue

    break:
        break 语句只能用在switch语句和循环体语句(while/for...)中,
                (1)break用在switch中,用来跳出它所属的switch语句
                (2)break用在循环体中,用来跳出它所属的那一个循环的。
        一句话 break“跳出”
        switch或循环体,是不是一定要用到break?
            不一定,看您的心情!!!

    continue:
         continue只能用在循环体中(while/for...)中,
         表示结束本次循环,继续下一次循环!!!1
        
         例子:
               输出如下数组元素值,除了值为5的那一个元素
                int a[10] ={1,2,3,4,5,6,7,8,9,10};
                
                int i;
                for(i=0;i<10;i++)
                {
                   if(a[i]==5) //i == 4
                   {
                      continue;
                   }
                   printf("%d\n",a[i]);
                }
                    
        练习:
            1. 求1000以内所有的完数
                完数:是指除了本身以外所有的因子之和等于其本身
                如:
                    6:1 2 3
                    6 == 1+2+3
                    分析:
                          1~1000
                          满足:它的因子之和(除去本身)等于它本身(1~x/2)
                          2:
                              1 !=2
                          3: 1 !=3
                          ...
                          x= 1
                              if x所有的因子之和 == x
                                   printf x
                               x++
                          x = 2
                               if x所有因子之和 == x
                                   printf x
                               x++
                               
                            =》
                                int x,i,sum;
                               for(x=2;x<1000;x++)//2~1000 的数
                               {
                                   sum = 0;
                                   for(i=1;i<=x/2;i++) //i:因子 范围[1,x/2]
                                   {
                                       if(x%i==0)
                                       {
                                          sum += i;//sum = sum +i
                                       }
                                   }
                                   if(sum==x)
                                   {
                                      printf("%d\n",x);
                                   }
                               }
            
            2.求两个整数m,n 最大公约数,最小公倍数(m,n是从键盘输入的数字)
                 最小公倍数 = m*n/最大公约数
                
                 最大公约数:
                             m %l ==0
                             n %l ==0
                             l是m,n的一个公约数
                            
                             设g是为m,n的最大公约数。
                             g=>[1,min(m,n)]
                             满足:m%g==0 && n%g==0
                             从(m,n)中最小的那一个数开始找
                                x = min(m,n);
                                   if x是不是m,n 的一个公约数
                                      则x就是最大公约数
                                
                                x--
                                ....
                                
                            for(x=min(m,n);x>0;x--)
                            {
                               if(m%x==0&&n%x==0)
                               {
                                 x就是最大公约数
                                 break;
                               }
                            }

回顾:
       1.goto .....if...
            goto 无条件跳转指令
   
       2.while 语句
            while (表达式)
                   循环体语句;
    
       3.do....while
            do
            {
                循环体语句;
            }            
            while(表达式);
        
        4.for 语句
            for(表达式1;表达式2;表达式3)            
               循环体语句;
            执行顺序:
        
        5.break 和 contiune
        


    
练习:
            1. 请大家输入自己的生日(y-m-d),求自己在这个世界上浪费了多少天的公粮!!!
                1.你出生的那一天到那一年的年末还有多少天
                   switch(m)
                   {
                      case 1:
                              d1 += 31;
                      case 2:
                              if(y是闰年)
                                  d1 += 29;
                               else
                                  d1  +=28;
                      case 3:
                          .....
                                   
                   }
                  d1= d1 -d;
                  
                2.你出生的第二年年初---2022年年末一共多少天
                for(i=y+1;i<year-1;i++)
                {
                   if(i是不是闰年)
                       d2 +=366;
                    else
                       d2 +=365;
                }
                3.2023已经过了多少天
            2.求Sn = a + aa +aaa +...+....(n个a)
              其中,n,a都是由用户输入
              a =>[0,9]
              
              如:
                  n = 5, a=2
                 Sn = 2+22+222+2222+22222
                
                求和:
                       求第ai项
                       累加
                       sum + ai ->sum
                       
                例子:a = 2;
                      n = 5;
                      ai = 0;
                      Sn = 2 + 22+222+2222+22222;
                      
                      i = 0
                      ai = ai*10+a
                      sum+=ai;
                      
                      i = 1
                      ai = ai*10+a;
                      sum +=ai;
                      
                     for(i=0;i<n;i++)
                     {
                         ai = ai*10+a;
                         sum += ai;
                     }
                       
                                

            3.求10000000!末尾有多好个0    
               只要有一对2*5 末尾就会产生一个0
               
               将1*2*3*.....*10000000进行质因数分解
               只需要求分解质因数之和5的个数即可
               
               int count =0; //记录末尾的0的个数
               for(x=5;x<10000000;x+=5)
               {
                  int i = x;
                  while(i%5==0)
                  {
                      count++;
                      i = i/5;
                  }
               }

            4.1024的655次方最后三位数是多少?
              p = 1;
              for(n = 1;n<=655;n++)
              {
                  p= p*1024;
                  p = p%1000;
              }

 5,下面程序的功能是把316表示为两个加数的和,使两个加数分别能被13和11整除,请选择填空

(C)

#include<stido.h>

main()

{

int i=0,j,k;

do{i++;k=316-13*i;}while(__);

j=k/11;

printf("316=13*%d+11*%d",i,j);

}
          
A,k%11==0                 B,k/11

C,k%11                        D,k/11==0

6,设j和i都是int型,则以下for循环语句(B)

for(j=0,k=-1;k=1;j++,k++)

printf("****\n");

A,循环体一次也不执行

B,是无限循环

C,循环结束的条件不合法

D,循环体只执行一次

7有以下程序段

int n=0,p;

do

{

scanf("%d",&p);

n++;

}while(p!=12345&&n<3);

此处do-while循环结束的条件为?

(p的值等于12345或者n的值大于等于3)

8,以下叙述正确的是?(C)

A,用do-while构成循环时,只有在while后的表达式为非0时结束循环

B,do-while语句构成的循环不能用其他语句构成的循环来代替

C,用do-while构成循环时,只有在while后的表达式为零时结束循环

D,do-while语句构成的循环只能用break语句推出

9,以下程序的输出结果是?(10)

int k,j,s;

for(k=2;k<6;k++,k++)

{

s=1;

for(j=k;j<6;j++)

s+=j;

}

printf("%d\n",s);

10,以下程序段中,能够正确执行循环的是(B)

A,static int a;while(a)

B,int s=6;do s-=2;while(s);

C,for(i=1;i>10;i++)

D,int s=6;m:if(s<100)   exit(0);  else  s-=2;  goto  m;

11,以下程序中,while循环的循环次数是(死循环,不确定次数)

main()

{

int i=0;

while(i<10)

{

if(i<1)   continue;

if(i==5) break;

i++;

}

}

12,以下程序段的输出结果是?(1  -2)

int x=3;

do

{

printf("%3d",x-=2);

}while(!(--x));

13,下面程序的运行结果是?(0)

#include <stido.h>

main()

{

int y=10;

do{y--;}while(--y);

printf("%d\n",y--);

}

14,下面程序段的输出结果是?  (11)

int i=0,sum=1;

do

{

sum+=i++;

}while(i<5);

printf("%d\n",sum);

15,有以下程序段:

s=1.0;

for(k=1;k<=n;k++)

s=s+1.0/(k*(k+1));

printf("%f\n",s);

请填空,使下面的程序段的功能完全与之等同,

s=0.0;

d=1.0;

k=0;

do

{

s+=d;

____;

d=(1.0)/(k*(k+1));

}while(____);

printf("%f\n",s);

(k++            k<=n)

16,下列程序的功能是输入一个整数,判断其是否为素数,如果为素数输出1,否则输出0,请填空

main()

{

int i,x,y=1;

scanf("%d",&x);

for(i=2;i<___;i++)

{

if(___){y=0;break;}

}

printf("%d\n",y);

}

(x/2    x%i==0)

17,执行以下程序后的输出结果是?(5,4,6)

{

int a,b,c,d,i,j,k;

a=10;b=c=d=5;i=j=k=0;

for(;a>b;++b)

i++;

while(a>++c)

j++;

do

k++;

while(a>d++);

printf("%d,%d,%d",i,j,k);

}

18,如果一次输入字符AB,在以下while语句执行后ch的值是?(0)

while(ch=getchar()=='A');

http://www.lryc.cn/news/353996.html

相关文章:

  • 【JAVASE】抽象类
  • 嵌入式硬件中PCB走线与过孔的电流承载能力分析
  • 动态规划之背包问题中如何确定遍历顺序的问题-组合or排列?
  • 开源大模型与闭源大模型
  • python+selenium - UI自动框架之封装查找元素
  • java 拦截器-用户无操作超时退出利用Redis
  • 民国漫画杂志《时代漫画》第16期.PDF
  • 线程池以及日志类的实现
  • 基于长短期记忆网络 LSTM 的送餐时间预测
  • K-means聚类算法详细介绍
  • SAP FS00如何导出会计总账科目表
  • ROS参数服务器
  • QCC---DFU升级变更设备名和地址
  • [力扣题解] 695. 岛屿的最大面积
  • AI模型发展路径探析:开源与闭源,何者更胜一筹?
  • concurrency 并行编程
  • JavaScript如何让一个按钮的点击事件在完成之前禁用
  • 透视App投放效果,Xinstall助力精准分析,让每一分投入都物超所值!
  • 【Linux杂货铺】进程通信
  • 常用API(正则表达式、爬取、捕获分组和非捕获分组 )
  • JVM学习-Class文件结构②
  • 数据库连接项目
  • MySQL--InnoDB体系结构
  • ffplay 使用文档介绍
  • 四种网络IO模型
  • Mixed-precision计算原理(FP32+FP16)
  • Go 控制协程(goroutine)的并发数量
  • web安全渗透测试十大常规项(一):web渗透测试之CSRF跨站请求伪造
  • YOLOv10尝鲜测试五分钟极简配置
  • 社交媒体数据恢复:聊天宝