首页 > 其他分享 >C语言-循环结构

C语言-循环结构

时间:2024-09-25 20:23:08浏览次数:3  
标签:语句 10 int sum C语言 循环 printf 表达式 结构


0.引入 

    例子: 求100以内所有整数之和 
        int sum = 1 + 2 + 3 + ... + 100; 

        int sum = 0;
        int i = 1;

        sum = sum + i;
        i++;            //上述的两个语句重复100次 

    循环的本质就是重复, 所有重复的代码都可以使用循环来实现

    在C语言中, 能够实现循环效果的语句:
        while() 
        for()
        do while() 
        goto 


1.goto语句 

    goto 去哪儿 

    goto就是无条件的跳转语句, 让CPU到指定的地方去执行语句

        语法: 
            行标识符: 
                ....
                goto 行标识符;

                    "行标识符": C合法的标识符, 用来标记某一行
                                行标识符一般是写在一行的最前面,允许行标识符前面有空白符(空格,tab)

            例子: 
                求100以内所有整数之和

                    int sum = 0;
                    int i = 1;

                loop:
                    sum = sum + i;
                    i++;

                    goto loop;

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

                上面的代码,是一个死循环 
                因此 
                    一般goto语句是和 if语句 搭配使用,避免死循环 
            ===> 
                    int sum = 0;
                    int i = 1;

                loop:
                    sum = sum + i;
                    i++;
                    if( i <= 100 )
                    {
                        goto loop;
                    }
                    printf("sum = %d\n", sum );

        注意: 
            goto语句本身是没有任何问题的,但是goto语句过于灵活,是无条件跳转,导致程序的可读性变差 


            练习: 
                1) 请用goto语句实现 求100以内所有3的倍数之和 
                        
                        int sum = 0;
                        int i = 1;

                    loop:
                        if( i%3 == 0 )  //3的倍数
                        {
                            sum = sum + i;
                        }
                        i++;

                        if( i <= 100 )
                        {
                            goto loop;
                        }

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

                方法二: 
                        int sum = 0;
                        int i = 3;

                    loop:
                        sum = sum + i;
                        i += 3;
                        if( i <= 100 )
                        {
                            goto loop;
                        }
                        printf("sum = %d\n", sum );

2.while()语句 

    语法: 
            while( 表达式 )
            {
                语句; 
            }

            先判断"表达式"的值,如果为真(非0), 那么就执行语句, 执行完之后,
                    再次去判断"表达式"的值, .... 
                如果表达式的值为假(0), 退出循环 

                "表达式": 任意一种c语言合法的表达式都可以 
                "语句": 
                        单语句: 只有一个;的语句 
                        复合语句: 用{}括起来的语句 
                编程建议: 都把{}写上  

            例子: 
                求100以内所有整数之和 

                    int sum = 0;
                    int i = 1;

                    while( i <= 100 )
                    {
                        sum = sum + i;
                        i++;
                    }

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

            
            练习: 
                1)用while语句, 实现逆序输出一个非负整数 
                    输入: 12345
                    输出: 54321

                        x = num % 10;       --> 5 
                        num = num / 10;     --> 1234 

                        x = num % 10;       --> 4 
                        num = num / 10;     --> 123

                        x = num % 10;       --> 3
                        num = num / 10;     --> 12

                        ...
                ===> 

                        int num;
                        scanf("%d", &num );

                        int n = 0;

                        while( num )
                        {
                            //方法一: 单独打印每一个位 
                            //int x = num % 10;   
                            //printf("%d", x );

                            //方法二:合成一个新的数
                            n = n * 10 + num%10;

                            num = num / 10;
                        }
                        printf("%d\n", n );

3. do while 语句 

    语法: 
            do 
            {
                语句;
            }while( 表达式 );

            先无条件的执行一次"语句", 再去判断"表达式"的值 
                如果表达式的值为真(非0), 那么就继续执行该"语句", 执行完之后, 再去判断表达式 ...
                如果表达式的值为假(0), 则退出循环 

                "表达式": 任意一种c语言合法的表达式都可以 
                "语句": 单语句 或者 复合语句 

                编程建议: 都把{}写上 

            例子: 
                求100以内所有3的倍数之和 

                    int sum = 0;
                    int i = 3;

                    do 
                    {
                        sum = sum + i;
                        i = i + 3;
                    }while( i <= 100 );

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


            练习: 
                1)用 do while语句, 实现求n的阶乘 n!
                    例子: 
                        5! = 1*2*3*4*5; 

                            0! = 1;
                            1! = 1;
                            2! = 1*2;
                            3! = 1*2*3;
                            ...
                            n! = ?  --->  n! = 1*2*3*...*(n-1)*n; 
                  ===>


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

                        unsigned long s = 1;
                        if( n == 0 || n == 1 )
                        {
                            printf("%d! = %lu\n", n , s );
                            return 0;
                        }

                        int i = 1;
                        do 
                        {
                            s = s * i;
                            i++; 
                        }while( i <= n );

                        printf("%d! = %lu\n", n, s );

