• C语言学习(3)


    一、C语言中循环

      1. 三种循环

        第一种: for循环

        语法:for(表达式1; 表达式2; 表达式3) //先执行表达式1,然后判断表达式2是否为真,在执行代码

        {

          执行的代码

        }

        注意:花括号中的代码只有一句话,那么花括号可写可不写

        花括号中的代码有多句话,一定要写

        难点:循环的嵌套

    #include<stdio.h>
    
    int main()
    {
        int i=0;
        int j=0;
        //从外到内执行
        //规律: 外层循环成立,里面的循环会全部执行一遍,然后再判断外层循环
        for(i=0; i<5; i++) //外层循环
        {
            printf("外层循环成立了:%d
    ",i);
            for(j=0; j<5; j++)  //内层循环
            {
                printf("里面的循环执行%d
    ",j);
            }
        }
    }

        写法一: for( ; i<5; i++)

        写法二: for( ; i<5; )

        写法三: for( ; ;) //死循环

    例子如下:

    #include <stdio.h>
    
    int main()
    {
        int i=0;
        //循环打印5次
        /* for(i=0; i<5; i++) //常规的写法
        {
            printf("hello world!
    ");
        } */
        
        /* for(; i<5; i++)
        {
            printf("hello world!
    ");
        } */
        
        for(; i<5; )
        {
            printf("hello world!
    ");
            i++;
        }
            
    /*     for(;;)  //死循环
        {
            printf("hello gec!
    ");
        } */
    }
        第二种: while循环

        语法:while(条件) //条件为真,则执行循环语句

        {

        }

        while(i<5)

        {

          i++;

        }

        while(1) //等价于 for(;;) while('a')死循环

        {  

        }

        第三种:do while循环

        do

        {

          执行的代码

        }while(条件);

        注意: do while循环先斩后奏,会先执行一次循环,然后再判断条件是否成立

    while和do while的例子如下:

    #include <stdio.h>
    
    int main()
    {
        int i=0; 
        while('a')// while(1) 表达式0 就是假的   非零就是真
        {
            printf("死循环!
    ");
            
        }
        while(i<5)
        {
            printf("hello gec!
    ");
            i++;
        }
        
        
        int a=88;
        int b=99;
        do
        {
            printf("另外一个循环!
    ");
        }while(a<10&&b>100);
    }

      2. break和continue

        break --》彻底结束循环

    #include<stdio.h>
    
    int main()
    {
        int i;
        for(i=0; i<10; i++)
        {
            if(i==5)
                //break; //结束整个循环
                continue; //结束当前这一次循环,进入下一次循环
            
            printf("循环正常进行%d次!
    ",i);
        }
    }

        continue --》结束本次循环,进入下一次循环

      练习:

      1. for循环打印99乘法表

    #include <stdio.h>
    
    /*
        for循环打印9*9乘法表
        1*1=1
        1*2=2 2*2=4
        1*3=3 2*3=6 3*3=9
        思路:用两个变量i,j分别表示两个要相乘的数
              循环就是找数学规律:
                  第一行:j  1   i 1--》j
                  第二行:j  2   i 1--》j
                  第三行:j  3   i 1--》j
    */
    
    int main()
    {
        int i,j;
        for(j=1; j<=9; j++) //总共9行
        {
            for(i=1; i<=j; i++) //每一行中i的变化次数跟j有关
            {
                printf("%d*%d=%-2d",i,j,i*j); //打印每一行的乘法表
            }
            //打印完一行在换行
            printf("
    ");
        }
    }

      2. for循环实现*三角图案

    #include <stdio.h>
    /*
        *       
       ***               
      *****   
    */
    int main()
    {
        int n;
        int i,j,k;
        printf("请输入你想打印多少行的钻石图案,输入奇数!
    ");
        scanf("%d",&n);
        //先分析搞定钻石图案的上半部分的规律,总共n/2+1行
        for(i=1; i<=(n/2+1); i++) //上半部分
        {
            for(j=0; j<(n/2+1)-i; j++) //打印空格的数目
                printf(" ");
            for(k=0; k<2*i-1;  k++) //打印型号的数目
                printf("*");
                
            //换行
            printf("
    ");
        }
        
    }    

      3.for循环实现钻石图案

    #include <stdio.h>
    /*
       *
      ***
     *****    n=5
      ***
       *
       
       *
      ***
     *****  
    *******   n=7
     *****
      ***
       *
    */ 
    int main(int argc, char *argv[]) {
        
        int row, half, i, j;
        printf("输入你的想要的钻石行数:
    ");
        scanf("%d",&row);
        
        //打印钻石上半部分
        half = row / 2 + 1;    
        
        for(i = 1; i <= half; i++)
        {
            //打印前导空格
            for(j = 1; j <= half - i; j++)
            {
                printf(" ");    
            }
            //打印星号
            for(j = 1; j <= 2 * i - 1; j++)
            {
                printf("*");    
            }
            //换行
            printf("
    ");
        }
        
        //打印钻石下半部分    
        for(i = 1; i < half; i++)
        {
            //打印前导空格
            for(j = 1; j<= i; j++)
            {
                printf(" ");    
            }
            //打印星号
            for(j = 1; j <= 2 * (half - i - 1) + 1; j++)
            {
                printf("*");    
            }
            //换行
            printf("
    ");
        }                  
        return 0;
    }

      4. while循环实现任意输入一个整数,编程得到这个整数总共多少位,各个位分别是多少

        123/10 --》12 --》12/10 --》1 1/10--》0

        123%10 --》3 12%10 --》2 1%10--》1

    #include <stdio.h>
    
    int main()
    {
        int num;
        int count=0;
        printf("请输入任意一个整数!
    ");
        scanf("%d",&num);
        
        //求出num的各个位
        while(num!=0) 
        {
            printf("num低位到高位依次是:%d
    ",num%10);
            count++;
            num=num/10;
        }
        //打印num是几位数
        printf("你刚才输入的整数是:%d 位数!
    ",count);
    }

    二、C语言的条件判断

      1. 第一种:单个情况的判断

        if(条件)

        {

          代码

        }

      2.第二种:两种情况的判断,非此即彼

        if(条件)

        {

        }

        else

        {

        }

    #include <stdio.h>
    
    int main()
    {
        int a=10;
        int b=100;
        if(a>b)
        {
            printf("a>b
    ");
        }
            //printf("我是来捣乱的!
    "); //if和else之间不能穿插其他语句,编译会报错
        else
        {
            printf("a<=b
    ");
        }
            
    }

      3.第三种:大于等于三种情况的判断

        if(条件)

        {

        }

        else if(条件)

        {

        }

        else if(条件)

        {

        }

        else

        {

        }

        注意:if和else之间不能出现其他语句

        if或者else花括号里面的语句如果只有一条语句,花括号可以省略

      练习:

      1. if语句实现求5个整数的最大值和最小值

    #include <stdio.h>
    
    int main()
    {
        int n1,n2,n3,n4,n5;
        printf("请输入五个整数!
    ");
        scanf("%d%d%d%d%d",&n1,&n2,&n3,&n4,&n5);
        //最大值
         int max=n1; //保存最大值,先假设n1是最大的
        //依次轮流跟max进行比较
        if(n2>max)
            max=n2;
        if(n3>max)
            max=n3;
        if(n4>max)
            max=n4;
        if(n5>max)
            max=n5; 
        
        //最小值
        int min=n1; //保存最小值,先假设n1是最小的
        //依次轮流跟min进行比较
        if(n2<min)
            min=n2;
        if(n3<min)
            min=n3;
        if(n4<min)
            min=n4;
        if(n5<min)
            min=n5;
        printf("五个数的最大值是:%d
    ",max);
        printf("五个数的最小值是:%d
    ",min);
    }

      2. 编程实现任意输入6个整数,从小到大排个序(升序)

    #include <stdio.h>
    
    int main()
    {
        int i,j,a[6],cup;
        printf("请输入6个不同数据:
    ");
        for(i = 0;i<6;i++)//循环输入整数
        {
            scanf("%d",&a[i]);
        }
        for(i=0;i<5;i++)//判断第一个数与其他数的大小,再接着下一个,最后一个也就被比较了
        {
            for(j=i+1;j<6;j++)//判断除了筛选出来的那个数后面的数
            {
                if(a[i]>a[j])//前面数大于后面数,调换位置
                {
                    cup=a[i];
                    a[i]=a[j];
                    a[j]=cup;
                }
            }
        }
        printf("排列顺序从小到大为:");
        for(i=0;i<6;i++)//循环打印打印结果
        {
            printf("%d  ",a[i]);
        }
        printf("
    ");
        return 0;
    }

    三、C语言中选择条件分支语句(开关语句)

      1. 语法

        swich(变量) //标准写法

        {

          case 1:

          代码;

          break; //结束switch,break只能在循环或者switch中使用

          case 2:

          代码;

          break;

          default:

          代码;

          break;

        }

        特点:switch中的变量只能是整数,字符,常量

        switch有变形形式

        第一种: default 可写可不写

        第二种: switch中的break是可以不写,写和不写含义完全不同

        第三种: default跟case的书写顺序可以随意颠倒

        总结:switch一直执行,直到遇到break才结束switch,没有遇到break一直往下运行

    #include <stdio.h>
    
    int main()
    {
        int n;
        /*     float m=15.6;
        switch(m) //错误,switch要求只能是整数,字符,整型常量
        {
            case 15.6:
                printf("m是15.6");
                break;
            default:
                printf("m不是15.6");
                break;
        } */
        char c = 'i';//字符
        switch (c)
        {
        case 'i':
            printf("iiii
    ");
            break;
        default:
            printf("ooooo
    ");
            break;
        }
    
        printf("请输入数字 1-7 分别代表星期一到星期天!
    ");
        scanf("%d", &n);
        // if(n==1) else if(n==2) else
        switch (n)
        {
        case 1:
            printf("星期一!
    ");
            break;
        case 2:
            printf("星期二!
    ");
            break;
        case 3:
            printf("星期三!
    ");
            break;
        case 4:
            printf("星期四!
    ");
            break;
         case 5:
            printf("星期五!
    ");
            break;
        case 6:
            printf("星期六!
    ");
            break;
        case 7:
            printf("星期日!
    ");
            break;
        default:
            printf("你输入的是其他数字,不是1和2
    ");
            break;
        }
        printf("你输入的是%d
    ",n);
    }

    四、作业:

      1. switch做一个功能选择菜单,重复选择不同的功能

        printf("请你选择如下功能! ");

        1. 登录

        2. 借书

        3. 还书

        4. 修改账户密码

        5. 查询

    #include <stdio.h>
    
    int main()
    {
        int mode;
        printf("请选择如下功能!
    ");
        printf("1.登录
    ");
        printf("2.借书
    ");
        printf("3.还书
    ");
        printf("4.修改账户密码
    ");
        printf("5.查询
    ");
        
        while(1)
        {
            scanf("%d",&mode);
            switch(mode)
            {
                case 1:printf("登录
    ");break;
                case 2:printf("借书
    ");break;
                case 3:printf("还书
    ");break;
                case 4:printf("修改账户密码
    ");break;
                case 5:printf("查询
    ");break;
                default:printf("Error
    ");break;        
            }
        }
    }
    View Code

      2. switch键盘任意输入年,月,日, 告诉我这个日期是这个一年的第几天

        1987 6 23

    #include <stdio.h>
    
    /*
    *    switch键盘任意输入年,月,日,  
    *    告诉我这个日期是这个一年的第几天
    *    1987  6   23 
    */
    
    int main()
    {
        int year,mon,day,a,MON;
        printf("=====判断日期是今年的第几日=====
    ");
        printf("请输入年份 月份 日:
    ");
        scanf("%d %d %d",&year,&mon,&day);
        
        //闰年能被4整除,却不能被100整除。能被400整除的数。
        if(year%400==0)         
            a=1;        
        else
        {
            if(year%4==0&&year%100!=0)
                a=1;
            else
                a=0;
        }
        if(a==1)//闰年
        {
            switch(mon)//月份
            {
                case 1:MON=0;break;//1月说明还没过完,看天数
                case 2:MON=31;break;//2月说明1月已经过完,1月就有31天
                case 3:MON=60;break;//3月说明1,2月已经过完,1,2月就有60天(闰年2月29日,则31+29=60)
                case 4:MON=91;break;//以此类推……
                case 5:MON=121;break;
                case 6:MON=152;break;
                case 7:MON=182;break;
                case 8:MON=213;break;
                case 9:MON=244;break;
                case 10:MON=274;break;
                case 11:MON=305;break;
                case 12:MON=335;break;
            }
            MON=MON+day;//计算今日是今年的第几天
            printf("%d 此年是闰年
    ",year);
            printf("今天是此年的第%d天!
    ",MON);
        }
        else//非闰年
        {
            switch(mon)
            {
                case 1:MON=0;break;//1月说明还没过完,看天数
                case 2:MON=31;break;//2月说明1月已经过完,1月就有31天
                case 3:MON=59;break;//3月说明1,2月已经过完,1,2月就有59天(非闰年2月28日,则31+28=59)
                case 4:MON=90;break;//以此类推……
                case 5:MON=120;break;
                case 6:MON=151;break;
                case 7:MON=181;break;
                case 8:MON=212;break;
                case 9:MON=243;break;
                case 10:MON=273;break;
                case 11:MON=304;break;
                case 12:MON=334;break;
            }
            MON=MON+day;//计算今日是今年的第几天
            printf("%d 此年非闰年
    ",year);
            printf("今天是此年的第%d天!
    ",MON);
        }
        return 0;
        
    }
    View Code

      3. 用循环求出这种表达式的结果

      1+1.0/2-1.0/3+1.0/4-1/5.........1.0/n

        思路一: 加法和减法分开来计算

        思路二:-1的n次方表示正负号

        n从键盘输入

    #include <stdio.h>
    
    /*
    * 用循环求出这种表达式的结果
    * 1+1.0/2-1.0/3+1.0/4-1/5.........1.0/n
    * 思路一: 加法和减法分开来计算
    * 思路二:-1的n次方表示正负号
    * n从键盘输入
    *
    *以上类举可以看出,当分母为双数的加起来,分母为单数的时候减去
    */
    
    
    int main()
    {
        int a,i;
        float sum = 1.0;//sum=1.0是因为这个数怎么加都是有1,
        float k = 1.0;//正负号,首先为正
        printf("请输入一个数:
    ");
        scanf("%d",&a);
        for(i=2;i<=a;i++)
        {
            sum += k/i;//总数求和,双数加,单数减
            k *= -1;//替换符号
        }
        printf("总和为:%f
    ",sum);
        return 0;
        
    }
    View Code
  • 相关阅读:
    【每日一题】41. 德玛西亚万岁 (状态压缩DP)
    The 18th Zhejiang Provincial Collegiate Programming Contest 补题记录(ACFGJLM)
    【每日一题】40. 旅游 (树形DP解决树的最大独立集)
    【每日一题】39. Contest(树状数组 / 容斥分治)
    AtCoder Regular Contest 121 (AB题解)
    Deltix Round, Spring 2021 (open for everyone, rated, Div. 1 + Div. 2) (ABCE补题记录)
    2019年第十届蓝桥杯国赛C++C组
    AtCoder Beginner Contest 203 (A~D,玄学二分场)
    Codeforces Round #723 (Div. 2) (A~C题题解)
    Latex公式排版问题总结
  • 原文地址:https://www.cnblogs.com/xiaojian98/p/12426666.html
Copyright © 2020-2023  润新知