在程序中程序运行的流程控制决定程序是如何执行的,是我们必须掌握的主要有三大流程控制语句
1)顺序控制介绍:程序从上到下逐行执行中,中间没有任何判断和跳转
代码案例:
void main(){
int num=12;
int num2=num+2;
}
2)分支控制
-1.分支控制if-else
介绍:让程序有选择的执行,也分三种
(1)单分支if(条件表达式){
执行代码块;
}
说明:当条件表达式为真(非0)时,就会执行{}的代码,返回假(0)时,不会执行{}的代码
案例
#include(2)双分支int main() { printf("请输入一个整数:n"); int age=0; fflush(stdout); scanf("%d",&age); if(age>18){ printf("你的年龄大于18岁了,要对自己的行为负责!"); } return 0; }
if(条件表达式){
执行代码块1;
}else{
执行代码块2
}
说明:当条件表达式成立时(为真),执行代码块1,否则执行代码块2
案例:
#includeint main() { printf("请输入一个整数:n"); int age=0; fflush(stdout); scanf("%d",&age); if(age>18){ printf("你的年龄大于18岁了,要对自己的行为负责!"); }else{ printf("你的年龄不大,这次放过你了!"); } return 0; }
案例练习:
#include(3)多分支void main(){ int age=2008; if(age%4==0 && age %100!=0 ||age%400==0){ printf("是闰年"); } }
基本语法:
if(条件表达式){
执行表达式1;
}else if(条件表达式2){
执行代码块2;
}
...else{
执行代码块;
}
1)当条件表达式1成立时,即执行代码块1
2)如果表达式1不成立时,才去判断表达式2是否成立。
3)如果表达式2成立,就执行代码块2,
以此类推,如果所有的表达式都不成立,则执行else代码块
注意:只能有一个执行入口
案例演示:
岳小鹏参加C语言2级考试,他和父亲岳不群达成协议
如果:
成绩为100分奖励一辆BMW;成绩为[60,80]时,奖励一台iphone7plus.
当成绩为[60,80]奖励一个ipad;
其他什么奖励也没有,请从键盘上输入他的期末考试并加以判断。
#includevoid main(){ double score=0; printf("请输入成绩:"); fflush(stdout); scanf("%lf",&score); if(score==100){ printf("奖励宝马一台"); }else if(score>80 && score<=99){ printf("奖励一台iphone7plus"); }else if(score>=60 && score<=80){ printf("奖励一台ipad"); }else{ printf("没有奖励"); } }
案例:
#include(4)嵌套分支#include void main(){ int height=0; int money=0; int handsome=0; printf("请输入值:"); fflush(stdout); scanf("%d,%d,%d",&height,&money,&handsome); if(height>180 && money>100000 && handsome==1){ printf("我一定要嫁给他"); }else if(height>180 || money>10000000 || handsome==1){ printf("嫁吧,比上不足,比下有余"); }else{ printf("不嫁"); } }
基本介绍
在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支结构称为内层分支外面的分支结构称为外层分支。嵌套分支不适合过多,最多不要超过3层
基本语法
if(){
if(){ //被包含的可以是各种分支类型
}else{
}
}
案例:
#includevoid main(){ double time=0.0; char gender= ' '; printf("请输入跑步成绩(s)n"); fflush(stdout); scanf("%lf",&time); //根据time判断是否进入决赛 if(time<=8){ //进入 printf("请输入性别(m/f)n"); fflush(stdout); scanf("%c",&gender);//接收到上次回车 fflush(stdout); scanf("%c",&gender);//这次才接收到性别 if(gender=='m'){ printf("请进入男子组就决赛"); }else{ printf("请进入女子组就决赛"); } }else{ printf("你被淘汰"); } }
#include-2.switch分支结构void main (){ int month=0; int age=0; double price =60.0; printf("month:"); fflush(stdout); scanf("%d",&month); printf("age:"); fflush(stdout); scanf("%d",&age); if(month>=4 && month <=10){//旺季 if(age>60){ printf("¥%.2f",price/3); }else if(age>=18){ printf("¥%.2f",price); }else{ printf("¥%.2f",price/2); } }else{//淡季 if(age>=18 && age<60){ printf("¥40"); }else{ printf("¥20"); } } }
流程图:
基本介绍:switch(表达式){
case常量1://当
语句块1;
break;
case常量2:
语句块2;
break;
...
case 常量n:
语句块n;
break;
default:
default 语句块;
break;
}
#includeswitch细节谈论void main(){ char c1=' '; printf("请输入一个字符:n"); fflush(stdout); 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("只能输入a~g"); } }
1)switch语句中的expression是一个常量表达式,必须是一个整形(charshort,int long等)或枚举类型
2)case子句中的值必须是常量,而不是变量
3)default子句是可选的,当没有匹配的cse时,执行default
4)break语句用来执行完一个case分支后使程序跳出switch语句块;
5)如果没有写break,会执行下一个case语句块,直到遇到break或者执行到switch结尾,这个现象称为穿透
超级案例:
#includeswitch与if的比较void main(){ //根据用于指定月份,打印该月份所属的季节,3,4,5春季6,7,8夏季 9,10,11秋季 12,1,2冬季 int month=0; printf("请输入月份;"); fflush(stdout); scanf("%d",&month); switch (month) {//会自动向下穿透 case 3: 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; } }
1.如果判断的具体数值不多,而且符合整形、枚举类型。虽然两个语句都可以使用,建议使用switch语句
2.其他情况:对区间判断,对结果为真假的判断,使用if,if的范围更广
3)循环控制基本介绍:可以让代码循环执行
-1.for循环基本语法:
for(循环变量初始化,循环条件,循环变量迭代){
循环语句操作;
}
案例:
#includevoid main(){ for(int i=0;i<5;i++){ printf("你好C语言n"); } }
注意 事项和细节说明
1)循环条件是返回一个表示真(非0)假(0)的表达式
2)for(;循环判断条件;)中的初始化变量迭代可以不写(写到其他地方)但是两边的分号不能省略
//写法2:可以将变量的初始化和迭代放在其他地方
char name[10] =" ";
while(strcmp(name,"exit")!=0){
printf("请输入姓名:n");
fflush(stdout);
scanf("%s",&name);
printf("您输入的名字是:%s",name);
}
流程图:d
while循环的细节注意事项
1)循环条件是返回一个表示真(非0)假(0)的表达式
2)while循环是先判断再执行语句
-3.do while循环基本语法:
循环变量的初始化;
do {
循环语句;
循环变量迭代;
}while(循环条件);
//注意.do while后面的 ;不能省略
实战案例:
#includevoid main(){ //5句话 int i=1;//循环变量初始化 int max=5;//循环的最大次数 do{ printf("你好世界 "); i++; }while(i<=max);//循环条件 }
注意事项与细节说明:
1)循环条件是返回一个表示真(非0)假(0)的表达式
2)do…while循环是先执行,再判断
案例:
1.求出1~100的和:
#includevoid main(){ //求出1~100的和 int i=1;//循环变量初始化 int sum=0;//循环的最大次数 do{ sum=sum+i; i++; }while(i<=100);//循环条件 printf("1~100的和为:%d",sum); }
2.统计1~200之间能被5整除但不能被3整除的个数
#includevoid main(){ int i=1; int count=0; do{ if((i%5==0)&&(i%3!=0)){ count ++; printf("%d ",i); } i++; }while(i<=200); printf("1~200之间的符合条件的数为: %d",count); }
题2:
#include4)多重循环控制 介绍:void main(){ char answer=' '; do{ printf("老婆问:我可以继续购物吗?y/n"); fflush(stdout); scanf("%c",&answer);//获取用户 getchar();//过滤掉回车键 }while(answer =='y'); printf("老婆终于退出购物了"); }
- 将一个循环放在另一个循环体内,就行成了嵌套循环,其中for,while,do…while均可以作为外层循环和内层循环。【建议一般使用两层,最多不超过三层】如果循环过多,会造成可读性降低
- 实质上,嵌套循环就是把内层循环当作外层循环的循环体。当只有内层循环的循环条件位false时。才会完全跳出内层循环,才可结束外层的当次循环,开始下一轮循环
- 设外层循环次数为m次,内层为m次,则内层循环实际上要执行m*m次。
-
统计3个班成绩情况,每个班有5名同学,求出各个班的平均分和所有班级的平均分【学生的成绩从键盘输入】
#include
void main(){ int stuNum=5; int classNum =2; double classTotalScore=0.0; double score=0.0; int i,j; for(i=1;i<=classNum;i++){//控制班级的循环次数 //每次给一个班级输入成绩时需要清零 classTotalScore=0.0; for(j=1;j<=stuNum;j++){ printf("n请输入第%d个班级的第%d个学生的成绩n",i,j); fflush(stdout); scanf("%lf",&score); classTotalScore +=score;//累计成绩 } //当内层的for循环结束后,就得到了该班级的总成绩 printf("n第%d个班级的平均分=%.2f",i,classTotalScore/stuNum); } } -
统计三个班级的及格人数,每个班有5名同学
//在上一个代码的基础之上,定义一及格人数变量。符合条件的话就进行递增迭代 int stuNum=5; int classNum =2; double classTotalScore=0.0; double score=0.0; int jige=0; int i,j; for(i=1;i<=classNum;i++){//控制班级的循环次数 //每次给一个班级输入成绩时需要清零 classTotalScore=0.0; jige=0; for(j=1;j<=stuNum;j++){ printf("n请输入第%d个班级的第%d个学生的成绩n",i,j); fflush(stdout); scanf("%lf",&score); classTotalScore +=score;//累计成绩 if(score>=60){ jige++; } } //当内层的for循环结束后,就得到了该班级的总成绩 printf("n第%d个班级的平均分=%.2f",i,classTotalScore/stuNum); printf("n第%d个班级的及格人数为:=%d",i,jige); } } -
打印出九九乘法表
#include
void main(){ //99乘法表 for(int i=1;i<=9;i++){ for(int j=1;j<=i;j++){ printf("%d*%d=%d ",i,j,i*j); } printf("n"); } } 打印金子塔;
#include
void main(){ //打印标准金字塔 //打印出空心金字塔 int i,j,k,end=5; for(i=1;i<=end;i++){ for(k=1;k<=end-i;k++) { printf(" "); } for(j=1;j<=2*i-1;j++){ if(j==1||j==2*i-1 || i==end){//当i=5的时候就全部输出星 printf("*"); }else{ printf(" "); } } printf("n"); } }
需求:
随机生成一个数,直到生成97个数,看看你哟用了几次;
提示:
-
rand()返回一个范围在0到RAND_MAX之间的随机数
-
rand()函数在stdlib.h头文件当中
通过该需求可以说明他流程控制数据的必要性,比如break
#include
#include int main() { int i=0;//定义一个变量统计生成次数 printf("开始生成随机数n"); while(1){ int a=rand();//生成一个随机数 if(a==97){ printf("%dn",a); break; } printf("%dn",i);//顺序输出次数 i++; } printf("生成了%d次",i); return 0; } 基本介绍:
break语句用于终止某个语句块的执行,一般使用在switch或者循环中(三大循环)
基本语法:
{ ..... break; }
#include跳转语句-continue#include void main(){ //100以内的数进行求和,看看当和大于20的时候该数是多少? // int i=1; // int sum=0; // for(i=1;i<=100;i++){ // sum +=i; // if(sum>20){ // printf("i=%d",i); // break; // } // } //实现登录验证,有三次机会,如果用户名为张无忌,密码为i"888"提示登录成功 //否则提示登录失败 int chance=3; int loginCount=chance; char name[10]=" "; char pwd[10]=" "; for(int i=1;i<=loginCount;i++){ printf("请输入名字:n"); fflush(stdout); scanf("%s",name); printf("请输入密码:n"); fflush(stdout); scanf("%s",pwd); //使用strcmp函数进行操作用于比较两个字符串是否相同 if(strcmp("张无忌",name)==0&&strcmp("888",pwd)==0){ printf("登录成功"); break; }else{ //机会次数减少 chance --; printf("你还有%d次机会",chance); } } }
基本介绍:
continue语句可用于结束本次循环,继续执行下一次循环。
基本语法:
{
......
continue;
}
注意事项和细节说明:
continue语句,只能配合循环语句使用,不能单独和switch语句使用。
void main(){
int i=0;
switch(i){
case 1:
continue;//错误
}
if(i>1){
continue;//错误
}
}
案例练习:
#includevoid main(){ //从键盘读入不同个数不确定的数,并判断读入的正数和负数的个数 //输入为0时结束程序【使用for循环,break,continue完成】 // 【positive 正数 negative负数】 int positive=0; int negative=0; int num =0;//接收从控制台输入的个数 for(;;){//表示一个死循环,永不退出 printf("请输入数:n"); fflush(stdout); scanf("%d",&num); if(num==0){ break;//跳出for循环 } if(num>0){ positive++; continue; } //num是一个负数 negative++; } printf("正数的个数%d,负数的个数%d",positive,negative); }
#include跳转语句-gotovoid main(){ int money=100000; int count =0; while(1){ if(money<1000){ break; } if(money>50000){ money=money*0.95; }else if(money<=50000){ money-=1000; } count++; } printf("可以经过%d个路口剩余%d元",count,money); }
介绍:
- C语言的goto语句可以无条件地转移到程序中指定的行。
- goto语句通常与条件语句配合使用。可用来实现条件转移,跳出循环体等功能。
- 在C程序设计中一般不主张使用goto语句,以免造成程序混乱,使理解和调试程序都产生困难
基本语法:
gotolabel .... label:statement
案例演示:
#include跳转语句-returnvoid main(){ printf("startn"); goto label1;//标签,到下一个标签内的语句都不会被执行 printf("ok1n"); printf("ok2n"); label1: printf("ok3n"); printf("ok4n"); } 输出结果: start ok3 ok4
跳出所有函数,函数细说;
练习;
#includevoid main(){ //水仙花数 //判断一个整数是否是水仙花数,所谓水仙花数就是一个3位数 // 其各个数字上的;立方和等于其本身例如:153=1*1*1 +5*5*5 +3*3*3; int i=153; int bai=i/100; int shi=i%100/10; int ge=i%10; if(i==bai*bai*bai +shi*shi*shi +ge*ge*ge){ printf("%d是水仙花数n",i); }else{ printf("不是水仙花数"); } }
案例2:
#includevoid main(){ //输出1000~9999的闰年使用 for while do while这三种循环进行操作 //while 循环 //do while 循环操作 int i=1000; do{ if(i%4==0&&i/100!=0||i%400==0){ printf("i=%d ",i); } i++; }while(i<=9999); }
案例3:
#includevoid main(){ //输出小写a-z以及大写Z-A char c1,c2; for( c1='a';c1<='z';c1++){ printf("%c ",c1);//输出26个字母 } printf("n================n"); for(c2='Z';c2>='A';c2--){ printf("%c ",c2); } }
//求出1-1/2+1/4.....1/100的和
#include
void main(){
double sum=0;
for(int i=1;i<=100;i++){
if(i%2!=0){
sum+=1.0/i;//考虑保留小数1.0而不是1
}else{
sum-=1.0/i;
}
}
printf("sum=%.2f",sum);
}
}
printf(“nb1=%d,b2=%d”,b1,b2);
int a=2;
while(a<2){
printf("n执行while");
}
do{
printf("执行do while");//至少会执行一次
}while(a<2);
*/
//输出1000~9999的闰年使用 for while do while这三种循环进行操作
//while 循环
//do while 循环操作
int i=1000;
do{
if(i%40&&i/100!=0||i%4000){
printf("i=%d ",i);
}
i++;
}while(i<=9999);
}
案例3: ```c #includevoid main(){ //输出小写a-z以及大写Z-A char c1,c2; for( c1='a';c1<='z';c1++){ printf("%c ",c1);//输出26个字母 } printf("n================n"); for(c2='Z';c2>='A';c2--){ printf("%c ",c2); } }
//求出1-1/2+1/4.....1/100的和
#include
void main(){
double sum=0;
for(int i=1;i<=100;i++){
if(i%2!=0){
sum+=1.0/i;//考虑保留小数1.0而不是1
}else{
sum-=1.0/i;
}
}
printf("sum=%.2f",sum);
}