4.for()语句 

    语法: 
            for( 表达式1 ; 表达式2 ; 表达式3 )
            {
                语句;
            }

            首先,先无条件的执行一次"表达式1", 再去判断"表达式2"的值 
                    如果"表达式2"的值为真(非0), 那么就执行语句, 再去执行"表达式3", 一次循环完毕; 
                        从第二次循环开始,就不会再去执行"表达式1"了, 直接再去判断"表达式2"的值, .... 

                    如果"表达式2"的值为假(0), 则退出循环 

                
                for循环 可以 等价于 while循环 
                    ==>     表达式1; 
                            while( 表达式2 )
                            {
                                语句;
                                表达式3;
                            }

                注意: 
                    for()循环中的3个表达式都可以省略的, 但是 分号;一定不能省略 
                        其中 如果"表达式2"为空, 意味着 是一个死循环 
                                for(;;)  <==>  while(1)     //死循环 

                    while循环一般更加注重循环条件,  for循环一般更注重循环次数(范围)

                
                例子: 
                    求100以内所有整数之和 

                    int sum = 0;
                    int i;
                    for( i=1; i<=100; i++ )
                    {
                        sum = sum + i;
                    }
                    printf("sum = %d\n", sum );

                
                练习: 
                    1)打印 1000以内的所有的"水仙花数" 
                        水仙花数: 是一个三位数, 且 个位,十位,百位的立方 之和 等于其本身 
                        例如: 
                            153 = 1*1*1 + 5*5*5 + 3*3*3

                            int i; 
                            int g,s,b;  //分别保存的个位,十位,百位 

                            for( i=100; i<1000; i++ )
                            {
                                g = i % 10;         //个位
                                s = i /10 % 10;     //十位
                                b = i / 100 % 10;   //百位

                                if( i == g*g*g + s*s*s + b*b*b )
                                {
                                    printf("%d\n", i );
                                }
                            }


                    2)打印 0~20以内 不是3的倍数 的数 

                        /*
                            int i;
                            for( i=0; i<20; i++ )
                            {
                                if( i%3 != 0 )    //不是3的倍数
                                {
                                    printf("%d ", i );
                                }
                            }
                            putchar('\n');
                        */

                        int i;
                        for( i=0; i<20; i++ )
                        {
                            if( i%3 == 0 )    //是3的倍数
                            {
                                continue;
                            }
                            printf("%d ", i );
                        }
                        putchar('\n');


5. break 和 continue 的作用

    1) break语句 只能用在 switch 和 循环语句(for/while/do while)中 
                break语句 在switch语句中的作用, 跳出它所在的switch语句 
                break语句 在循环语句中的作用, 用来跳出它所在的循环(结束循环) (一层)

    2) continue语句 只能用在循环语句中 
                用来结束当前这一次循环,开始下一轮循环  

            
            练习: 
                1) 判断一个正整数是否为质数 
                    质数: 除了1和它本身以外,不能被其他任何数整除 

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

                        int i;
                        for( i=2; i<n; i++ )
                        {
                            if( n%i == 0 )
                            {
                                printf("No\n");
                                return 0;
                            }
                        }
                        printf("Yes\n");
                        return 0;

                    方法二: 标志位 

                        int flag = 1;   //1表示是质数, 0表示不是质数
                        int n;
                        scanf("%d", &n );

                        int i;
                        for( i=2; i<n; i++ )
                        {
                            if( n%i == 0 )
                            {
                                flag = 0;
                                break;
                            }
                        }

                        if( flag )
                        {
                            printf("Yes\n");
                        }
                        else 
                        {
                            printf("No\n");
                        }


        ===================================
            头文件的引用 
                #include <>  从系统标准的头文件路径下进行搜索   (如: /usr/include/ )
                #include ""  先从当前的工程路径下进行搜索, 再从系统标准的头文件路径下进行搜索

