小学生都看得懂的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\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);
}

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

时间: 2024-11-03 03:07:00

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

人人都看得懂的正则表达式

正则表达式可以帮助我们更好的描述复杂的文本格式.一旦你描述清楚了这些格式,那你就可以利用它们对文本数据进行检索.替换.提取和修改操作. 下面有一个正则表达式的简单例子.第一步先要引入有关正则式的命名空间: using System.Text.RegularExpressions; 第二步就是用指定的正则式构建一个正则表达式对象,下面的正则式是用来搜索长度为10的a-z的英文字母: Regex obj = new Regex("[a-z]{10}"); 最后,根据正则式在指定数据中检索匹

关于程序员的笑话,你都看得懂吗?

程序猿的读书历程:x语言入门->x语言应用实践->x语言高阶编程->x语言的科学与艺术->编程之美->编程之道->编程之禅->颈椎病康复指南. 问:程序猿最讨厌康熙的哪个儿子?答:胤禩,因为他是八阿哥(bug). 有一天,程序猿们突然发现他们要涨的工资掉到井里啦!大家都很害怕,连忙一个吊着一个,从树上伸到井里去捞工资.正好他们摸到工资的时候,一个老程序员忽然兴奋的大叫:别蠢了,要涨的工资还好好的挂在天上呢! 程序猿要了3个孩子,分别取名叫Ctrl.Alt和Dele

人人都看得懂的正则表达式教程

B 在正则表达式中有3种类型的括号 方括号 “[“和花括号“{“ . 方括号"["内是需要匹配的字符,花括号"{"内是指定匹配字符的数量. 圆括号“(“ 则是用来分组的. C 插入符号 “^” 表示正则式的开始. D 美元符号“$” 表示正则式的结束. 现在你知道上面的3个语法后,你就可以写世界上任何一条验证规则了.比如下面的例子就很好的说明了上面3条正则语法是如何协调运作的. 注:上图有个错误,"()"应为"{}" 检查用户

月薪3万的python程序员都看了这本书

想必大家都看过吧 Python编程从入门到实践 全书共有20章,书中的简介如下: 本书旨在让你尽快学会 Python ,以便能够编写能正确运行的程序 —— 游戏.数据可视化和 Web 应用程序,同时掌握让你终身受益的基本编程知识.本书适合任何年龄的读者阅读,它不要求你有任何 Python 编程经验,甚至不要求你有编程经验.如果你想快速掌握基本的编程知识以便专注于开发感兴趣的项目,并想通过解决有意义的问题来检查你对新学概念的理解程度,那么本书就是为你编写的.本书还可供初中和高中教师用来通过开发项目

为什么学习C语言这么久,看的懂代码,做不出题没项目

我看得懂别人的程序,可是我自己却写不出来,我应该怎么办啊?你了解这些嘛? 你只是能从别人书写的代码知道每一步都做些什么吧? 你明白别人的解题思路吗? 你知道别人为什么要用那样的算法吗? 如果你看着题目,你能写出实现同一功能的代码吗? 你能知道别人在写这个程序的过程中会遇到什么样的问题吗? 你能在看了别人的程序之后写出比他好的代码吗? 你能用另一种算法写出实现同一程序的代码吗? 你真的能看懂别人的程序吗?创一个小群,供大家学习交流聊天如果有对学C++方面有什么疑惑问题的,或者有什么想说的想聊的大家

hdu 1024 Max Sum Plus Plus 小白都可以看得懂的解析

这道题弄了很久,网上的很多都看不懂,所以想要写一个像我这种菜鸟都可以看得懂的解析. 题意是将一个长度为n的序列,分成m段不相交叉的子段,使得他们的和最大. 于是可以用dp[i][j]来表示在前j个数中,以num[j]结尾并分为i段的最大和.此时我们可以得出一个式子,dp[i][j]=max(dp[i-1][k]+a[j],dp[i][j-1]+a[j])  (i-1< k< j-1).分别表示num[j]单独成段和num[j]加入以num[j-1]结尾的一段. 现在举一个例子,序列为-1,4,

不管你学的是什么专业,你都应该多少懂些管理学的东西

不管你学的是什么专业,你都应该多少懂些管理学的东西 [蝴蝶效应][青蛙现象][鳄鱼法则]      [鲇鱼效应]  [羊群效应]    [刺猬法则]    [手表定律][破窗理论][二八定律][木桶理论]      [马太效应]  [鸟笼逻辑]    [责任分散效应][帕金森定律][晕轮效应][霍桑效应][习得性无助实验][证人的记忆][罗森塔尔效应][虚假同感偏差]-----------------------------------------------------------------

看得懂的 Node.js(三)—— Express 启航

如果看过上一篇<看得懂的 Node.js>,就会发现手动搭建一个 web 服务器还是比较繁琐 而 express 就是一个可以极大地提高开发效率的 web 开发框架 一.创建项目 在 express 4.0 之前,我们使用 npm install -g express 来全局安装 express 但是 4.0 之后,express 的命令行工具被单独分离出来,叫做 express-generator npm install -g express-generator 如果了解过 vue,expr

一看就懂的Android APP开发入门教程

一看就懂的Android APP开发入门教程 作者: 字体:[增加 减小] 类型:转载 这篇文章主要介绍了Android APP开发入门教程,从SDK下载.开发环境搭建.代码编写.APP打包等步骤一一讲解,非常简明的一个Android APP开发入门教程,需要的朋友可以参考下 工作中有做过手机App项目,前端和android或ios程序员配合完成整个项目的开发,开发过程中与ios程序配合基本没什么问题,而android各种机子和rom的问题很多,这也让我产生了学习android和ios程序开发的