概述
一、判断
1、if语句
//形式1:单条执行语句
if (判断表达式) //")"后不得有分号
执行语句
//形式2:多条执行语句(复合语句)
if(判断表达式) {
执行语句1
执行语句2
...
} //"}"后也不得出现分号
- 计算两个值之间的关系,称为关系运算符。下表为常见的关系运算符
2、关系运算符
运算符 | 意义 |
---|---|
== | 相等 |
!= | 不相等 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
- 关系运算的结果只有两种:整数1(结果为真)和整数0(结果为假)。
- 所有的关系运算符的优先级都比算术运算符低,但是比赋值运算符高。判断是否相等的==和!=的优先级比其他的低,连续的关系运算从左到右进行运算。
3、if - else 语句
//形式1:单条执行语句
if (判断表达式) 执行语句 else 执行语句
//形式2:多条执行语句(复合语句)
if (判断表达式) {
执行语句1
执行语句2
...
}
else {
执行语句1
执行语句2
...
}
4、if 语句的嵌套
if (判断表达式1) {
执行语句
} if (判断表达式2) {
执行语句
}
else {
执行语句
}
else
和其最近的那个if
匹配;- 缩进格式不能按时
else
的匹配关系;
建议:
- 在
if
和else
后面始终都加上{}
,即便只有一条执行语句的时候。 - 相匹配的
if
和else
位置对齐。
5、if语句的级联
if (判断表达式1)
执行语句
else if (判断表达式2)
执行语句
...
else if (判断表达式)
执行语句
else
执行语句
6、if语句的常见错误
1、复合执行语句时,忘了加大括号
{}
。
- 对策:永远都在
if
和else
后面加上大括号。
2、
if
后面加分号。即:if (判断表达式); 语句 //上下两种代码等价 if (判断表达式) ; 语句
3、错误使用
==
和=
if
只要求()
里的值是零(判断为假)或非零(判断为真)
4、代码风格
- 在
if
和else
之后必须加上大括号{}
形成语句块;- 在大括号
{}
内的语句缩进一个tab的位置。
7、多路分支switch-case
格式:
switch (控制表达式) { //控制表达式只能是整型值
case 常量表达式 : 语句 //此处的"常量表达式"可以是常数,也可以是常数计算表达式,例如"2"或"1+1"均可
...
case 常量表达式 : 语句
default : 语句
}
举例:
switch(type) {
case 1:
printf("type = 1");
break; //跳出判断
case 2: //"type"满足对应的值,直接跳转到相应的case语句处,而非从一开始从上到下顺序判断。
printf("type = 2");
break; //跳出判断
case 3:
printf("type = 3");
break; //跳出判断
default: //其他情况
printf("type=其他值");
}
特别注意: case只是表示判断后的程序继续执行的起始位置,只是“入口”,不是将程序划分成段。若没有break则不再继续判断,不管此后的case的值是几,程序仍然顺序执行。例如如下程序:
// 此程序,type=1和type=2的输出结果是一样的,因为case 1:结束之后没有break。若case 2后没有break,则会继续执行case 3之后的语句。直到遇到break或"}"结束。
switch(type) {
case 1:
case 2:
语句
break;
case 3:
语句
break;
default:
语句
}
二、 循环
1、while
循环
while
语句格式:
while(循环判断表达式) {
循环语句
}
while
循环流程图:
- 循环体内要有改变循环判断的条件的机会,否则会成为死循环。
while
循环的意思是,不断地重复循环体内的语句。while
循环执行之前判断是否继续循环,所以有可能循环一次也没有被执行。(与do-while
不同)- 条件成立是循环继续的条件。
2、do-while
循环
do-while
循环格式:
do {
循环语句
} while(返回循环条件); //此处必须有分号 (可以认为大括号{}自带分号)
do-while
循环流程图:
do-while
循环至少会进入循环一次(与while
不同)
Tips:
- 注意循环的起始值和结束值;
- 要模拟运行一个很大次数的循环,可以模拟较少的循环次数,然后做出推断;
- 计算之前记得保存原始的值,后面可能有用。
- 整数的分解(如何得到整数的各个位上的数字):
- 整数%10,得到个位数;
- 整数/10,得到十位数;
- 对2的结果%10,得百位数
- 。。。以此类推。
- **求逆序数
- :**
int x, digit; //digit为末位数字 scanf("%d",&x); //读取原数字 do { digit = x%10; //得到末位数字 printf("%d",digit); //输出末位数字 //ret = ret*10 + digit; x /= 10; //原数字移去最后一位 }while(x!=0);
3、for
循环
格式:
for (表达式1; 表达式2; 表达式3) {
语句
}
//表达式1——初始(化)条件
//表达式2——循环继续(重复循环体)的条件
//表达式3——每次循环结束前的最后一步操作
以上for语句等价于下面的语句:
表达式1;
while(表达式2){
语句
表达式3;
}
for
循环的3个表达式可以省略其中一个。
Tips:3种循环
- 如果有固定次数,用
for
循环;- 如果必须执行1次,用
do-while
循环;- 其他情况用
while
循环。
三、循环控制
1、循环控制
break
:跳出循环
(完全跳出此循环,包括本轮和往后的轮数)continue
:提前结束本轮循环
(跳过剩下的语句,直接进入下一轮)。
程序举例:
//判断素数程序
int x,i;
scanf("%d", &x);
int isPrime = 1;
for(i=2;i<x;i++){ //其实此处循环只需要从2到x的平方根之间就行了
if(x%i == 0){
isPrime = 0;
break; //只要存在能被1和其本身之外的数整除,则结束循环
}
}
if(isPrime == 1) printf("是素数");
else printf("不是素数");
2、多重循环
(1)循环嵌套
- 在每一层循环中,控制循环的变量应当各不相同,否则会报错。
程序举例:
//判断素数程序
int x;
for(x=1;x<=100;x++){
int i;
int isPrime = 1;
for(i=2;i<x;i++){
if(x%i == 0){
isPrime = 0;
break; //只要存在能被1和其本身之外的数整除,则结束循环
}
}
if(isPrime == 1) printf("%d ",x);
}
(2)嵌套循环的跳出
break
和continue
都只能对其所在的那一层循环做操作,当存在循环嵌套时,非其所在的其他层循环仍要继续,不会被跳过。- 多重嵌套的跳出最合适的方法是
goto
语句。其余情况尽量不要用,否则会破坏程序的结构性,导致可读性很差。
方法一:接力break
程序举例:
//用1角、2角和5角化钱,找到一种解决方案即可
int x;
int one; two; five;
int exit = 0; //判断break是否接力的变量
scanf("%d", &x);
for(one = 1;one<=x*10;one++){
for(two = 1;two<=x*10/2;two++){
for(five = 1;five<=x*10/5;five++){
printf("%d元等于%d个1角+%d个2角+%d个5角",x,one,two,five);
exit = 1; //找到则改变接力变量
break;
}
if(exit) break; //判断是否接力
}
if(exit) break; //判断是否接力
}
方法二:goto
语句
基本结构:
【标号语句】
标识符 : 语句
//注意冒号
【goto语句】goto 标识符;
程序举例:
for(one = 1;one<=x*10;one++){
for(two = 1;two<=x*10/2;two++){
for(five = 1;five<=x*10/5;five++){
printf("%d元等于%d个1角+%d个2角+%d个5角",x,one,two,five);
goto out; //out为跳出的标号
}
}
}
out: //跳出位置,注意冒号结尾
3、循环应用
(1)前n项求和
程序举例:
//求f(n) = 1-1/2+1/3-1/4+...+1/n
int i,n;
int sign = 1; //更换正负号
double sum=0.;
scanf("%d",&n);
for(i=1;i<=n;i++){
sum += sign*1./i;
sign = -sign; //交替改变极性
}
printf("f(%d) = %fn",n,sum);
(2)整数分解
//整数分解:例如输入10340,输出1 0 3 4 0
int x;
scanf("%d",&x);
int mask = 1; //mask存储10的倍数
int t = x;
//对于不同位数的x,求与其位数相同的mask。例如输入100342,mask=100000
while(t>9){
t /= 10;
mask *= 10;
}
printf("x=%d, mask = %d", x, mask);
do{
int d = x / mask;
printf("%d",d);
if(mask>9){ //mask为此语句的判断条件,而非x
printf(" ");
}
x %= mask;
mask /= 10;
}while(mask>0); //mask为此循环的判断条件,而非x
(3)求最大公约数
- 枚举法:
int a,b,i;
for(i=1; i<a&&i<b; i++){
if(a%i==0 && b%i==0) ret = i;
}
printf("%d和%d的最大公约数为%d", a,b,ret);
2.辗转相除法
思路:
- 如果b等于0,计算结束,a既是最大公约数;
- 否则,计算a与b的余数,让a等于b,而 b等于那个余数;
- 回到第一步。
演示代码:
//辗转相除法求最大公约数
int a,b,ret;
scanf("%d %d",&a,&b);
while(b!=0){
ret = a%b;
a = b;
b = ret;
}
printf("最大公约数为%d",a);
最后
以上就是落寞战斗机为你收集整理的【C基础】04 判断和循环一、判断二、 循环三、循环控制的全部内容,希望文章能够帮你解决【C基础】04 判断和循环一、判断二、 循环三、循环控制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复