c语言程序流程控制(下)

嵌套

switch分支结构

语法

//A到n必须是常量名
   switch(表达式)
  {case 'A' :语句块;break;//switch匹配到A,执行这条语句
   case 'B' :语句块;break;//switch匹配到B,执行这条语句
   case 'C' :语句块;break;//switch匹配到C,执行这条语句
   ......
   case 'n' :语句块;break;
   default :语句块;//switch没有匹配到上面任何一条语句,执行这条语句
   }

例题

请编写一个程序,该程序可以接收一个字符,比如: a,b,c,d,e,f,g。a表示星期一,b表示星期二…根据用户的输入显示相依的信息。要求使用switch语句完成

#include<stdio.h>
void main(){
	
	char c1;
	printf("请输入一个字符(a,b,c,d,e,f,g):");
	scanf("%c",&c1);
	switch(c1){
		case 'a':printf("今天星期一");break; 
		case 'b':printf("今天星期二");break; 
		case 'c':printf("今天星期三");break; 
		case 'd':printf("今天星期四");break; 
		case 'e':printf("今天星期五");break; 
		case 'f':printf("今天星期六");break; 
		case 'g':printf("今天星期天");break; 
		default:printf("请输入正确的字符");break;
	} 
	printf("\n程序结束!"); 
} 

在这里插入图片描述

switch细节

switch应该注意以下51.switch语句中的expression是一个常量表达式
2.case子句中的值必须是常量,而不能是变量
3.default子句是可选的,当没有匹配到case时,执行default
4.break语句用来在执行完一个case分支后使程序跳出switch语句块
5.如果没有写break,会执行下一个case 语句块,知道遇到break 或执行到switch结尾,这个现象称为穿透

练习

1.使用 switch 把小写类型的 char型转为大写(键盘输入)。只转换a, b, c, d, e.其它的输出“other”。

#include<stdio.h>
void main(){
	
	char c1;
	printf("请输入一个字符(a,b,c,d,e):");
	scanf("%c",&c1);
	switch(c1){
		case 'a':printf("A");break; 
		case 'b':printf("B");break; 
		case 'c':printf("C");break; 
		case 'd':printf("D");break; 
		case 'e':printf("E");break; 
		default:printf("other");break;
	} 
} 

在这里插入图片描述
2.对学生成绩大于60分的,输出“合格”。低于60分的,输出“不合格”。(注:输入的成绩不能大于100)。

#include<stdio.h>

void main(){	
	double score;
	printf("请输入你的成绩:");
	scanf("%lf",&score);
	switch((int)(score/60)){ //用除取整,大于60就取1,小于60就取0 
		case 0:printf("不合格");break; 
		case 1:printf("合格");break; 
		default:printf("输入的成绩有误");break;
	} 
}

在这里插入图片描述
这里还有一个小小的问题就是当我们输入大于100,小于120的数,会输出合格。怎么办呢?在给一层判断,也就是嵌套。

#include<stdio.h>

void main(){	
	double score;
	printf("请输入你的成绩:");
	scanf("%lf",&score);
	if(score>=0 && score<=100){
	switch((int)(score/60)){ //用除取整,大于60就取1,小于60就取0 
		case 0:printf("不合格");break; 
		case 1:printf("合格");break; 
		default:printf("输入的成绩有误");break;
	} 
}
    else{
    	printf("输入的成绩有误");
	}
}

在这里插入图片描述
3.根据用于指定月份,打印该月份所属的季节。(3,4,5春季,6,7,8夏季,9,10,11 秋季,12,1,2冬季)。

#include<stdio.h>
void main(){
	
	int month;
	printf("请输入一个月份(1~12):");
	scanf("%d",&month);
	switch(month){
		case 3: //后面不写break,会穿透执行下面的语句,所以输入3或者4或者5都会打印春季 
		case 4:
		case 5:printf("春季");break; 
		case 6: 
		case 7:
		case 8:printf("夏季");break;
		case 9: 
		case 10:
		case 11:printf("秋季");break;
		case 12: 
		case 1:
		case 2:printf("冬季");break;
		default:printf("请输入月份1~12");break;
	} 
} 