练习:
        1) 求表达式 Sn = a + aa + aaa + ... + aa....aaaaa(n个a)的值 
            其中 n和a的值 由键盘输入 
                例如: 
                    n=5, a=2
                    Sn = 2 + 22 + 222 + 2222 + 22222  

                    a1 = 2              a1 = a 
                    a2 = 22             a2 = a1*10 + a  
                    a3 = 222            a3 = a2*10 + a 
                    a4 = 2222           a4 = a3*10 + a 
                    ...
                    an = a(n-1) * 10  + a 
                ===> 

                    int main()
                    {
                        int n,a;
                        scanf("%d%d", &n, &a );

                        int Sn = 0;
                        int an = 0;

                        int i;
                        for( i=0; i<n; i++ )
                        {
                            an = an * 10 + a;
                            Sn = Sn + an;
                        } 

                        printf("Sn = %d\n", Sn );
                    }

        2) 求1000以内 所有的完数 
            完数: 除去这个数本身以外的 所有因子之和 等于其本身 
            例如: 
                6的因子 1,2,3 (6本身除外)
                 6 == 1+2+3 

                 1)从1遍历到1000
                 2)求每一个数的所有因子之和 (本身除外)
                 3)判断因子之和是否等于其本身
                 4)满足条件就输出 


                    int main()
                    {
                        int i,n;
                        int sum = 0;

                        for( n=1; n<1000; n++ )     //从1遍历到1000
                        {
                            sum = 0;    //每次计算新的因子之和 都需先清0

                            for( i=1; i<n; i++ )    //找出n的所有因子(本身除外)
                            {
                                if( n%i == 0 )  
                                {
                                    sum += i;
                                }
                            }

                            //判断因子之和是否等于其本身
                            if( sum == n )
                            {
                                printf("%d\n", n );
                            }
                        }
                    }


        3) 一个正整数可能由n个连续的数相加得到的 
            比如: 
                15 = 1+2+3+4+5
                15 = 4+5+6
                15 = 7+8 
            从键盘上输入一个正整数n, 然后找出所有情况的连续数  

                方法一: 穷举法  

                    1
                    1+2
                    1+2+3 
                    1+2+3+4
                    1+2+3+4+5   == 15 
                        以1开头找连续序列,一直累加,直到累加的结果等于15,那么就找到了,就输出这种情况
                                如果累加的结果 小于15, 就继续累加
                                如果累加的结果 大于15, 就结束循环, 从下一个数开始找 

                    2
                    2+3
                    2+3+4
                    2+3+4+5
                    2+3+4+5+6  > 15     超过了,结束循环, 再从下一个数开始找  

                    ...

                    n/2 
                    n/2 +  (n/2 + 1)  

                    (n/2 + 1) 
                    (n/2 + 1) + (n/2 + 2 )  --> n+3  明显超过了n的   --> 遍历范围  [1, n/2]

                ===>
                        int main()
                        {
                            int n;
                            scanf("%d", &n );

                            int sum = 0;

                            int i,j,k;
                            for( i=1; i<=n/2; i++ )     // [1, n/2]
                            {
                                sum = 0;

                                for( j=i; sum<n ; j++ )     //以i开头进行累加
                                {
                                    sum += j;
                                    if( sum == n )
                                    {
                                        //找到了
                                        printf("%d = %d", n , i );
                                        for( k=i+1; k<=j; k++ )
                                        {
                                            printf(" + %d", k );
                                        }
                                        putchar('\n');
                                    }
                                }
                            }

                        }


                //方法二: 

                    int main()
                    {
                        int l;  // left 第一个开始加的数 
                        int r = 0;  // right 下一个要加的数 
                        
                        int n;
                        scanf("%d", &n );

                        int sum = 0;
                        int k;
                        for( l=1 ; l <= n/2 ;   ) 
                        {
                            if( sum < n )
                            {
                                r++;
                                sum += r;
                            }
                            else if( sum == n )
                            {
                                //找到了
                                printf("%d = %d", n , l );
                                for( k=l+1; k<=r; k++ )
                                {
                                    printf(" + %d", k );
                                }
                                putchar('\n');

                                //当以l开头的相加的数输出完后, 开始下一次
                                sum = sum - l;
                                l++;
                            }
                            else if( sum > n )
                            {
                                sum = sum - l;
                                l++;
                            }
                        }

                    }

