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应该注意以下5点
1.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是返回值语句。