在这里插入图片描述
4.根据用户输入显示对应的星期时间(char[ ]),如果“星期一”,显示“干偏豆角”如果“星期二”,显示“醋溜土豆”如果“星期三”,显示“红烧狮子头”如果“星期四”,显示“油炸花生米”如果“星期五”,显示“蒜蓉扇贝”如果“星期六”,显示“东北乱炖”如果“星期日”,显示“大盘鸡”。不是输入星期几就输出“请输出入确星期时间”

#include<stdio.h>
#include<stdlib.h> 

void main(){	
	int a;
	printf("请输入星期几(1~7):");
	scanf("%d",&a);
	switch(a){
		case 1 :printf("干煸豆角");break; 
		case 2 :printf("醋溜土豆");break; 
		case 3 :printf("红烧狮子头");break; 
		case 4 :printf("油炸花生米");break; 
		case 5 :printf("蒜蓉扇贝");break; 
		case 6 :printf("东北乱炖");break; 
		case 7 :printf("大盘鸡");break; 
		default:printf("请输出入确星期时间");break;
	} 
} 

在这里插入图片描述

switch与if语句的比较

如果判断的具体数值不多,而符合整型、枚举类型。虽然两个语句都可以用,建议使用switch
其他情况:对区间判断,对结果为真假的判断,使用if,if的使用范围广

循环控制

for循环

基本介绍:让你的代码可以循环的执行

基本语法: for( 循环变量初始化 ; 循环条件 ; 循环变量迭代 ){ 循环操作(多条语句); }

案例:打印5遍“你好!”
原始方法就直接打印5遍,代码比较臃肿,而且如果要打印更多遍那代码量就太大了。我们可以用循环。

#include<stdio.h>

void main(){
	printf("你好!\n");
	printf("你好!\n");
	printf("你好!\n");
	printf("你好!\n");
	printf("你好!\n");
}

在这里插入图片描述
用for循环

#include<stdio.h>

void main(){
	int i;
	for(i=1;i<=5;i++){
		printf("\n你好!");
	}
}

在这里插入图片描述
注意事项和细节说明:
1.循环条件是返回一个表示真假的表达式。

2.for(;循环判断条件;)中的初始化和变量迭代可以不写(写到其他地方),但是两边的分号必须写
案例

#include<stdio.h>

void main(){
	int i=1;
	for(;i<=5;){
		printf("\n你好!");
		i++;
	}
}

在这里插入图片描述

3.循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开。

#include<stdio.h>

void main(){
	int i;
	int j;
	for(i=0,j=0;i<=3;i++,j+=2){
		printf("\n i=%d j=%d",i,j);
	}
}

在这里插入图片描述

练习题

打印 1~100之间所有是9的倍数的整数的个数及总和[使用for 完成]。

#include<stdio.h>

void main(){
	int i;
	int j;
	int count=0;
	int sum=0;
	for(i=1;i<=100;i++){
		j =i%9;
		if(j==0){
			count=count+1;
			sum=sum+i;
		}
	}
	printf("count=%d sum=%d",count,sum);
}

在这里插入图片描述

while循环控制

基本语法

循环变量初始化;while(循环条件){ 循环体; 循环变量迭代; }
循环条件是返回一个表示真假的表达式
while循环是先判断再执行语句

案例:使用while循环完成输出5遍你好!

#include<stdio.h>

void main(){
	int i=1;
	while(i<=5){
		printf("你好!\n");
		i++; 
	}
}

在这里插入图片描述

do while 循环

基本语法

循环变量初始化; do { 循环体; 循环变量迭代;} while( 循环条件);
循环条件是返回一个表示真假的表达式

注意:do while 后面有一个分号,不能省略
do while 循环是先执行,后判断。
案例:使用do…while循环完成输出5遍你好!

#include<stdio.h>

void main(){
	int i=1;
	int max=5;
	do{
		printf("你好!\n");
		i++; 
	}
	while(i<=max);
}