标签:语句,10,int,sum,C语言,循环,printf,表达式,结构
From: https://blog.csdn.net/m0_69032433/article/details/142499988

相关文章

  • 数据结构——广义表
    广义表的概念    广义表(又称列表Lists)是n>=0个元素a0,a1,...,an-1的有限序列,其中每一个ai可以是原子,或者是一个广义表。广义表和线性表的区别:线性表的元素是单一的类型,而广义表的元素可以是不同类型,其元素也可以是一个广义表(子表)。广义表通常记作:LS=(a1,a2,...,an)   ......
  • 梳理一下C语言中的格式说明符
    整数类型%d:带符号的十进制整数(适用于int类型)。%hd或%hi:带符号的短整数(适用于shortint类型)。%ld:带符号的长整数(适用于longint类型)。%lld:带符号的长长整数(适用于longlongint类型)。%i:同%d,可以自动识别有符号整数大小。%u:无符号的十进制整数(适用于unsignedint)。%hu:无符号的短......
  • 伪类选择器:动态伪类、结构伪类、否定伪类、UI伪类、目标伪类、语言伪类
    什么是伪类:很像类,但不是类,是元素特殊状态的一种描述。作用:选中特殊状态的元素1.动态伪类什么是动态伪类:因为它的变化是动态的,拿a:hover举例,一会悬浮一会不悬浮,是动态变化的。拿a标签举例:a:link 代表没有访问过的超链接      a:visited 代表访问过的超链接......
  • 数据结构(Day20)
    一、学习内容树形结构概念(1树是n个元素的有限集合n==0空树n>0有且只有一个根结点其他的结点互不相交的子集树具有递归性:树中有树树的术语(结点:树的数据元素(根结点:唯一的没有前驱(没有双亲)叶子:终端结点不是唯一的没有后继(没有孩子)度为0分......
  • c语言中字符串输入的相关知识点
    (1)scanf只能接收非空格字符串遇到空格或者换行就算结束。代码如下:#include<stdio.h>#include<stdlib.h>intmain(){chararr[10];scanf("%s",&arr);printf("%s",arr);}(2)gets函数-能够接收空格,但是不能接收回车#include<stdio.h>#include&l......
  • c语言实现最小堆和最大堆
    第一部分:最大堆和最小堆的基本性质(1)基本定义①最大堆根是这颗树最大的值,每个根节点都比  左右子节点的值大,对左右子树仍然成立;②最小堆根是这颗树的最小的值,每个根节点都比左右子节点的值小,同样对左右子树成立;(2)性质(数组下标关系)由堆构建的树的背后原理是基于完全......
  • C语言课程设计题目(24个选题)
    C语言课程设计题目题目一:职工信息管理系统设计题目二:图书信息管理系统设计题目三:图书管理系统设计题目四:实验设备管理系统设计题目五:西文下拉菜单的设计题目六:学生信息管理系统设计题目七:学生成绩管理系统设计题目八:学生选修课程系统设计题目九:学生成绩记录簿设计题目十:......
  • 架构师日记-从数据库发展历程到数据结构设计探析
    一数据库发展史起初,数据的管理方式是文件系统,数据存储在文件中,数据管理和维护都由程序员完成。后来发展出树形结构和网状结构的数据库,但都存在着难以扩展和维护的问题。直到七十年代,关系数据库理论的提出,以表格形式组织数据,数据之间存在关联关系,具有了良好的结构化和规范化特......
  • Set 数据结构
    Set是一种集合数据结构,它类似于数组,但与数组不同的是它没有重复值一、创建Set创建一个新的集合,通过add方法添加数据constmySet=newSet()mySet.add(1)mySet.add(2)mySet.add(2)mySet.add(3)mySet.add(4)console.log(mySet)直接初始化集合constmySet=newS......
  • 【数据结构】图的遍历
    快乐的流畅:个人主页个人专栏:《C游记》《进击的C++》《Linux迷航》远方有一堆篝火,在为久候之人燃烧!文章目录引言一、深度优先遍历1.1定义1.2实现二、广度优先遍历2.1定义2.2实现三、DFS与BFS的对比引言前置知识:【数据结构】图的概念和存储结......