分支和循环补充附练习解析
C语言学习笔记(七)循环知识的补充:
【goto语句】
[*]C语言中提供可以随意滥用的 goto 语句和标记跳转的标号(这里夸张化了)
[*]从理论上 goto 语句是没有必要的,实践中没有 goto 语句也可以很容易的写出代码
[*]但是某些场合下 goto 语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环,这种情况 break 是达不到目的的。它只能从最内层循环退到上一层的循环
【goto语句适用的场景如下】
for(;;)
for(;;)
{
for(;;)
{
if(disaster);
goto error;
}
}
......
error:
if(disaster)
//处理错误情况
【往后跳】
#include <stdio.h>
int main()
{
again:
printf("hell\n");
goto again;
return 0;
}
运行结果:死循环【往前跳】
#include <stdio.h>
int main()
{
printf("hello\n");
goto again;
printf("nihao\n");
again:
printf("hehe\n");
return 0;
}
运行结果:
hello
hehe
【使用goto语句编写关机程序】
#include <stdio.h>
#include <windows.h>
int main()
{
char input = {0};
system("shutdown -s -t 60");//60 s 后关闭计算机
again:
printf("如果想要取消关机,请输入“我是帅哥\n");
scanf("%s",input);
if(0 == strcmp(input,"我是帅哥"))
{
system("shutdown -a");
printf("已取消关机\n");
}
else
{
goto again;
}
return 0;
}温馨提示:在试验这个程序的时候要先把正在用的文件保存好,别等一下输入法出现问题,在规定时间内没输入指定的字符串导致电脑关机,文件丢失那损失就大了
分析:
这里要介绍几个函数和命令,system()是执行系统命令函数,对应的头文件是<windows.h>;shoutdown -s -t 60 意思是计算机将在 60s 时关闭,shutdown 是 Windows 系统自带一个名为Shutdown.exe的程序,可以用于关机操作,shutdown -s 意思是关机,shutdown -s -t 意思是设置关机时间,单位为:s;shutdown -a 意思是取消关机 ;一旦程序运行,就执行关机命令,需要用户输入指定的字符串才能执行取消关机命令,否则执行 goto 语句,重新打印提示信息,提醒用户输入指定字符串
其实也可以不使用 goto 语句,用 while 循环语句代替,代码如下:
#include <stdio.h>
#include <windows.h>
int main()
{
char input = {0};
system("shutdown -s -t 60");//60 s 后关闭计算机
while(1)
{
printf("如果想要取消关机,请输入“我是帅哥\n");
scanf("%s",input);
if(0 == strcmp(input,"我是帅哥"))
{
system("shutdown -a");
printf("已取消关机\n");
}
}
return 0;
}这样就把 goto 语句替换掉了,所以前面我们说 “从理论上 goto 语句是没有必要的,实践中没有 goto 语句也可以很容易的写出代码”
【do...while循环】
do
{
循环语句;
}
while(表达式);
【关于do while循环的例子】
#include <stdio.h>
int main()
{
int i = 0;
do
{
printf("%d\n",i);
i ++;
}
while(i <= 10);
return 0;
}
运行结果:0 1 2 3 4 5 6 7 8 9 10分析:上来不管三七二十一先给你执行一次循环体打印 i 的值,i ++ 后再对 i 进行判断,符合条件则继续执行循环,不符合就结束循环
【拓展】
在 do while 语句中同样可以使用 break 语句和 continue 语句
int i = 1;
do
{
if(5 == i)
break;
printf("%d\n",i);
i ++;
}
while(i <= 10);
运行结果:1 2 3 4int i = 1;
do
{
if(5 == i)
continue;
printf("%d\n",i);
i ++;
}
while(i <= 10);
运行结果:1 2 3 4 死循环如果上面的代码有不明白的可以翻看前面的 分支循环(一)和 分支循环(二)的博文
do while语句的特点:循环体至少执行一次,使用的场景有限,所以不是很常用
【练习部分】
【一、】
一道笔试题:
请问循环多少次?
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for(i = 0,k = 0;k = 0;i ++,k ++)
{
k ++;
}
return 0;
}
答案:执行 0 次
分析:初始化循环变量 i 和 k ,但是在判断语句部分,表达式是 k = 0 ,在前面的博文我们提过,如果判断部分为 0 ,那么表示结果为假,循环体不被执行,很多人这里会错,原因是他们认为判断部分 k = 0 初始化部分 k 也为 0 ,所以条件符合执行循环体,这是错误的想法。
【二、】
①、关于 if 语句的说法正确的是()
A.if 语句后面只能跟一条语句
B.if 语句中 0 表示假,1 表示真
C.if 语句是一种分支语句,可以实现单分支,也可以实现多分支
D.else 语句总是和它的对齐的 if 语句匹配
答案:C
分析:A :明显是错误的,我们前面笔记说过,if或者else后面跟的代码多就要用 {} 将代码括起来,这就说明了 if 语句后面不可能只跟一条语句;B和C :很多人会纠结,觉得应该是个双选题,的确,在 0 表示假,但是表示真的我们说的是“非零整数”,所以相对于C而言我们选C,它挑不出任何问题;D :else 是与它离得最近的且未配对的 if 配对
②、下面代码中 func(1) = ()
A:30 B:20 C:16 D:0
int func(int a)
{
int b;
switch(a)
{
case 1:b = 30;
case 2:b = 20;
case 3:b = 16;
default:b = 0;
}
return b;
}答案:D
分析:题目给了 func(1),意思是把 1 传给常数 a ,所以此时 a = 1,进入switch 的 case 1:中,此时 b = 30,由于没有 break 语句所以,继续往下执行其他的 case,一直到 b = 0;最后把 b 返回,所以 func(1) = 0
③、switch(c)语句中,c不可以是什么类型()
A.int
B.long
C.char
D.float
答案:D
分析:在前面的博文有讲过,不懂的看前面的博文;这里只讲一下 char 为什么可以,有人会问,char 不是字符类型的吗?怎么能满足 c 为整型的要求,其实,字符类型存在内存中的是这个字符对应的ASCII码值,ASCII码值是十进制的整数,所以也是整型的
④、下面代码运行后的结果:
#include <stdio.h>
int main()
{
int x = 3;
int y = 3;
switch(x % 2){
case 1:
switch(y)
{
case 0:
printf("first");
case 1:
printf("second");
break;
default:printf("hello");
}
case 2:
printf("third");
}
return 0;
}答案:hellothird
分析:这里会做错那肯定是又忽略 break 这条语句存在和不存在时候的区别了,x = 3 模 2 == 1,所以执行第一个switch语句的case 1,进入第二个switch,因为 y = 3 ,但是没有 case 3 这个语句,所以执行 default 打印 hello,由于没有 break 语句,顾循环不会跳出,接着执行 case 2,打印 third,所以最终结果是:hellothird
⑤、关于while(条件表达式)循环体,以下叙述正确的是( )(假设循环体里面没有 break、continue、return、goto等等语句)
A.循环体的执行次数总是比条件表达式的执行次数多一次
B.条件表达式的执行次数总是比循环体的执行次数多一次
C.条件表达式的执行次数与循环体的执行次数一样
D.条件表达式的执行次数与循环体的执行次数无关
答案:B
分析:
while(表达式)
{
循环体;
}
//不管怎么样我先执行条件表达式,判断是否符合条件,符合循环体执行一次,再次执行条件表达式(第二次),若果不符合,结束循环,此时条件表达式比循环体多执行一次,所以不管怎么样,条件表达式都要比循环体多执行一次
⑥、下列程序输出的结果是()
A.10
B.9
C.8
D.7
#include <stdio.h>
int main()
{
int a = 0,b = 0;
for(a = 1,b = 1;a <= 100;a ++)
{
if(b >= 20)break;
if(b % 3 == 1)
{
b = b + 3;
continue;
}
b = b - 5;
}
printf("%d\n",a);
return 0;
} 答案:C
分析:a 和 b 都初始化为 1,a <= 100,条件为真,执行循环体,b < 20,条件为假,执行第二条 if 语句,1 % 3 == 1,结果为真,b = 4;执行 continue,回到 for 循环处 a ++,再进行判断 啊== 2,a <= 100,条件为真,b == 4, b < 20,继续执行第二条 if 语句,4 % 3 == 1,条件为真,一直这样循环下去,单 a = 7时,b == 21,此时 a++,a == 8,由于 b == 21 大于 20,所以执行 break 语句跳出循环,最终 a == 8,(代码中的 b = b + 3 永远没机会被执行)
文档来源:51CTO技术博客https://blog.51cto.com/u_15304931/3190832
页:
[1]