跟着郝斌老师复习C语言part3--流程控制

一、流程控制

1、什么是流程控制

程序代码执行的顺序

2、流程控制的分类

  • 顺序
    定义:某些代码可能执行,也可能不执行,有选择的执行某些代码
    分类:if 、 switch
  • 选择
  • 循环

二、顺序

三、选择

if

  1. if最简单的用法

    格式:

	if(表达式)
		语句; 

功能:如果表达式为真,执行语句;如果表达式为假,语句不执行。

  1. if的范围问题

    a. if 默认只能控制其后的一个语句。例如if只能控制A执行与否,而B一定会执行。

if(表达式)
	语句A;
	语句B; 

b. 用花括号括起来可控制括号内的语句。例如if可控制A和B执行与否。

	if(表达式){
		语句A;
		语句B; 
	}

由此可见:if默认只能控制一个语句的执行与否,若要控制多个语句就需要括起来。

  1. if…else的用法

  2. if…else if…else的用法
    在这里插入图片描述

  3. C语言对真假的处理
    非零就是真,零就是假
    真用1表示, 假用0表示

  4. if举例

int i = 3;
	int j = 4;
	int temp;
	temp = j;
	j = i;
	i=temp;
	printf("i=%d,j=%d",i,j);
	int a,b,c;
	int t;
	printf("请输入三个数(中间以空格分割):");
	scanf("%d %d %d",&a,&b,&c);
	if(a<b){
		t=a;
		a=b;
		b=t;
	}
	if(a<c){
		t=a;
		a=c;
		c=t;	
	}
	if(b<c){
		t=b;
		b=c;
		c=t;	
	}
	printf("%d>%d>%d",a,b,c);

对三个数字排序

  1. if的常见问题解析
    (1)空语句问题:在if()后直接加分号。即if控制一个空语句,无实际含义
    (2)else必须有对应的if,不能以else开头
    (3)if…else if…else按顺序执行,只执行第一个正确的
    (4)else可选可不选,且else不带(表达式),但是else if要带(表达式)
    (5)else(表达式); 语法不会出错但逻辑是错误的
	if(3>2);//;表示结束,导致else没有对应的if 
	printf("aa");
	else
	printf("bb");//error

switch

int val;
	printf("请输入您要进入的楼层:");
	scanf("%d",&val);	
	
	switch(val){
		case 1:
			printf("1层开!\n");
		case 2:
			printf("2层开!\n");
			break;
		case 3:
			printf("3层开!\n");
			break;
		case 4:
			printf("4层开!\n");
			break;
		default:
			printf("楼层不存在");
			break;
	}
	//输入1,输出1层开!2层开!

case,default只是switch的入口,一旦从某个入口进入后,其他的条件都被屏蔽掉,将按顺序执行到break跳出循环。
在这里插入图片描述
在这里插入图片描述
switch是选择不是循环,如果在switch中出现了break语句,该语句的功能只是退出switch语句去执行它下面的语句。在switch中出现continue是错误的。除非switch本身就是for或while循环的一部分。

四、循环

1、定义

某些代码会被重复执行

2、分类

for循环:

  • 1.格式

  • 2.执行顺序:
    单个for循环的使用:
    在这里插入图片描述
    执行顺序:第一轮:1243(3结束代表这次循环结束)
    第二轮:243
    第三轮:243

    最后一轮:2

    多个for循环的嵌套使用:
    在这里插入图片描述
    第一轮大循环:1,2,4,5,
    内部小循环: A,6,5,A,6,5,A…5(不成立),3(内部循环完毕,第一轮大循环结束)
    第二轮大循环:2,4,5,
    内部小循环: A,6,5,A,6,5,A…5,3(内部循环完毕,第二轮循环结束)

    2不成立:结束for循环,执行B
    在这里插入图片描述
    - 3.范围:

默认执行其后一个语句,多个语句需要大括号

- 4.例子:

1-10的奇数之和

int i;
	int sum=0;
	for(i=1;i<=10;i+=2){
		sum+=i;
	}
	printf("%d\n",sum);//25
	printf("%d",i);//11

for和if的嵌套使用例子:

	int i;
	int j=0;
	int o=0;
	int sumj=0;
	int sumo=0;
	float avg;
	for(i=1;i<=10;i++)
	{
		if(i%2==1){
			sumj=sumj+i;
			j+=1;
		}
		else{
			sumo=sumo+i;
			o+=1;
		}	
	}
	//avg=1.0*sumj/j;
	printf("1-10的奇数个数为:%d,奇数和为:%d,奇数平均值为:%d\n",j,sumj,sumj/j);
	printf("1-10的偶数个数为:%d,偶数和为:%d\n",o,sumo);

