三、选择循环
三、选择循环
1.if -else语句
程序员控制程序执行逻辑运算需要选择和循环结构,
算术运算符的优先级高于关系运算符、关系运算符的优先级高于逻辑与和逻辑或运算符、相同优先级的运算符从左至右进行结合等, 那么表达式5>3&&8<4-!0的最终值是多少? 其计算过程如下图所示。
- 5>3逻辑值为1
- !0逻辑值1
- 4-1=3
- 8<3逻辑值0
- 1&&0逻辑值为0
if判断条件(表达式) 为真, 就执行某个语句, 反之不执行这个语句。也可以if判断条件(表达式) 为真, 就执行某个语句, 反之用else分支执行另一个语句, 具体流程如下图1和图2所示。
下面来看一个判断输入值是否大于0的例子。
#include <stdio.h>
//练习if与else
int main() {
int i;
while(scanf("%d",&i))
{
if(i>0)//if下面加一个大括号
{
printf("i is bigger than 0\n");
}else{
printf("i is not bigger than 0\n");
}
}
return 0;
}
当输入值大于0时,打印“i is bigger than 0”,当输入值小于等于0时,打印“i is not biggerthan 0”, 注意, 在这个例子中, if后面不能加分号, 因为如果有 else 分支语句, 那么加分号会导致编译不通过;如果没有 else分支语句, 那么加分号会导致i无论取何值, 都会打印“i is bigger than 0”。
if语句和else 语句也可以多个同时使用(多分支语句) , 如下图 3 所示,但是, 无论有多少个if 语句或else if 语句, 程序都只会执行其中的一个语句,下面是一个关于用电量的例子:用电量越高,电的单价越高, 但最终 cost 只会被赋值一次, 同时, if语句也支持多层嵌套, 在if 语句中又包含一个或多个if语句称为if 语句的嵌套
if (number>500) cost=0.15;
else if(number>300) cost=0.10;
else if(number>100) cost=0.075;
else if(number>50) cost=0.05;
else cost=0;
使用if 嵌套语句时,要考虑“悬空的else”问题。例如, 在下面的例子中, else子句从属于哪个 if 语句?
if(i>1)
if(i<10)
printf("i>1 and i<10\n");
else
printf("no, they are not\n");
和其他绝大多数语言一样, C语言中的else子句从属于最靠近它的不完整的if语句。上例中的else子句从属于第二个if语句, 如果想让它从属于第一个 if语句, 那么可以用一个花括号把第二个 if语句包含在一个单独的代码块内, 如下所示。
if(i>1){
if(i<10)
printf("i>1 and i<10\n");
}
else
printf("no, they are not\n");
在 if语句中的语句列表前后加上花括号, 可以防止不小心加了一句代码后, 使实际未被包含的语句被包含在某个if语句中的错误。
2.while循环
“当型”循环结构,一般形式为“while(表达式) 语句;”, 当表达式的值非0时, 执行while语句中的内嵌语句。其特点是: 先判断表达式, 后执行语句。当表达式的值非0时, 就会执行语句, 从而实现语句多次执行的效果。为了避免程序进入死循环(不停地进行循环操作) , 在语句中需要有让表达式趋近于假的操作来使程序跳出循环。
while后面不能加分号, 否则虽然编译可以通过, 但是执行程序时会发生死循环。通常会将 while语句用花括号括起来, 就算while语句只有一句, 也会用花括号括起来, 这么做是因为一个程序往往会经过多次修改, 使用花括号可以让程序更加清晰, 避免向循环内添加语句时出错。
例计算1-100整数和
#include <stdio.h>
// while
int main (){
int i =1;
int sum=0;
while (i<=100)//加分号死循环
{
sum+=i;//没有趋近于假的操作也会死循环
i++;//i=i+1 i+=1
}
printf("%d",sum);
}
3.for循环
C语言中的for循环语句使用最为灵活, 不仅可以用于循环次数已经确定的情况, 而且可以用于循环次数不确定而只给出循环结束条件的情况, 它完全可以代替while循环语句。其一般形式为
for(表达式1;表达式2;表达式3) 语句;
先求解表达式1。
求解表达式2, 若其值为真 (值为非0) , 则先执行 for语句中指定的内嵌语句, 后执行第(3) 步。若其值为假 (值为0) , 则结束循环, 转到第 (5) 步。
求解表达式3。
转回第 2步继续执行。
循环结束, 执行for语句下面的语句。
for循环语句中必须且只能有两个分号, 用于分割表达式1、表达式2 和表达式3。表达式1、表达式2、表达式3可以省略, 表达式1可以使用逗号初始化多个变量,表达式3的作用是使表达式2趋近于假。for循环可读性好。
计算1到100之间的所有整数之和
#include <stdio.h>
int main (){
int i,total=0;
for (i=1;i<=100;i++)//加分号不会死循环结果会不对
{
total+=i;
}
printf("%d",total);
}
4.continue语句
continue语句的作用为结束本次循环, 即跳过循环体中下面尚未执行的语句, 接着进行是否执行下一次循环的判断。其一般形式为
continue;
1到100之间的奇数进行求和
#include <stdio.h>
int main (){
int i,total;
for (i=1,total=0;i<=100;i++)
{
if(i%2==0)
{
continue;//continue下面代码都不会执行
}
total+=i;
}
printf("%d",total);
return 0;
}
用于while和 do while 循环中时,注意不要跳过让循环趋近于假的语句。
5.break语句
break语句的作用是结束整个循环过程, 不再判断执行循环的条件是否成立。
例子从1开始累加, 当累加的和大于 2000时, 结束 for循环, 同时打印此时 total的 值 和 i 的 值 。 一 旦 执 行 break语 句 , 下 一 句 要 执 行 的 就 是“printf(“total=%d,i=%d\n”, total,i);”。break语句也可用在 while 循环和 do while 循环中, 起结束对应循环的作用。
#include <stdio.h>
int main (){
int i,total;
for(i=1,total=0;i<=100;i++)
{
if(total>2000)
{
break;
}
total+=i;
}
printf("%d %d\n",total,i);
return 0;
}
6.列题
6.1 判断是否是对称数
输入一个整型数,判断是否是对称数,如果是,输出yes,否则输出no,不用考虑这个整型数过大,int类型存不下,不用考虑负值;
例如 12321是对称数,输出yes,124421是对称数,输出yes,1231不是对称数,输出no
#include <stdio.h>
int main(){
int i,a=0,b=0,c=0;
scanf("%d",&i);
b=i;
while(i)
{
c=i%10;
i=i/10;
a=a*10;
a+=c;
}
if (a==b)
{
printf("yes\n");
}else
{
printf("no\n");
}
}
6.2 100元换零钱
某人想将手中的一张面值100元的人民币换成10元、5元、2元和1元面值的票子。要求换正好40张,且每种票子至少一张。问:有几种换法?
#include <stdio.h>
int main(){
int w,x,y,z;
int n=0;
for(w=1;w<10;w++)
{
for(x=1;x<20;x++)
{
for(y=1;y<37;y++)
{
for(z=1;z<37;z++){
if (w*10+x*5+y*2+z==100&&x+y+z+w==40)
{
n++;
}
}
}
}
}
printf("%d",n);
return 0;
}