进一步循环

#include<stdbool.h>

之后就可以用bool,true,false

逻辑运算

逻辑运算是对逻辑量的运算,结果只有0或1;

逻辑量是关系运算或逻辑运算的结果

运算符 描述 示例 结果
! 逻辑非 !a 如果a是true,结果就是false,如果a是false,结果就是true
&& 逻辑与 a&&b 如果a和b都是true,结果就是true,否则就是false
|| 逻辑或 a||b

a和b有一个是true,结果就是true,两个都是false,结果就是false

 

 

 

 

 

 

 

 

 

 

数学表达式4<x<6,逻辑表达式x>4&&X<6

如何判断一个字符c是否是大写字母:c>='A'&&c<='Z

短路:

对于&&,左边是false,就不做右边了

对于||,左边是true,就不做右边了

a==6&&b+=1 不要把赋值或复合赋值组合进逻辑表达式!

条件运算符:

count=(count>20)? count-10 : count+10;

条件、条件满足时的值、条件不满足时的值

翻译为:

if(count>20)

count= count-10;

else

count=count+10;

组合关系:自右向左

优先级:赋值运算符<条件运算符<其他所有运算符

不要用嵌套的条件运算

逗号运算:

用来连接两个表达式,并以右边的表达式的值作为结果。

优先级:所有运算符中最低

用于for循环

级联和嵌套的判断:

 找三个数中做大的数:

int a,b,c;

scanf("%d %d %d", &a, &b, &c);

int max=0;

if(a>b){

  if(a>c){

    max=a;

  }else{

    max=c;

  }

}else{

  if(b>c){

    max=b;

  }else{

    max=c;

  }

}

printf("The max is %d\n", max);

嵌套的判断:

当if的条件满足或者不满足时要执行的语句也可以是一条if或if-else语句时,这就是嵌套的if语句。如:

if(code==READY)

  if(code<20)

    printf("一切正常\n");

  else

    printf("继续等待\n");

else的匹配:

else总是和最近的if匹配

const int READY = 24;

int code =0;

int count = 0;

scanf("%d %d", &code, &count);

if(code==READY)

  if(count<20)

    printf("一切正常\n");

  else

    printf("继续等待\n");

return 0;

else和里面的if匹配

 

const int READY = 24;

int code =0;

int count = 0;

scanf("%d %d", &code, &count);

if(code==READY){

  if(count<20)

    printf("一切正常\n");

  }else

    printf("继续等待\n");

return 0;

else和外面的if匹配,如果输入的code为24,count为40,程序运行结果不会是“继续等待”

缩进格式不能暗示else的匹配

建议:在if或else后面总是加上{},即使执行语句只有一句的时候

 

级联的if-else if

分段函数

f(x)=-1; x<0

  0; x=0

  2x; x>0

int f;

if  (x<0){

  f=-1;

}else if(x==0){

  f=0;

}else{

  f=2*x;

}

printf("%d", f);

单一出口,在最后输出f,不建议在每个if或else中输出f

级联的else对齐

 多路分支:

switch-case

