zoukankan      html  css  js  c++  java
  • 小学生都看得懂的C语言入门(2): 判别 循环的一些应用实例

    1.bool 类型

    定义bool类型之前需要导入#include <stdbool.h>

    #include <stdio.h>
    #include <stdbool.h> 
    int main()
    {
        bool b=6>5;
        bool t=true;
        printf("%d
    ",b); //仍然是整数形式输出 得到1
    return 0;
    }

    2.逻辑运算
     非!  或||  和&&  x>4 && x<6   !age<20 永远成立,!age=0或1  优先级顺序 ! && ||
     
    赋值运算等级最低 
    // 短路  逻辑运算时从左向右的,左边已经可以觉得结果了,右边就不做了
    //条件运算符 m<n? x:a+5  表示m<n 则 取x, 否则为a+5  ,这种表达式少用,会搞错 !!
    //逗号 等级最低的

    #include <stdio.h>
    #include <stdbool.h> 
    int main()
    {
     int i=3+4, 5+6; //出错了 为什么
     printf("%d
    ",i);  //7
     int j=(3+4,5+6); //  正确 
     printf("%d
    ",j);  //11
    return 0;
    }

    逗号什么用? 主要在for 中使用,可以放多个计算.  for(i=0,j=10;i<j:i++,j--)...

    3.分段函数

    #include <stdio.h>
    int main()
    {
     int x=10;
     int f=0;
     if (x<0){
         f=-1;
     } 
     else if(x==0){
         f=0;
     }
     else{
         f=2*x;
     }
    printf("%d ",f);  //20
    return 0; }

    if else 后面只有一个执行语句的话,可以不加{}

    #include <stdio.h>
    int main()
    {
     int x=10;
     int f=0;
     if (x<0)
         f=-1;
     else if(x==0)
         f=0;
     else
         f=2*x;
     printf("%d
    ",f);  //20 
    return 0;
    }

    4.switch 

    为什么已经有了if 还需要用switch?

    #include <stdio.h>
    int main()
    {
     int type;
     scanf("%d",&type);
     
     if (type==1)
     printf("nihao");
     else if(type==2)
     printf("zaoshanghao");
      else if(type==3)
     printf("wanshanghao") ;
     else
     printf("no") ;
     
     // 上述当type=4 需要一个一个判别过来,不太好 ,因此引入switch 
    return 0;
    }

    用switch() {case 1:...; break; case 2:... ;break;...default:...;break;}

    #include <stdio.h>
    int main()
    {
     int type;
     scanf("%d",&type);
     switch(type){
         case 10:    //tpye=10 就直接做这个, 
              printf("nihao");
              break; //一定要有break, 阻止语句往下执行 
         case 20:
             printf("zaoshanghao");
              break;
         case 30: //tpye=30 就直接做这个,不用判别前面两种了 
             printf("wanshanghao");
              break;
         default:
             printf("no");
    return 0;
    }

    注意:  switch 只能用整数型, type不能是double!

    #include <stdio.h>
    int main()
    {
    //成绩转化
     int grade;
    scanf("%d",&grade) ;
    grade/=10;
    switch(grade){
        case 10:
        case 9:
            printf("A
    ");
            break;
        case 8:
            printf("B
    ");
            break;
        case 7:
            printf("C
    ");
            break;
        case 6:
            printf("D
    ");
            break;
        default:
            printf("F
    ");
            break;        
    }
    return 0;
    }

    5.简单小例子

    #include <stdio.h>
    int main()
    {
    // 计算log2的整数部分
    int x;
    int ret=0;
    scanf("%d",&x);
    int t=x;
    while(x>1){
        x/=2;
        ret++;
    }
    printf("log2 of %d is %d
    ",t,ret);
    return 0;
    }

    12

    log2 of 12 is 3

    求平均数,输入数字, 以-1 结束,求出-1之前的平均数

    #include <stdio.h>
    int main()
    {
    int num;
    int sum=0;
    int count=0;
    
    scanf("%d",&num);
    
    while(num!=-1){
        sum+=num;
        count++;
        scanf("%d",&num);
    } 
    
    printf("%f
    ",1.0*sum/count); 
    return 0; 
    }

    猜数字游戏 (1-100)   过程中需要提示:大了 小了,记录猜数字次数.

    #include <stdio.h>
    #include <stdlib.h>    //rand 可以用了 
    #include <time.h>  
    int main()
    {
    
    srand(time(0));  //让随机数能够像随机数一样 
    int num=rand()%100+1; //产生一个1-100之间的随机数 
    int a=0;
    int count=0; //猜数次数 
    printf("我已经想好了一个1到100内的数
    ");
    
    do{
     printf("please guess a number:
    "); 
     scanf("%d",&a);
     count++; //无论对错都算一次 
     if (a>num)
         printf("大了"); 
     else if (a<num)
     printf ("小了");
    }while(a!=num);
    
    printf("bingo!,你用了%d次就成功了
    ",count); 
    return 0; 
    }

    数字逆序输出  ,整数x逆序  作用x%10 得到个位数  x/10 去掉个位数,

    #include <stdio.h>
    int main()
    {
    int x=500;
    int t=x;
    int num;
    int ret=0;
    while(x>0){
        num=x%10;
        ret=ret*10+num;
        x/=10;
    } 
    printf("the reverse of %d is %d
    ",t,ret); 
    return 0; 
    }

    the reverse of 500 is 5  , 没有得到005 有缺陷!

    注意:容易出错的地方, if后面没有加{}  如果执行语句只有一句,可以不加,有多句一定要{} .


    if() 后面不用加;  否则if 直接结束了,执行后面语句

    #include <stdio.h>
    int main()
    {
    int age=50;
    if (age>60);  //加了;
    {
        printf("can be treat carefully");
     } 
    return 0; 
    }

    得到:

    can be treat carefully  这个结果就是 if 在不执行设么就直接结束了,进入printf 语句

    好的风格的代码. 

    #include <stdio.h>
    int main()
    {
    int x=10; 
    int f=0;
    if (x<0)
    {
        f=-1;
     } 
    else if (x==0)
    {
        f=0;
    }
    else
    {
        f=2*x;
    }
    return 0; 
    }

    上述优点在于如要注释几行不会影响其他行. 特别是{ }最会受注释行的影响.

    //判断素数

    #include <stdio.h>
    int main()
    {
    int x;
    scanf("%d",&x);
    int i;
    int isprime=1;
    for(i=2;i<x;i++)
    {
        if(x%i==0)
        {
            isprime=0;
            // break;  break也可以放在外面 
        } break;
     }
    if(isprime==0)
    printf("不是素数");
    else
    printf("是素数"); 
    return 0; 
    }

    13

    是素数

     //输出30以内的素数  双重循环

    #include <stdio.h>
    int main()
    {
    int x;
    for(x=2;x<30;x++)
    {
        int i;
        int isprime=1;
        for(i=2;i<x;i++)
        {
            if(x%i==0)
            {
                isprime=0;
            } break;
         }
        if(isprime==1)
        printf("%d ",x);
     }
    return 0; 
    }

    2 3 5 7 9 11 13 15 17 19 21 23 25 27 29

    // 输出前20个素数

    #include <stdio.h>
    int main()
    {
    int x=2;
    int cnt=0;
    while(cnt<20)
    {
        int i;
        int isprime=1;
        for(i=2;i<x;i++) //x还是会输出2的 
        {
            if(x%i==0)
            {
                isprime=0;
            } break;
         }
        if(isprime==1)
        {
        printf("%d ",x);
        cnt++;
        }
        x++;
     }
    return 0; 
    }

    2 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39

    //另一种方法, 不用while, 用for

    #include <stdio.h>
    int main()
    {
    int x;
    int cnt=0;
    for(x=2;cnt<20;x++)
    {
        int i;
        int isprime=1;
        for(i=2;i<x;i++) //x还是会输出2的, 但是只有一次循环 
        {
            if(x%i==0)
            {
                isprime=0;
            } break;
         }
        if(isprime==1)
        {
        printf("%d ",x);
        cnt++;
        }
     } 
    return 0; 
    }

     //凑硬币 1 2 5元 凑成100元以下的金额 (输出第一个符合条件的即可)  三重循环

    #include <stdio.h>
    int main()
    {
     int x;
     int one ,two,five;
     int exit=0; 
     scanf("%d",&x);
     for (one=1;one<x;one++){
         for (two=1;two<x/2;two++){
             for(five=1;five<x/5;five++){
                 if(one+2*two+five*5==x){
                     printf("用%d个一元 %d个两元 %d个五元得到%d元
    ",
                     one,two,five,x);
                     exit=1; 
                     break; //只能结束当前循环,如何跳出三个循环 ?增加exit变量  接力break 
                 }
             }
             if (exit==1)break;
         }
          if (exit==1)break;
     } 
    }

    23
    用1个一元 6个两元 2个五元得到23元

      //上述称为接力break,  还有一种方法 用goto, 可以免去写很多个break

    #include <stdio.h>
    int main()
    {
    int x;
    int one,two,five;
    
     scanf("%d",&x);
     for (one=1;one<x;one++)
    {
         for (two=1;two<x/2;two++)
        {
             for(five=1;five<x/5;five++){
                 if(one+2*two+five*5==x){
                goto out; //后面定out的位置 
                }
               }
        }
        
    } 
    out:
         printf("用%d个一元%d个两元 %d个五元得到%d元
    ",one,two,five,x);
    }

    12

    用1个一元3个两元 1个五元得到12元

    //求和 1+1/2+1/3+1/4...+1/n

    #include <stdio.h>
    int main()
    {
    int n;
    int i;
    double sum=0.0;
     scanf("%d",&n);
     for(i=1;i<=n;i++){
         sum+=1.0/i;
     } 
      printf("f(%d)=%f
    ",n,sum) ;
    }

    10

    f(10)=2.928968

    //求和 1-1/2+1/3-1/4...+(-1)^(n-1)*1/n, 增加sign符号

    #include <stdio.h>
    int main()
    {
    int n;
    int i;
    int sign=1; 
    double sum=0.0;
     scanf("%d",&n);
     for(i=1;i<=n;i++){
         sum+=sign*1.0/i;
         sign=-sign;
     } 
      printf("f(%d)=%f
    ",n,sum) ;  
    }

    4

    f(4)=0.583333

    //求两个数的最大公约数

    方法1: 先找到两数的较小者min , 循环 i=1:min找公因子, 循环结束得到的就是最后一个(最大公因数)

    #include <stdio.h>
    int main()
    {
     int a,b;
     int min ;
     scanf("%d %d",&a,&b);
     if (a<b){
         min=a;
     } else{
         min=b;
     }
      int ret=0;
      int i;
      for(i=1;i<min;i++){
          if (a%i==0 && b%i==0){
          ret=i; 
          } 
      }
      printf("%d and %d 的最大公约数是%d",a,b,ret);
    }

    10 25

    10 and 25 的最大公约数是5

    //方法2: 辗转相除法  a=12, b=18 ,t记录a%b  然后a=b, b=t, 继续做下去

    思路: 

    // a b t
    //12 18 12
    //18 12 6
    //12 6 0
    //6 0   b是0的时候结束, 此时a是最小公约数

    #include <stdio.h>
    int main()
    {
    int a,b;
    int t;
    scanf("%d %d",&a,&b) ;
    while(b!=0){
        t=a%b;
        a=b;
        b=t;
    } 
    printf("gcd=%d
    ",a); 
    }

    //正序分解整数  12345  输出 1 2 3 4 5

    //先回顾逆序输出... x%10 得到最后一个数字. x/10去掉最后一个数

    #include <stdio.h>
    int main()
    {
    int x;
    scanf("%d",&x);
    //x=12345;
    do{
        int d=x%10; //得到个数数字 
        printf("%d ",d);
        x/=10; 
    }  while(x>0);
    }

    1200

    0 0 2 1

    // 正序可以通过逆序两次得到

    #include <stdio.h>
    int main()
    {
    int x;
    int t=0; 
    scanf("%d",&x);
    //x=12345;
    do{
        int d=x%10; //得到个数数字 
        t=t*10+d; 
        x/=10; 
    }  while(x>0); 
     printf("t=%d
    ",t); 
     x=t;
    do{
        int d=x%10; //得到个数数字 
        printf("%d ",d);
        x/=10; 
    }  while(x>0);
    }

    1329

    t=9231
    1 3 2 9

    但是输入600 得到的 t=6 最后结果也是6 不是 006,修改思路如下

    // 思路 :   x=1234
    //1234/1000 1 ..
    //1234%1000 234
    //1000/10 100


    //234/100  2.  ..
    //234%100 34
    //100/10  10


    //34/10  3.  ..
    //34%10  4
    //10/10 1


    //4/1   4 ...
    //4%1  0
    //1/10 0

    #include <stdio.h>
    #include<math.h> 
    int main()
    {
    int x;
    scanf("%d",&x);
    int t=x; 
    int cnt=0;  //计算位数
     do{
         x/=10;
         cnt++;
     } while(x>0);
     printf("%d
    ",cnt);
     int m=pow(10,cnt-1);// pow没有定义??  增加#include<math.h>
     printf("%d
    ",m);
     x=t;
     do{
         int d=x/m;
         printf("%d ",d);
         x%=m;
         m/=10;
     }while(m>0);
    }

    123

    3
    100
    1 2 3

    上述没必要用pow求

    #include <stdio.h>
    #include<math.h> 
    int main()
    {
    int x; 
    scanf("%d",&x);
    int m=1; 
    int t=x;
     while(x>9){
         x/=10;
         m*=10;
     } 
     
    x=t; 
     do{
         int d=x/m;
         printf("%d ",d);
         x%=m;
         m/=10;
     }while(m>0);
    }
    ----END---- HAVE A GOOD ONE! 以上为本人课余自学工具书/blog的笔记整理, 常有更新, 非100%原创!且读且学习。
  • 相关阅读:
    warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
    Windows10+CLion+OpenCV4.5.2开发环境搭建
    Android解决部分机型WebView播放视频全屏按钮灰色无法点击、点击全屏白屏无法播放等问题
    MediaCodec.configure Picture Width(1080) or Height(2163) invalid, should N*2
    tesseract
    Caer -- a friendly API wrapper for OpenCV
    Integrating OpenCV python tool into one SKlearn MNIST example for supporting prediction
    Integrating Hub with one sklearn mnist example
    What is WSGI (Web Server Gateway Interface)?
    Hub --- 机器学习燃料(数据)的仓库
  • 原文地址:https://www.cnblogs.com/xuying-fall/p/9016080.html
Copyright © 2011-2022 走看看