C流程控制语句
流程控制语句
1.介绍
- 在程序中,程序运行的流程控制决定程序是如何执行的,是必须掌握的,主要有三大流程控制语句
- 顺序控制
- 分支控制
- 循环控制
2.顺序控制
1)介绍
- 程序从上到下逐行的执行,中间没有任何判断和跳转
- 执行语句1--执行语句2--。。。。。--执行语句n
2)顺序控制举例和注意事项
- Java C中定义变量时采用合法的向前引用的原则;如
void main(){
int num1 = 12;
int num2 = num1 +2;
}
3.分支控制if--else
1 .介绍
- 让程序有选择的执行,分支控制有三种
- 单分支
- 双分支
- 多分支
2.单分支
- 基本语法
if(条件表达式){
执行代码块
}
-
说明:当条件表达式为真(非零)时,就会执行{}的代码,返回假(0)时,不会执行{}的代码
-
案例说明
//编写一个程序,可以输入人的年龄,如果该同志的年龄大于18岁,则输出“你的年龄大于18,要对自己的行为负责”
#include <stdio.h>
void main(){
/*分析
1.int age 接收输入的年龄
2.使用if单分支来判断,进行相应的处理
*/
int age = 0;
printf("请输入年龄:");
scanf("%d",&age);
if(age>18){
printf("你的年龄大于18,要对自己的行为负责");
}
printf("OK~~~");
getchar();//接收回车
getchar();//暂停控制台
}
3.双分支
- 基本语法
if(条件表达式){
执行代码块1;
}else{
执行代码块2;
}
- 说明:当条件表达式成立(为真),执行代码块1,否则执行代码块2
- 案例演示
#include <stdio.h>
void main(){
int age = 0;
printf("请输入年龄:");
scanf("%d",&age);
if(age>18){
printf("你的年龄大于18,要对自己的行为负责");
}else{
printf("你的年龄不大这次就放过你了");
}
printf("OK~~~");
getchar();
getchar();
}
- 练习
//对下面代码,若有输出,指出输出结果
int x = 4;
int y = 1;
if(x>2){
if(y>2){
printf("x+y=%d",x+y);
}
printf("atguigu");
}else{
//如果if -- else 中的代码块,只有一条语句,则可以省略{}
printf("x is = %d",x);
}
void main(){
//编写程序,声明2个double类型变量并赋值,判断第一个数大于10.0,且第二个数小于20.0,打印两数之和
//分析
//1.定义2个double d1 d2
//2.使用逻辑与
//3.使用if
double d1 = 146.7;
double d2 = 23.3;
if(d1>10.0&&d2<20.0){
printf("d1+d2=%.2f",(d1+d2));
}
}
//判断一个年份是否为闰年 ,闰年的条件时符合下面二者之一
//1.年份能被4整除,但不能被100整除 2.能被400整除
//分析
//1.定义变量year
//2.有逻辑与和逻辑或的综合使用
//3.if--else
void main(){
int year = 2020;
if( (year%4==0&&year%100!=0) || year%400 ==0){
printf("%d年是闰年",year);//闰年366天 平年 365
}else{
printf("%d不是闰年",year);
}
getchar();
}
4.多分支
- 基本语法
if(条件表达式1){
执行代码块1;
}else if(条件表达式2){
执行代码块2;
}
........
else{
执行代码块n;
}
-
多分支流程图
-
当条件表达式1成立时,即立即执行代码块1
-
如果表达式不成立,采取判断表达式2是否成立
-
如果表达式2成立,就执行代码块2
-
以此类推如果所有的表达式都不成立,则执行else的代码块
-
注意:只有有一个执行入口
-
#include<stdio.h>
void main(){
double score = 0.0;
printf("请输入成绩:");
scanf("%lf",&score);
if(score==100){
printf("奖励一辆BMW");
}else if(score>80&&score<=99){
printf("奖励一台iphone 7plus");
}else if(score >=60&score<=80){
printf("奖励一台ipad");
}else{
printf("没有奖励");
}
getchar();
getchar();
}
int b = 1;
if(b=0){
printf("a");
}else if(b){
printf("b");
}else if(!b){
printf("c");
}else{
printf("d");
}
#include <stdio.h>
#include <math.h>
void main(){
/*
求ax^2+bx+c=0方程的根,a,b,c分别为函数的参数,如果:b^2-4ac>0,则有两个解
b^2-4ac=0,则有一个解,b^2-4ac<0,则无解
提示:1. x1=(-b+sqrt(b^2-4ac))/2a
2.x2=(-b-sqrt(b^2-4ac))/2a
3.sqrt(num),需要#include<math.h>
分析:
1.定义三个doble a,b,c,x1,x2
2.b^2-4ac的值在程序中使用很多次(>=3),因此我们可以使用一个变量来保存,从而避免重复计算
3.sqrt(num)
4.使用多分支
*/
double a = 3,b=2,c=6,x1=0,x2=0;
double t = b*b - 4*a*c;
if(t>0){
x1=(-b+sqrt(t))/(2*a);
x2=(-b-sqrt(t))/(2*a)
printf("x1=%.2f",x1);
printf("x2=%.2f",x2);
}else if(t==0){
x1=(-b+sqrt(t))/(2*a);
printf("x1=%.2f",x1);
}else{
printf("无解");
}
getchar();
}
5.嵌套分支
5.1 基本介绍
- 在一个分支结构中又完整的嵌套了另一个分支结构,里面的分支的结构称为内层分支,外面的分支结构称为外层分支,嵌套分支不适合过多,最多不要超过3层
5.2 基本语法
if(){
if(){
//被包含的可以是单分支,双分支,多分支
}else{
}
}
5.3 应用案例
#include <stdio.h>
void main(){
/*
参加百米运动会,如果用时8秒以内进入决赛,否则提前淘汰。并且根据性别提示进入男子组或女子组,输入成绩和性别,进行判断
分析
1.变量double time 保存时间
2.变量char gender 保存性别
3.使用嵌套分支
*/
double time = 0.0;
char gender ='';
printf("请输入跑步成绩(s):");
scanf("%lf",&time);
if(time<=8){
printf("请输入性别:");
scanf("%c",&gender);//接收到上次回车
scanf("%c",&gender);//接收性别
if(gender=='m'){
printf("请进入男子组");
}else{
printf("请进入女子组");
}
}else{
printf("你被淘汰");
}
getchar();//回车
getchar();//暂停
}
5.4 应用案例2
//出票系统:根据旺季的月份和年龄,打印票价
4 . switch分支结构
4.1 基本语法和流程图
switch(表达式){
case 常量1://当表达式值等于常量1
语句块1;
break;//退出switch
case 常量2://当表达式值等于常量1
语句块2;
break;//退出switch
case 常量n://当表达式值等于常量1
语句块n;
break;//退出switch
default:
default语句块;
break;
}
4.2 快速入门
#include <stdio.h>
void main(){
char c1 = '';
char c2 = '';
printf("请输入一个字符:");
scanf("%c",&c1);
//表达式:任何值都可以看成是一个表达式
switch(c1){
case 'a':
printf("今天星期一,猴子穿新衣");
break;
case 'b':
printf("今天星期二,猴子当小二");
break;
case 'c':
printf("今天星期三,猴子爬雪山");
break;
case 'd':
printf("今天星期四,猴子有急事");
break;
default://default是可选择,不是必须的
printf("没有匹配到任何值");
}
printf("switch结束");
getchar();
getchar();
}
4.3 switch细节讨论
- switch 语句中的expression 是一个常量表达式,必须是一个整型(char short int long )或枚举类型
- case语句中的值必须是常量,而不能是变量
- default子句是可选的,当没有匹配到case时,执行default
- break语句用在执行完一个case分支后程序跳出switch语句块
- 如果没有写break,会执行下一个case语句块,知道遇到break或者执行到switch结尾,这个现象称为穿透
4.4 练习
#include <stdio.h>
void main(){
//使用switch把小写的char型转为大写,只转换a , b , c , d , e 其他的输出 other
char c1 = 'u';
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");
}
getchar();
}
//对学生成绩大于60分的,输出合格,低于60分的,输出不合格
void main(){
double d1 = 0.0;
printf("请输入成绩");
scanf("%lf",&d1);
switch((int)(d1/60)){
//switch括号中,可以是一个复杂表达式
case 0:
printf("不合格");
break;
case 1:
printf("合格");
break;
default:
printf("输入成绩有误");
}
getchar();
getchar();
}
//根据指定的月份,打印该月份所属的季节。3 4 5 春季 6 7 8 夏季 9 10 11 秋季 12 1 2 冬季
void main(){
int month = 0;
printf("请输入月份:");
scanf("%d",&month);
switch(month){
case 3: //switch穿透
case 4:
case 5:
printf("春季");
break;
case 6: //switch穿透
case 7:
case 8:
printf("夏季");
break;
case 9: //switch穿透
case 10:
case 11:
printf("秋季");
break;
case 12: //switch穿透
case 1:
case 2:
printf("冬季");
break;
}
getchar();
getchar();
}
5 .switch 和if的比较
- 如果判断的具体数值不多,而且符合整型,枚举类型,虽然两个语句都可以使用,建议使用switch语句
- 其他情况:对区间判断,对结果为真假的判断,使用if,if的使用范围更广
6. for循环控制
6.1 基本介绍
- 听其名而知其意,就是让代码可以循环的执行
6.2 需求
编写一个程序,打印五句“你好,尚硅谷”
- 传统解决方案
void main(){
printf("你好,尚硅谷");
printf("你好,尚硅谷");
printf("你好,尚硅谷");
printf("你好,尚硅谷");
printf("你好,尚硅谷");
}
//如果不使用循环控制,代码的维护性很差
6.3 基本语法
循环变量定义
for(循环变量初始化;循环条件;循环变量迭代){
循环操作(多条语句)
}
6.4 循环执行流程分析
void main(){
int i;
for(i=1;i<=5;i++){
printf("你好,尚硅谷 i=%d");
}
}
6.5 注意事项和细节说明
-
循环条件是返回一个表示真(非0)假(0)的表达式
-
for(;循环判断条件;)中的初始化和变量迭代可以不写(写道其他地方),但两边的分号不能省略
-
循环初始值可以有多条初始化语句,但要求类型一样,并且用逗号隔开,循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开
- for(i=0,j=0;j<count;i++,j+=2)
-
代码演示
void main(){
//可以将变量的迭代和初始化放在其他地方
int i = 1;
for(;i<=5;){
printf("你好 尚硅谷");
i++;
}
//循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开
//循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开
int i;
int j;
for(i=0,j=0;i<=3;i++,j+=2){
printf("i=%d j=%d",i,j);
}
printf("最后 i=%d j=%d",i,j);
getchar();
}
6.6 练习
void main(){
//打印1-100之间所有是9倍数的整数的个数及总和
int i = 0;
int count = 0;
int sum = 0;
for(i=1;i<=100;i++){
//判断i是不是9的倍数
if(i%9==0){
count++;
sum+=i;
}
}
printf("count=%d sum=%d",count,sum);
}
void main(){
int num = 10;
int i = 0;
for(i=0;i<=num;i++){
printf("%d + %d = %d",i,num-i,num);
}
getchar();
}
7.while循环控制
7.1 基本语法
循环变量初始化;
while(循环条件){
循环体
循环变量迭代
}
7.2 while循环执行流程分析
#include <stdio.h>
void main(){
int i = 1;
while(i<=5){
printf("你好 尚硅谷 i=%d",i);
i++;
}
getchar();
}
7.3注意事项和细节说明
- 循环条件是返回一个表示真假的表达式
- while循环是先判断再执行语句
7.4 练习
void main(){
//打印1--100之间所有能被3整除的数
int i = 1;
int max = 100;
while(i<=max){
if(i%3==0){
printf("i=%d能被3整除",1);
}
i++;
}
getchar();
}
void main(){
//打印40--200之间所有的偶数
int i = 40;
int max =200;
while(i<=max){
if(i%2==0){
printf("i=%d是偶数",i);
}
i++;
}
getchar();
}
void main(){
//不断输入姓名,直到输入exit为止
//分析
//1.需要接收用户的输入,字符串[字符数组]
//2.<string.h>有一个strcmp函数,判断两个字符串是否相同
//int strcmp(const char*str1,const char*str2) 返回0表示相等,非0表示不相等
char name[10]="";
while(strcmp(name,"exit")!=0){
printf("请输入名字");
scanf("%s",name);//这里不需要加&name 因为数组的名称就是地址
printf("你输入的名字是%s",name);
}
printf("退出while");
getchar();//过滤回车
getchar();//暂停控制台
}
8. do...while循环控制
8.1 基本语法
循环变量初始化
do{
循环体(多条语句)
循环变量迭代
}while(循环条件);
- 注意:do --while后面有一个分号,不能省略
#include <stdio.h>
void main(){
int i = 1;
int max=5;
do{
printf("你好,尚硅谷 i=%d",i);
i++;
}while(i<=max);
printf("i=%d",i);
getchar();
}
8.2 注意事项和细节说明
- 循环条件是返回一个表示真假的表达式
- do...while循环是先执行,再判断
void main(){
//统计1--200之间能被5整除但不能被3整除的个数
int i = 1;
int max = 200;
int count = 0;
do{
if(i%5==0&&(i%3!=0)){
count++;
}
i++;
}while(i<=max);
printf("1--100之间能被5整除但不能被3整除的个数count=%d",count);
getchar();
}
void main(){
char answer ='';
do{
printf("我可以继续购物吗");
scanf("%c",&answer);
getchar();//过滤回车
}while(answer=='y');
printf("退出购物");
getchar();
}
9.多重循环控制
9.1 介绍
- 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for,while do ... while 均可作为外层循环和内层循环,如果嵌套循环过多,会造成可读性降低
- 实质上,嵌套循环就是把内层循环当成外层循环的循环体,当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当此循环,开始下一次的循环
- 设外层循环次数为m次,内层为n次,则循环实质上需要执行m*n次
#include <stdio.h>
void main(){
//统计三个班成绩情况,每个班有五名同学,求出各个班的平均分和所有班的平均分
//分析
//编程技巧:1.先死后活 2.先简单后复杂(分解) 3.根据需要增加或修改相应的大妈
//1.各个班的平均分
//2.所有班级的平均分,得到所有班级的总分allClassTotalScore
//3.定义变量表示班级个数classNum,定义变量表示学生个数stuNum
//4。定义变量classTotalScore每个班级总分
//5.定义变量score,接收学生成绩
//6.使用两层for循环
int stuNum = 5;
int classNUm = 3;
double classTotalScore = 0.0;
double score = 0.0;
double allClassTotalScore = 0.0;
int count = 0;
int i,j;
for(i=1;i<=classNum;i++){//控制班级循环次数
//每次给一个班级输出成绩时,需要清零
classTotalScore = 0.0;
for(j=1;j<=stuNum;j++){
//控制学生循环次数
printf("请输入第%d个班级的第%d个学生的成绩",i,j);
scanf("%lf",&score);
if(score>=60){
count++;
}
classTotalScore += score;
}
allClassTotalScore += classTotalScore;
//当内层for循环结束后就得到了该班级的总成绩
printf("第%d个班级得到平均分=%.2f",i,classTotalScore/stuNum);
}
//输出所有班级的成绩
printf("所有班级的平均分=%.2f",allClassTotalScore/(stuNum*classNum));
printf("所有班级的及格人数=%d",count);
getchar();
getchar();
}
#include<stdio.h>
void main(){
//打印九九乘法表
//分析
//1.先打印一列
//2.再打印多列,注意分析
//3.先死后活,功能逐步完成
int i,j;
for(i=1;i<=9;i++){
//因为每一行都在增加算式,所以使用for循环控制
for(j=1;j<=i;j++){
printf("%d * %d = %d",j,i,i*j);
}
printf("\n");
}
getchar();
}
9.2 打印金字塔
- 思路
- 化繁为简,先死后活
- 从矩形开始
#include<stdio.h>
void main(){
//打印矩形
//打印半个金字塔
//打印整个金字塔
int i,j,k,totalLeval=20;
for(i=1;i<=totalLeval;i++){
//输出空格,使用k控制空格的循环
for(k=1;k<=totalLeval-i;k++){
printf(" ");
}
for(j=1;j<=2*i-1;j++){
if(j==1||j=2*i-1||i=totalLeval){
printf("*");
}else{
printf(" ");
}
}
printf("\n");
}
getchar();
}

浙公网安备 33010602011771号