码迷,mamicode.com
首页 > 编程语言 > 详细

小学生都看得懂的C语言入门(2): 判别 循环的一些应用实例

时间:2018-05-13 15:10:37      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:log   判断   ref   公约数   需要   有一个   逻辑运算   goto   函数   

1.bool 类型

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

#include <stdio.h>
#include <stdbool.h> 
int main()
{
    bool b=6>5;
    bool t=true;
    printf("%d\n",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\n",i);  //7
 int j=(3+4,5+6); //  正确 
 printf("%d\n",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\n",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\n",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\n");
        break;
    case 8:
        printf("B\n");
        break;
    case 7:
        printf("C\n");
        break;
    case 6:
        printf("D\n");
        break;
    default:
        printf("F\n");
        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\n",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\n",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内的数\n");

do{
 printf("please guess a number:\n"); 
 scanf("%d",&a);
 count++; //无论对错都算一次 
 if (a>num)
     printf("大了"); 
 else if (a<num)
 printf ("小了");
}while(a!=num);

printf("bingo!,你用了%d次就成功了\n",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\n",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元\n",
                 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元\n",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",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",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\n",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\n",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\n",cnt);
 int m=pow(10,cnt-1);// pow没有定义??  增加#include<math.h>
 printf("%d\n",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);
}

 

小学生都看得懂的C语言入门(2): 判别 循环的一些应用实例

标签:log   判断   ref   公约数   需要   有一个   逻辑运算   goto   函数   

原文地址:https://www.cnblogs.com/xuying-fall/p/9016080.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!