在这里插入图片描述

多重循环控制

多重循环控制介绍:
1.将一个循环放在另一个循环体内,就形成了循环嵌套。其中,for ,while ,do…while均可以作为外层循环和内层循环。【建议一般使用两层,最多不要超过3层】,如果嵌套循环过多,会造成可读性降低。
2.实质上,循环嵌套就是把内层循环当成外层循环的循环体,当只有内层循环的循环条件为flase时,才会跳出内层循环,才可结束外层的当前循环,开始下一次循环。
3.假设外层循环次数为m次,内层为n次,则内层循环实际上需要执行m*n次

例题
(1)统计3个班成绩情况,每个班有5名同学,求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。

#include<stdio.h>

void main(){
	double TotalScore=0.0;//每个班总分 
	double score=0.0;//学生成绩
	double all;//所有班级平均分 
	int i,j;
	for(i=1;i<=3;i++){//3个班,所以要 i 不能超过 3
	    //每次一个班级平均分后要清0 
	    TotalScore=0.0;
	    for(j=1;j<=5;j++){//5个学生,所以要 j 不能超过 5
	    	printf("\n请输入第%d班级的第%d学生的成绩:",i,j);
	    	scanf("%lf",&score);
	    	TotalScore =TotalScore + score;//一个班级的总成绩 
		}
		all = all + TotalScore;//所有班级总成绩 
		double TL = TotalScore/5;//班级平均分 
		printf("\n第%d个班级的平均分=%.2f",i,TL); 
	}
	//输出所有班级的成绩
	double all1 = all/3;
	printf("\n所有班级的 平均分=%.2f",all1);
}

在这里插入图片描述
(2)统计三个班及格人数,每个班有5名同学。

#include<stdio.h>

void main(){
	double score=0.0;//学生成绩
	int count;//及格人数 
	int i,j;
	for(i=1;i<=3;i++){//3个班,所以要 i 不能超过 3
	    for(j=1;j<=5;j++){//5个学生,所以要 j 不能超过 5
	    	printf("\n请输入第%d班级的第%d学生的成绩:",i,j);
	    	scanf("%lf",&score);
	    	if(score>60){
	    		count +=1;
			} 
		}
	}
	printf("%d",count);
}

在这里插入图片描述

(3)打印出九九乘法表

#include<stdio.h>

void main(){
	int i,j;
	for(i=1;i<=9;i++){
		for(j=1;j<=i;j++){
			printf(" %d * %d = %d ",i,j,i*j);
		}
		printf("\n");
	}
} 

在这里插入图片描述
(4)打印金字塔
打印实心金字塔

#include<stdio.h>

void main(){
	int i,j,k,m;
	scanf("%d",&m);
	for(i=1;i<=m;i++){
		for(k=1;k<=m-i;k++){//打印空格,空格数=总层数-1 
			printf(" ");
		}
		for(j=1;j<=2*i-1;j++){
			printf("*");
		}
		printf("\n");
	}
}

在这里插入图片描述
打印空心金字塔

#include<stdio.h>

void main(){
	int i,j,k,m;
	scanf("%d",&m);
	for(i=1;i<=m;i++){
		for(k=1;k<=m-i;k++){//打印空格,空格数=总层数-1 
			printf(" ");
		}
		for(j=1;j<=2*i-1;j++){
			//进行判断是该输出*还是该输出空格 
			//第一层和最后一层全打,中间的只打首尾 
			if(j==1 || j==2*i-1 || i==m){
			printf("*");
		}
		    else{
			    printf(" ");
		    }
		}
		printf("\n");
	}
}

在这里插入图片描述
(5)打印菱形

#include<stdio.h>

