目录
一、前言
- 分支语句
- 循环语句
二、分支语句(选择结构)
if语句
语法结构:
if(表达式)语句;
或者;
if(表达式)语句1;else语句2;//多分支if(表达式1)语句1;else if(表达式2)语句2;else语句3;
习题演示:
1、
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
//如果年龄大于等于18,打印成年人,否则打印未成年人
int age=0;
scanf("%d", &age);
if (age >= 18)
printf("成年人");
else
printf("未成年人");
return 0;
}
2、
#include<stdio.h>
//age<18未成年
//18-30青年
//30-50中年
//50-70中老年
//70-99老年
//>99老寿星
int main()
{
//如果年龄大于等于18,打印成年人,否则打印未成年人
int age=0;
scanf("%d", &age);
if (age < 18)
printf("未成年人");
else if(age>=18&&age<30)
printf("青年");
else if (age >= 30 && age < 50)
printf("中年");
else if (age >= 50 && age < 70)
printf("中老年");
else if (age >= 70 && age < 99)
printf("老年");
else
printf("老寿星");
return 0;
}
笔记:
一条if语句后面只能控制一条语句:
这里if语句只能控制是否打印成年了而不能控制打印谈恋爱。
除非加上大括号{}。也就是代码块{}
#include <stdio.h>int main(){if(表达式){语句列表1;}else{语句列表2;}return 0;}
这里的一对 { } 就是一个代码块。
悬空else
#include <stdio.h>int main(){int a = 0;int b = 2;if(a == 1)if(b == 2)printf("hehe\n");else //else悬空了,模糊了它与哪个if匹配。系统默认是与最近的if匹配。printf("haha\n");return 0;}
正确写法是:
//适当的使用{}可以使代码的逻辑更加清楚。//代码风格很重要#include <stdio.h>int main(){int a = 0;int b = 2;if(a == 1){if(b == 2){printf("hehe\n");}}else{printf("haha\n");}return 0;}
else的匹配:else是和它离的最近的if匹配的。
if书写形式的对比
//代码1if (condition) {return x;}return y;//代码2if(condition){return x;}else{
代码2更好,清楚易懂。
//代码3int num = 1;if(num == 5){printf("hehe\n");}//代码4int num = 1;if(5 == num){printf("hehe\n");}
代码4更好,有时候我们后把等号写成赋值号,把数值放在左边,哪怕代码出错,在编译时就可以快速定位出错点。减少后面出bafu的风险。
练习 :
练习
/*1. 判断一个数是否为奇数*/
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if (n % 2 == 0)
printf("NO\n");
else
printf("YES\n");
}
//2输出1-100之间的奇数
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 100)
{
if (i % 2 == 1)
printf("%d\n ",i);
i++;
}
return 0;
}
switch语句
输入1,输出星期一输入2,输出星期二输入3,输出星期三输入4,输出星期四输入5,输出星期五输入6,输出星期六输入7,输出星期日
如果使用if else...语句实现的话也可以,但是太复杂了,不够简练。所以这种情况下应该使用switch语句。
1、结构
switch(整型表达式){语句项;}语句项是://是一些case语句://如下:case 整形常量表达式:语句;
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//实现以下功能:
/*输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日*/
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期1");
break;
case 2:
printf("星期2");
break;
case 3:
printf("星期3");
break;
case 4:
printf("星期4");
break;
case 5:
printf("星期5");
break;
case 6:
printf("星期6");
break;
case 7:
printf("星期日");
break;
default:
printf("选择错误");
break;
}
return 0;
}
2、default子句:
如果表达的值(输入的值)与所有的case标签的值都不匹配怎么办?其实也没什么,结构就是所有的语句都被跳过而已。程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?你可以在语句列表中增加一条default子句,把下面的标签default:写在任何一个 case 标签可以出现的位置。当 switch 表达式的值(输入的值)并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。所以, 每个switch语句中只能出现一条default子句。但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句
#include<stdio.h>
//实现以下功能:
/*1. 输入1-5,输出的是“weekday”;
2. 输入6-7,输出“weekend”*/
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday");
break;
case 6:
case 7:
printf("weekend");
break;
default:
printf("选择错误");
break;
}
return 0;
}
case后面不一定跟语句,代码还是会运行,只是跳过了,1,2,3,4,5,6,7是输入值,也是选择运行入口,输入1,后面没有语句,还是会往下运行,直到遇到break语句,跳出分支。
3、在switch语句中的 break
在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。
具体请看上面代码:
三、循环语句
- while
- for
- do while
while循环
if(条件)语句;
1、结构:
//while 语法结构while(表达式)循环语句;
2、 while语句执行的流程:
expr:while循环的条件
stmt:符合条件后运行的语句
break:while 循环的break是永久终止循环的意思,只要遇到break,循环就终止。
continue:while 循环中continue的作用是:跳过本次循环,直接去判断部分。
解释一下:代码运行先是判断是否符合条件,!=0意思是条件不为0,即为真。==0即为假,不循环。条件为真则运行语句,然后循环。或者遇到break,终止跳出循环。
3、例题:
//比如我们实现:
//在屏幕上打印1 - 10的数字。
#include<stdio.h>
int main()
{
int i=1;
while (i <= 10)
{
printf("%d ",i);
i++;
}
return 0;
}
4、while语句中的break和continue:
break
//continue 代码实例1
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
continue;
printf("%d ", i);
i = i+1;
}
return 0;
}
//continue 代码实例2
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
i = i+1;
if(i == 5)
continue;
printf("%d ", i);
}
return 0;
}
结果是:2 3 4 6 7 8 9 10 11
i=5时跳过本次循环,没有打印5。
//代码什么意思?//代码1#include <stdio.h>int main(){int ch = 0;while ((ch = getchar()) != EOF)putchar(ch);return 0;}这里的代码适当的修改是可以用来清理缓冲区的.//代码2#include <stdio.h>int main(){char ch = '\0';while ((ch = getchar()) != EOF){if (ch < ‘0’ || ch > ‘9’)continue;putchar(ch);}return 0;}//这个代码的作用是:只打印数字字符,跳过其他字符的、
for循环
1、语法 :
for(表达式1; 表达式2; 表达式3)循环语句;说明:表达式 1表达式1为 初始化部分,用于初始化循环变量的。表达式 2表达式2为 条件判断部分,用于判断循环时候终止。表达式 3表达式3为 调整部分,用于循环条件的调整。
说明:for循环语句运行先是1初始化部分,再是2条件判断部分,然后3循环语句,最后是4调整部分。
#include <stdio.h>
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}
2、对比;
int i = 0;//实现相同的功能,使用whilei=1;//初始化部分while(i<=10)//判断部分{printf("hehe\n");i = i+1;//调整部分}//实现相同的功能,使用forfor(i=1; i<=10; i++){printf("hehe\n");}
3、break和continue
continue在for循环的作用
#include<stdio.h>
//使用for循环 在屏幕上打印1-10的数字
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}//continue会使其跳过后面的语句,即i==5时跳过了打印5,跳到了调整语句,即i++
break在for循环的作用
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;//它会让这个循环就此永久结束
printf("%d ", i);
}
return 0;
}
4、for语句的循环控制变量
建议使用前一种写法[0,10)前闭后开。因为数组中10个元素,<10有某种意义,更好理解。控制边界。
5、一些for循环的变种:
变种2:
变种3:
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
//如果省略掉初始化部分,这里打印多少个hehe?
for (; i < 10; i++)
{
for (; j < 10; j++)
{
printf("hehe\n");
}}return 0;
}//i=0时,0<10进入循环,然后j=0,0<10.循环打印10次hehe.这时j已经是10了。所以第一个循环即便i=2,2<10也不运行第二个循环
变种4;
do...while()循环
do语句的语法 :
//使用do...while()语句打印1-10;
#include<stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
do语句执行流程:
do while循环中的break和continue
#include <stdio.h>
int main()
{
int i = 10;do
{
if (5 == i)
break;
printf("%d\n", i);
} while (i < 10);return 0;
}// break;终止循环
#include <stdio.h>
int main()
{
int i = 10;do
{
if (5 == i)
continue;
printf("%d\n", i);
} while (i < 10);return 0;
}//continue跳过本次循环后面的语句,到判断部分。