一. 控制语句
控制语句用于控制程序的执行流程
分成三类:
1.条件判断语句(分支语句):if,switch
2.循环执行语句:do while, while, for
3.转向语句:break, goto, continue, return
二. 分支语句
1.if语句
if(conddition)
{
return x;
}
return y;
上面的代码是不明确的,会有歧义 ,应该写成下面这种形式。
if (condition)
{
return x;
}
else
{
return y;
}
示例代码:
# include<stdio.h>
int test()
{
int n = 10;
if (n > 5)
return 1;
else
return 2;//return之后再输入什么代码都不会执行
}
int main()
{
int m = test();
printf("%d\n", m);
return 0;
}
返回结果 : 1
int main()
{
int n = 5;
if (n = 3)
printf("hehe\n");
return 0;
}
当一个常量和一个变量相比较的时候,一般把常量放等号左边
int main()
{
int n = 5;
if (3 == n)
printf("hehe\n");
return 0;
}
练习:
1.判断一个数是否为奇数。
int main()
{
int n = 0;
scanf("%d", &n);
if (n % 2 == 1)
{
printf("是奇数\n");
}
else {
printf("是偶数\n");
}
return 0;
}
2.输出1到100的奇数
int main()
{
int i = 1;
while (i <= 100)
{
//判断i是奇数的话,就打印i
if (i % 2 == 1)
{
printf("%d ", i);
}
printf("%d", i);
++i;
}
return 0;
}
int main()
{
int i = 1;
while (i <= 100)
{
printf("%d ", i);
i += 2;
}
return 0;
}
第二种方法比较简便
2.switch语句
常用于多分支情况
如:输入1,就输出星期一
输入2,就输出星期二
输入3,就输出星期三
输入4,就输出星期四
输入5,就输出星期五
输入6,就输出星期六
输入7,就输出星期天
这种情况写成if...else if...else...语句太复杂了
可以用switch语句来写
switch(整形表达式)
{
case 1:
...
case 2:
....
}
int main()
{
int day = 0;
scanf("%d ", day);
switch (day)
{
case 1://case这里只能用整型
printf("星期一\n");
break;//case决定的是入口,现在需要给他一个出口,即用break
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}
//周一到周五是工作日,周六日是周末
int main()
{
int day = 0;
scanf("%d ", day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
}
return 0;
}
default语句
在上面的代码中,如果输入1到7以外的数字,系统仍不会报错,这不符合常规,所以我们给程序加上一个default,只要用户输入错误数字就会报错
int main()
{
int day = 0;
const int n = 1;
scanf("%d ", day);
switch (day)
{
default:
printf("输入错误\n");
break;
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
case 6:
case 7:
printf("weekend\n");
break;//编程好习惯,在最后一个case后加上break
}
return 0;
}
练习:求m,n的值
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;//m = 3
case 2:
n++;//n = 2
case 3:
switch (n)//因为n = 2,直接进到case 2
{//switch允许嵌套使用
case 1:
n++;
case 2://直接进到这里
m++;//m = 4
n++;//n = 3
break;//break只会跳出一层switch
}
case 4:
m++;//m = 5
break;
default:
break;
}
printf("m = %d, n = %d", m, n);//m = 5, n = 3
return 0;
}
三. 循环语句
1.while 语句
格式:
while(表达式)
循环语句;
//在屏幕上打印1到10
int main()
{
int n = 1;
while (n<=10)
{
printf("%d ", n);
n++;
}
return 0;
}
break作用:终止循环
int main()
{
int n = 1;
while (n<=10)
{
if (n == 5)
break;
printf("%d ", n);
n++;
}
return 0;
}
代码结果:
我们可以看出,在n=5的时候,break直接跳出循环不再打印了
continue
int main()
{
int n = 1;
while (n<=10)
{
if (n == 5)
continue;
printf("%d ", n);
n++;
}
return 0;
}
代码结果:
可以看出,结果中数字后面的光标一直在闪,这表明程序进入死循环,为什么会进入死循环呢。
因为continue在其中的作用是跳过本次循环continue后面的代码,直接去判断while循环的判断部分。所以有一直重来的效果。
小测试:这段代码会输出什么结果呢?
int main()
{
int n = 1;
while (n<=10)
{
n++;
if (n == 5)
continue;//continue直接跳过后面两句代码
printf("%d ", n);
}
return 0;
}
这道题有两个要注意的点:
1.n = 1进来循环的时候值先被改写(n++)再打印
2.因为n++放在前面,所以这里的continue只是跳过了n = 5这次循环,后面的循环依旧能运行。
代码结果:
对比break和continue
break一出现,这个程序中的包含break的循环永久终止。
continue一出现,直接跳过这一层循环(一次只能跳一层),进入下一层循环,不影响后面的循环操作。
插播:
int main()
{
int ch = getchar();//输入一个字符
printf("%c\n", ch);
putchar(ch);//输出字符
return 0;
}
设计字符输入输出程序
int main()
{
int ch = 0;
//EOF- end of file 文件结束标志
//在函数读取失败的时候返回EOF
//scanf函数读取成功,返回的是读取到的数据的个数
//读取失败返回EOF
//getchar 读取成功返回字符的ASCII值
//读取失败返回EOF
//ctrl + z - 会让scanf或者getchar返回EOF
while ((ch = getchar()) != EOF)
{
putchar(ch);
}
return 0;
}
下面浅讲一下char
int main()
{
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password);//password是数组,本身具有地址,所以不需要取地址
printf("请确认密码(Y/N)");
char input = 0;
scanf("%c", &input);
if ('Y' == input)
printf("确认成功\n");
else
printf("确认失败\n");
return 0;
这段代码输出结果不尽人意,如下
这是因为我们在使用getchar或者input的时候,输入密码后按了enter键,系统自动把我们的回车键当作\n输入到缓存区中,在确认密码那里系统帮我们把\n输进去了,所以自动“确认失败”。
怎样去掉这个\n呢,最朴实的方法就是加上一行getchar()
修改后的代码:
printf("请确认密码(Y/N)");
char input = 0;
scanf("%c", &input);
input = getchar();//加上这一行
if ('Y' == input)
printf("确认成功\n");
else
printf("确认失败\n");
return 0;
在一些情况下,清理一个\n是不够的,用户如果密码中包含空格这类字符,输入的空格也给塞到缓冲区中,那不就糟糕了吗
所以我们借鉴上面while ((ch = getchar()) != EOF)的写法,再写一个清除缓冲区的代码
修改后的代码如下:
int main()
{
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password);//password是数组,本身具有地址,所以不需要取地址
printf("请确认密码(Y/N)");
char input = 0;
scanf("%c", &input);
while (getchar() != '\n')
{
;
}
input = getchar();
if ('Y' == input)
printf("确认成功\n");
else
printf("确认失败\n");
return 0;
}