void main(){
	int i,j,k,m;
	scanf("%d",&m);
	for(i=1;i<=m;i++){
		for(k=1;k<=m-i;k++){//打印空格,空格数=总层数-1 
			printf(" ");
		}
		for(j=1;j<=2*i-1;j++){
			//进行判断是该输出*还是该输出空格 
			//第一层和最后一层全打,中间的只打首尾 
			if(j==1 || j==2*i-1){
			printf("*");
		}
		    else{
			    printf(" ");
		    }
		}
		printf("\n");
	}
	for(i=m-1;i>=0;i--){
		for(k=m-i;k>=1;k--){//打印空格,空格数=总层数-1 
			printf(" ");
		}
		for(j=2*i-1;j>=1;j--){
			//进行判断是该输出*还是该输出空格 
			//第一层和最后一层全打,中间的只打首尾 
			if(j==1 || j==2*i-1){
			printf("*");
		}
		    else{
			    printf(" ");
		    }
		}
		printf("\n");
	}
}

在这里插入图片描述

跳转控制语句-break

break语句用于终止某个语句块的执行,一般使用在switch或循环中。

基本语法: {.... break ; ..... }

例题:实现登录验证,有三次机会,如果用户名为"张无忌”,密码"888”提示登录成功,l否则提示还有几次机会,请使用for循环完成I。

#include<stdio.h>
#include<string.h>

void main(){
	int change=3;
	int loginCount=change; 
	char name[10] = "";
	char pwd[10] = "";
	int i;
	for(i=1;i<=loginCount;i++){
	printf("\n请输入用户名:");
	scanf("%s",name);//字符组不要&
	printf("\n请输入密码:");
	scanf("%s",pwd);
	
	//判断字符串相同使用strcmp
	if(strcmp("云云豆酱",name)==0 && strcmp("123",pwd)==0){
		printf("登入成功");
		break; 
	}
	else{
		change--;
		printf("你还有%d登入机会",change);
	}
}
} 

在这里插入图片描述

跳转控制语句-continue

continue语句用于结束本次循环,继续执行下一次循环
基本语法: {.... continue ; ..... }

注意事项和细节说明:continue语句,只能配合循环语句使用,不能单独和switch/if使用
案例
(1)打印0到30以内不是3的倍数的数

#include<stdio.h>

void main(){
	int i;
	for(i=1;i<=30;++i){
		int a=i%3; 
		if(a==0){
		 	continue;//这里是返回到for循环进行i+1操作在做下面操作
		}
		else{
		 	printf("i=%d\n",i);
	    }
	}	
}

在这里插入图片描述
(2)从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序【使用for 循环﹐break,continue完成】【positive正数,negative 】。

#include<stdio.h>

void main(){
	int positive=0;//保存正数个数 
	int negative=0;//保存负数个数 
	int num=0;
	
	for(;;){
		printf("请输入数:");
		scanf("%d",&num);
		if(num==0){
		break;
		} 
		if(num>0){
			positive++;
			continue; 
		}
		else{
			negative++;
		}
	}
	printf("正数个数=%d,负数个数=%d",positive,negative);
}

在这里插入图片描述
(3)某人有100,000元,每经过一次路口,需要交费,规则如下:
当现金>50000时,每次交5%
当现金<=50000时,每次交1000
编程计算该人可以经过多少次路口,使用while break方式完成。

#include<stdio.h>

void main(){
	int count=0;//路口数量
	int money=100000;//现有的钱 
	while(1){
		//钱小于1000,直接退出 
		if(money<1000){
			break;
		}
		if(money>50000){
			money = money*0.95;
		}
		else if(money<=50000){
			money = money - 1000;
		}
		count++;
	} 
	printf("100000元 可以经过%d 个路口 剩余%d 元",count,money);
} 

在这里插入图片描述

跳转控制语句-goto

C语言的goto语句可以无条件地转移到程序中的指定行
goto语句通常与条件语句配合使用
在C语言中一般不主张使用共同语句,以免造成程序流程的混乱,使理解和调试程序都产生困难

基本语法: goto label ...... label :statement

案例

#include<stdio.h>

void main(){
	printf( "start\n");
	goto lablel; //lable1称为标签
	printf("ok1\n");
	printf("ok2\n");
	lablel:
		printf("ok3\n");
		printf("ok4\n");
}//l输出ok3 和ok4

在这里插入图片描述

跳转控制语句-return

return是返回值语句。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值