分支语句
-
if
-
swich
循环语句
-
while
-
if
-
do while
1.什么是语句?
C语句可分为以下五类:
表达式语句
函数调用语句
控制语句
复合语句
空语句
C语言是一门结构化的程序设计语言
C语言支持三种结构:顺序结构、选择结构、循环结构
(选择语句)、(循环语句)
控制语句用于控制结构的执行流程,有九种控制语句:
条件判断语句也叫分支语句:if语句、switch语句;
循环执行语句:do while语句、while语句、for语句;
转向语句:break语句、goto语句、continue语句、return语句。
2.分支语句(选择结构)
2.1if语句
2.1.1if语句
//语法结构:if(表达式)语句1;
C语言中,0表示假,非0表示真。
if语句,默认只能控制一条语句,如果有多条语句,需要加大括号,一对{ }代表一个代码块
else的匹配:else和与它距离最近的if匹配
2.1.2if的书写对比
比较一个变量和一个常量是否相等的时候,建议把常量放在等号左边:10==num
2.1.3 练习
1. 判断一个数是否为奇数
2. 输出1-100之间的奇数
int main(){int i=1;while(i<=100){if(i%2==1){printf("%d ",i);}i++;}return 0;}int main(){int i=1;while(i<=100){printff("%d ",i);i+=2;}return 0;}
2.2switch语句
2.2.1switch语句
switch语句也是一种分支语句,常常用于多分支的情况
switch允许嵌套使用
swutch(整型表达式){语句项;}caae 整型常量表达式;语句;
int main(){int day=0;scanf("%d",&day);switch(day){case 1:printf("星期1\n");breaak;case 2:printf("星期2\n");breaak;case 3:printf("星期3\n");breaak;case 4:printf("星期4\n");breaak;case 5:printf("星期5\n");breaak;case 6:printf("星期6\n");breaak;case 7:printf("星期7\n");breaak;default:printf("选择错误\n");breaak;}return 0;}
case只决定程序入口,而break决定出口
int main(){int day=0;scanf("%d",&day);switch(day){case 1;case 2;case 3;case 4;case 5;pritnf("工作日\n");break;case 6;case 7;pritnf("休息日n");break;}return 0;}
2.2.2 default子句
如果表达的值与所有的case标签的值都不匹配怎么办? 其实也没什么,结构就是所有的语句都被跳过而已。 程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。 但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢? 你可以在语句列表中增加一条default子句,把下面的标签 default: 写在任何一个 case 标签可以出现的位置。 当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。 所以,每个switch语句中只能出现一条default子句。 但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。
3.循环语句
-
while
-
for
-
do while
3.1while循环
3.1.1while循环的语法
//while 语法结构while(表达式)循环语句;
#include<stdio.h>int main(){int i = 1;while(i<=10)//while后面默认跟一条语句,所以要加大括号{printf("%d ", i);i++;}return 0;}
3.1.2while语句中的break和continue
-
break在while循环中的作用:
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的break是用于永久终止循环的。即当满足某种条件时break
-
continue在while循环中的作用:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
#include<stdio.h>int main(){int i = 1;while(i<=10){i ++;if(i == 5)continue;printf("%d ", i);}return 0;}//输出结果为1 2 3 4 6 7 8 9 10
补充: getchar(输入一个字符)
putchar(输出一个字符)
char ch=0;ch=getchar( );putchar(ch);
int main( ){char pasword[20]={0};int ch=0;printf("请输入密码“};scanf("%s",pasword);//数组名本身就是一个地址//消除\n(清理缓冲区)getchar( );printf("请确认密码(Y\N)");ch=getchar( );if(ch=='Y')printf("确认成功");elseprintf("确认失败");return 0;}
scanf与getchar读取数据的不同
scanf [123456] <—缓冲区[123456\n]<—键盘[123456\n]
[ ] <—缓冲区[\n ]<—键盘[ ]scanf读到"\n"或者" "就停止
getchar[123456] <—缓冲区[123456\n]<—键盘[123456\n]
[123456]<—缓冲区[\n ]<—键盘[ ]
[\n ]<—缓冲区[\n ]<—键盘[ ]\n是上次剩下的,getchar会读取\n
当出现下面这种情况:”输入123456 xxx"
scanf [123456] <—缓冲区[123456 xxx\n]<—键盘[123456 xxx\n]
[ ] <—缓冲区[ xxx\n ]<—键盘[ ]
getchar [ ]<—缓冲区[ xxx\n ]<—键盘[ ]
[ ]<—缓冲区[ xxx\n ]<—键盘[ ]
[ ]<—缓冲区[ xxx\n ]<—键盘[ ]
[ ]<—缓冲区[xxx\n ]<—键盘[ ]
[x ]<—缓冲区[xx\n ]<—键盘[ ]
[x ]<—缓冲区[x\n ]<—键盘[ ]
[x ]<—缓冲区[\n ]<—键盘[ ]
[\n ]<—缓冲区[ ]<—键盘[ ]
int main( ){char pasword[20]={0};int ch=0;printf("请输入密码“};scanf("%s",pasword);//数组名本身就是一个地址//消除\n(清理缓冲区)while(getchar( )!='\n'){;}printf("请确认密码(Y\N)");ch=getchar( );if(ch=='Y')printf("确认成功");elseprintf("确认失败");return 0;}
//这个代码的作用是:只打印数字字符,跳过其他字符的#include<stdio.h>int main( ){char ch = '\0';while ((ch = getchar()) != EOF){if (ch < ‘0’ || ch > ‘9’)continue;putchar(ch);}return 0;}
%c-字符
%s-字符串
%d-整型
%f-float浮点数
%lf-double浮点数
%p-打印地址
%x-以十六进制的形式进行打印
float f=0.0f;
scanf:按照一定格式输入数据
printf:按照指定的格式输出数据
3.2for循环
#include<stdio.h>int main(){int i = 1; //初始化while(i<=10) //判断{printf("%d ", i);i++; //调整}return 0;}//输出结果为1 2 3 4 5 6 7 8 9 10
3.2.1for循环的语法
for(表达式1; 表达式2; 表达式3)循环语句;
-
表达式1 表达式1为初始化部分,用于初始化循环变量的。
-
表达式2 表达式2为条件判断部分,用于判断循环时候终止。
-
表达式3 表达式3为调整部分,用于循环条件的调整。
#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;}
3.2.2 break和continue在for循环中
我们发现在for循环中也可以出现break和continue,他们的意义和在while循环中是几乎一样的。
-
break在for循环中的作用:
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:for中的break是用于永久终止循环的。即当满足某种条件时break
-
continue在for循环中的作用:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到for语句的调整部分。进行下一次循环的入口判断。
区别:在for循环中,continue使得程序跳过循环语句直接进入调整阶段,即执行表达式三;而while循环中,continue使得程序直接跳转到while语句的判断部分,不会执行continue后面的语句。
3.2.3 for语句的循环控制变量
-
建议不可在for 循环体内修改循环变量,防止 for 循环失去控制。
-
建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
3.2.4 一些for循环的变种
for循环的初始化,判断和调整三部分都可以省略,但是省略掉判断部分,循环为死循环。,即判断部分恒为真
#include<stdio.h>int main()//代码1{int i = 0;int j = 0;//这里打印多少个hehe?for(i=0; i<10; i++){for(j=0; j<10; j++){printf("hehe\n");}retunrn 0;}//代码2{int i = 0;int j = 0;//如果省略掉初始化部分,这里打印多少个hehe?for(; i<10; i++){for(; j<10; j++){printf("hehe\n");}return 0;}
3.2.5 一道笔试题:
//请问循环要循环多少次?#include <stdio.h>int main(){int i = 0;int k = 0;for(i =0,k=0; k=0; i++,k++)k++;return 0;}//for循环中的表达式二k=0,是指给k赋值为零,即表达式k=0的值为0,且0表示假,所以不会进入循环
3.3 do...while()循环
3.3.1 do语句的语法:
do循环语句;while(表达式);
3.3.2 do语句的特点
循环至少执行一次,使用的场景有限,所以不是经常使用。
#include<stido.h>int main(){int i = 10;do{printf("%d\n", i);i++;}while(i<=10);return 0;}
3.3.3 do while循环中的break和continue
#include<stdio.h>int main(){int i = 10;do{printf("%d\n", i);if(5 == i)break;i++;}while(i<10);return 0;}//1 2 3 4 5#include<stdio.h>int main(){int i = 10;do{printf("%d\n", i);if(5 == i)continue;i++;}while(i<10);return 0;}//1 2 3 4 5 5 5 5 5 5 ...
3.4 练习
-
计算 n的阶乘。
-
计算 1!+2!+3!+……+10!
-
在一个有序数组中查找具体的某个数字n。(二分查找)
-
编写代码,演示多个字符从两端移动,向中间汇聚。
-
写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则 提示登录成,如果三次均输入错误,则退出程序。
#include<stdio.h>int main(){int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int k = 7;//查找7int left = 0;int right = 9;int flag = 0;while (left <= right){int mid = (left + right) / 2;if (arr[mid] > k){right = mid - 1;}else if (arr[mid] < k){left = mid + 1;}else{printf("找到了,下标是:%d\n", mid);flag = 1;break;}}if (flag == 0)printf("找不到\n");return 0;}