进一步循环
#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;
}

浙公网安备 33010602011771号