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%原创!且读且学习。
  • 相关阅读:
    看看时间,我的博客都有一年了。
    asp.net 读取数据库生成百度sitemap_baidu.xml和谷歌sitemap.xml
    克隆后自动改IP计算机名的批处理
    网奇iwms插件之“我浏览过的文章”
    Jetty7 Continuation 学习(一)
    PostgreSQL 和 MySQL 创建帐号,数据库,权限
    OpenLayers 学习笔记 (3) 使用 Google Maps 作底图
    Tomcat 和 Jetty 下 JNDI 配置 DBCP 连接池
    PostgreSQL 中 POLYGON 到 MULTIPOLYGON 的转换
    CentOS 5.4 安装 DNS
  • 原文地址:https://www.cnblogs.com/xuying-fall/p/9016080.html
Copyright © 2011-2022 走看看