1+1/2+1/3…1/100

	int i;
	float sum=0;
	for(i=1;i<=100;++i){
		sum=sum+1/(float)i;//或sum=sum+1.0/i;
	}
	printf("%f",sum);

试数:在这里插入图片描述

浮点数存储带来的问题

while

  1. 执行顺序
    格式:
    在这里插入图片描述
  2. 与for的相互比较
    for和while可以相互转换
    但for的逻辑性更强,更不容易出错,推荐多使用for
    在这里插入图片描述
  3. 举例
    从键盘输入一个数字,如果该数字是回文数,则返回yes,否则返回no(回文数:正着写和倒着写都一样的数字)
	int val;//存放待判断的数字 
	int m;
	int sum=0;
	printf("请输入您需要判断的数字:");
	scanf("%d",&val);
	m=val;
	while(m){
		sum=sum*10+m%10;
		m /=10;
	}
	if(sum==val)
		printf("yes!");
	else
		printf("no!");
  1. 什么时候用while,什么时候用for

do…while

主要用于人机交互
在这里插入图片描述
do…while 和while、for不能相互转换
原因是do…while至少执行一次。但while、for当表达式为假时不执行。

一元二次方程

	double a,b,c;
	double delta;
	double x1,x2;
	char ch;
	do{	
		printf("请输入一元二次方程的三个系数:\n");
		printf("a=");
		scanf("%lf",&a);
		printf("b=");
		scanf("%lf",&b);
		printf("c=");
		scanf("%lf",&c);	
		delta=b*b-4*a*c;
		if(delta>0){
			x1=(-b+sqrt(delta))/(2*a);
			x2=(-b-sqrt(delta))/(2*a);
			printf("有两个解,x1=%lf,x2=%lf\n",x1,x2);
		}
		else if(delta==0){
			x1=x2=(-b)/(2*a);
			printf("有唯一解,x1=x2=%lf\n",x1);
		}
		else{
			printf("方程组无解\n"); 
		}
		printf("您想继续吗?(Y/N):");
		scanf(" %c",&ch);// %c前面必须加一个空格 
	}while('y'==ch||'Y'==ch);

3、break 和continue

  • break
    break如果用于循环是用来终止循环
    break如果用于switch,则是用于终止switch
    break不能直接用于if,除非if属于循环内部的一个子句
	for(i=0;i<3;++i){
		if(3>2)
		break;//break 虽然是 if 内部的语句 ,但 break 终止的却是外部的 for 循环 
		printf("ee\n");//什么也没输出。
	}

在多层循环中,break只能终止距离他最近的for循环

	int i,j;
	for(i=0;i<2;i++){
		for(j=1;j<4;++j)
		break;//break只能终止距离他最近的for循环 
		printf("同志们好\n");//同志们好!同志们好! 
	} 

在多层switch嵌套中,终止距离他最近的switch

int x=1,y=0,a=0,b=0;
	 switch(x){//第一个switch
	 	case 1:
	 		switch(y){//第二个switch
	 			case 0:
	 				a++;
	 				break;//终止第二个
	 			case 1:
	 				b++;
	 				break;//终止第二个
			}
			b=100;
			break;//终止第一个
		case 2:
			a++;
			b++;
			break;//终止第一个
	 }
	 printf("a=%d,b=%d",a,b);//a=1,b=100
  • continue
    用于跳过本次循环余下的语句,转去判断是否需要执行下次循环。
	for(1;2;3)
	{
		A;
		B;
		continue;//如果执行该语句,则执行完该语句后,会执行语句3,C和D都不执行 
		C;
		D;
	}
	while(表达式)
	{
		A;
		B;
		continue;// 如果执行该语句,则执行完该语句后,会执行表达式,C和D都不执行。如果要执行for中的语句3,则需要将其放在continue前。
		C;
		D;
	}

在这里插入图片描述
在这里插入图片描述
几个例子:
在这里插入图片描述

	int i=0,s=0;
	do{
		if(i%2){
			i++;
			continue;//跳过i++,s+=i,执行while(i<5) 
		}
		i++;
		s+=i;
	}while(i<5);
	printf("%d\n",s);//9
	int a=1,b;
	for(b=1;b<=10;b++){
		if(a<=8)
		break;//跳到printf("") 
		if(1==a%2){
			a+=5;
			continue;//跳到for,执行b++ 
		}
		a-=3;
	} 
	printf("b=%d\n",b);//1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值