switch(控制表达式){           //控制表达式的结果只能是整数型

  case 常量:                  //常量可以是常数,也可以是常数计算的表达式

  语句;

  ...

  case 常量:

  语句;

  ...

  default:

  语句;

switch语句可以看做是一种基于计算的跳转,计算控制表达式的值后,程序会跳转到相匹配的case(分支标号)处。分支标号只是说明switch内部位置的路标,在执行完分支中的最后一条语句后,如果后面没有break,就会顺序执行到下面的case里去,直到遇到一个break,或者switch结束为止。

switch(type){

  case1:

  case2:

  printf("你好\n");

  break;

  case3:

  printf("晚上好\n");

  case4:

  printf("再见\n");

  break;

  default:

  printf("啊?\n");

  break;

}

case 是一个入口,不能阻止语句继续往下执行,break可以。一般每个case都配一个break。 有些情况下不会在每一个case中配break,这样前后两个case就会做一样的事。

练习:

int i = 1;

switch(i%3){

  case 0:

  printf("zero");

  case 1:

  printf("one");

  case 2:

  printf("two");

}

程序输出结果为: onetwo

一个项目中可以有多个cpp源文件,不允许有多个main函数,可以把其他源文件右键属性,“从生成中排除”,只运行一个源文件

 

小套路:循环的例子:

int x;

int ret = 0;

scanf("%d", &x);

int t = x;    //1.计算之前先保存原来的值,后面可能有用。 

while(x>1){

  x /=2;

  ret ++;

}

printf("log2 of %d is %d.", t, ret);

2.ret初始值和x边界值互相影响,也可以不是0和1

3.如果要模拟运行一个很大次数的循环,可以模拟较少的循环次数然后做出判断

int count == 100;

while(count >= 0){

  count --;

  printf("%d\n", count);

}

printf("发射!\n");

循环需要执行多少次?

循环停下来的时候,有没有输出最后的0?

循环结束后count的值?

算平均数的例子:

让用户输入一系列的正整数,最后输入-1表示输入结束,最后程序计算出这些数字的平均数,输出输入的数字个数和平均数。

思考:变量->算法->流程图->程序

变量:

1.一个记录读到的整数的变量number

2.平均数要怎么算?

只需要每读到一个数就把它加到一个累加的一个变量里,直到全部数据读完,再拿它除读到的数的个数

3.一个记录累加结果的变量sum,一个记录读到的数的个数的变量count

算法:

1.初始化变量sum和count为0

2.读入number

3.如果number不是-1,则将number加入到sum,并将count+1,回到第2步

4.如果number是-1,则计算和打印sum/count(注意换成浮点数来计算)

流程图:

程序:

#include<stdio.h>

int main(){

  int number;

  int sum=0;

  int count=0;

  scanf("%d", &number);

  do{

    if(number != -1){

      sum+=number;

      count ++;

    }

  }while(number != -1);

  printf("%f\n", 1.0*sum/count);  //1.0是浮点数,用1.0乘以sum,就让计算结果是浮点数

  return 0;  

}

或者

#include<stdio.h>

int main(){

  int number;

  int sum=0;

  int count=0;

  scanf("%d", &number);

   while(number != -1){

      sum+=number;

      count ++;

      scanf("%d", &number);

    }

  printf("%f\n", 1.0*sum/count);  //1.0是浮点数,用1.0乘以sum,就让计算结果是浮点数

  return 0;  

}

省去一次number != -1 的判断

 

猜数游戏:

让计算机想一个数,让用户来猜。用户每输入一个数,就告诉他是大了还是小了,直到用户猜中为止,最后还要告诉用户他猜了多少次。

思路:

因为需要不断让用户猜,所以需要用到循环。核心重点是循环的条件。

1.计算机随机想一个数,记录在变量number里

2.一个负责记次数的变量count,初始化为0

3.用户输入一个数字a

4.count递增(加一)

5.判断a和number的关系,如果a大就输出"大",如果a小就输出"小"

6.如果a和number是不相等的,返回第3步

7.否则输出"猜中"和次数,然后结束

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(){
srand(time(0));
int number=rand()%100+1;
int count=0;
int a;
printf("我已经想好了一个1到100之间的数。");

do{
printf("请猜这个1到100之间的数:");
scanf("%d", &a);
count ++;
if(a>number){
printf("你猜的数大了");
}else if(a<number){
printf("你猜的数小了");
}
}while(a!=number);

printf("太好了!你用了%d次就猜对了答案。\n", count);

return 0;
}

每次召唤rand(),就会产生一个随机整数,使用rand(),需要
#include<stdlib.h>
#include<time.h>
srand(time(0));

100以内的数最多猜7次就够了:二分法

 

整数逆序:

整数的分解:

一个整数是由一至多位数字组成的,如何分解出整数的各个位上的数字并加以计算?

1.对一个整数做%10,就得到它的个位数;

2.对一个整数做/10,就去掉了它的个位数;

然后对第2步的结果做%10,就得到了原来的十位上的数;

...

以此类推

输入一个正整数,输出逆序的数

#include<stdio.h>
int main(){
int x;
printf("请输入一个整数:\n");
scanf("%d", &x);
int digit;
int ret=0;

while(x>0){
digit=x%10;
ret=ret*10+digit;
printf("x=%d,ret=%d,digit=%d\n", x, ret, digit);
x/=10;
}
printf("%d\n", ret);
return 0;
}

如果输入的x是700,输出结果就会是7;如果想要输出结果是007:

#include<stdio.h>
int main(){
int x;
printf("请输入一个整数:\n");
scanf("%d", &x);
int digit;
int ret=0;

while(x>0){
digit=x%10;
printf("%d", digit);
//ret=ret*10+digit;
//printf("x=%d,ret=%d,digit=%d\n", x, ret, digit);
x/=10;
}
//printf("%d\n", ret);
return 0;
}

 

 

 

 

posted @ 2021-10-25 17:12  泰勒斯儿童营养牙膏  阅读(67)  评论(0)    收藏  举报