控制流
二路分支
逻辑:程序中某段代码需要在满足某个条件时才能运行
形式:
1. if语句:表达一种 如果-则的条件执行关系
2. if-else语句:表达一种 如果-否则 的互斥分支关系
练习
#include <stdio.h>
int main()
{
/*int number ;
scanf("%d",&number);
printf("%d\n",number%2 == 0);
if(number % 2 == 0)
{
printf("偶数\n");
}
else
{
printf("奇数\n");
}
return 0;*/
//打分系统
/*printf("请输入一个成绩 :");
unsigned int a;
scanf("%u",&a);
if(0 <= a && a < 60)
{
printf("D");
}
else if(60 <= a && a < 80)
{
printf("C");
}
else if(80 <= a && a < 90)
{
printf("B");
}
else if(90 <= a && a < 100)
{
printf("A");
}
else
printf("错误");*/
//多路分支版
int score;
printf("请输入成绩: ");
scanf("%d",&score);
switch(score)
{
case 0 ... 60:
printf("D\n");
case 61 ... 80:
printf("C\n");
case 81 ... 90:
printf("B\n");
case 91 ... 100:
printf("A\n");
default:
printf("输出有误");
}
}
注意:
1. 只要表达式的值为真(非0),则执行{}复合语句
2. if语句可以单独使用,else语句不可以,else语句必须根if语句配套使用
3. 不管是if语句还是else语句,代码块都必须使用大括号{}括起来,否则只有首句有效
4. 如果只有一条执行语句,可以这样写:
if(表达式)
执行语句....;如果表达式为真,那么执行该语句
编程规范,写完if或else后,不管后面又没有语句,先写{}圈定为它的范围,然后再到{}里面补充语句,请用4个格缩进
多路分支
根据不同的条件执行不同的代码片段
#include<stdio.h>
int main ()
{
switch(1)
{
case 1:
printf("one\n");
break;
case 2:
printf("two\n");
break;
case 3:
printf("three\n");
break;
}
return 0;
}
要点解析
1. switch(n)语句中的n必须是一个整型表达式,即switch判断的数据必须是整型或者字符
2. case语句只能带整型常量,包括普通整型或字符,不包括const型数据
3. break语句的作用是跳出整一个switch结构,没有break程序会略过case往下执行
4. default语句不是必须的,一般放在最后面(因此不需要break)
练习
小张加盟一家餐饮企业,在每个季度结束后,小张必须向总部缴纳加盟费,加盟费与营业额的提成关系如下:
营业额 提成系数
0<=n<10w 0.1
10<=n<20w 0.075
20<=n<40w 0.05
40<=n<60w 0.03
60<=n<100w 0.015
n >= 100w 0.01
请输入小张的营业额,然后求出它需要的提交的加盟费
#include <stdio.h>
int main(int argc, char const *argv[])
{
float money; // 营业额
float val; // 提成
int flage; // 记录营业额范围
printf("请输入营业额(万元): ");
scanf("%f",&money);
// 营业额
if(money < 0)
{
printf("找个班上吧,别开了\n");
}
else if(0 <= money && money <= 10)
{
flage = 1;
}
else if(10 < money && money <= 20)
{
flage = 2;
}
else if(20 < money && money <= 40)
{
flage = 3;
}
else if(40 < money && money <= 60)
{
flage = 4;
}
else if(60 < money && money <= 100)
const
逻辑:使一个变量不可修饰
作用:
修饰普通变量,使之不可修改
修饰指针变量,使之不可修改或者使其指向的目标不可修改
示例:
while与do...while循环
{
flage = 5;
}
else if(money > 100)
{
flage = 6;
}
// 提成
switch (flage)
{
case 1:
val = 0.1;
break;
case 2:
val = 0.075;
break;
case 3:
val = 0.05;
break;
case 4:
val = 0.03;
break;
case 5:
val = 0.015;
break;
case 6:
val = 0.01;
break;
default:
break;
}
// 输出加盟费
printf("加盟费: %.2f万元\n",money * val);
return 0;
}
const
逻辑:使一个变量不可修饰
作用:
修饰普通变量,使之不可修改
修饰指针变量,使之不可修改或者使其指向的目标不可修改
//这两个表达式为强制定义,所赋的值无法被改变。
int const a = 100;
const int b = 200;
//下面表达式为错误示范
a = 101;
b = 202;
while与do…while循环
逻辑:使得程序中每一段代码可以重复循环的运行
形式:
while循环:先判断,再循环
//循环输出一系列整数,直到100为止
#include <stdio>
int main()
{
int a = 1,s = 0;
do
{
s=s+a;
a++;
} while (a<=100);
printf("%d\n",s);
}
// 使用while循环计算1...100的偶数
#include <stdio.h>
int main()
{
int a = 1,s = 0;
while (1)
{
if (a > 100)
break;
if(a % 2 == 0)
{
s=s+a;
printf("输出偶数:%d\n",a);
}
a++;
}
printf("和为%d\n",s);
}
#include <stdio.h>
int main()
{
//比较两个整数的大小,输出最大的那个数。
int num1,num2;
while(1)
{
printf("输入两个整数: ");
int ret = scanf("%d%d",&num1,&num2);
if(ret != 2)
{
while(getchar() !='\n');
printf("输入错误,请重新输入\n");
//重新跑回while(1)
continue;
}
if(num1 == num2)
break;
printf("max = %d\n",num1 > num2 ? num1 : num2);
}
}
for 循环
逻辑:与 while 循环类似,但更加紧凑,for 循环将控制循环的变量集中在一行
简单例子
#include <stdio.h>
int main()
{
/* int i = 1;
while(1)
{
if(i>5)
break;
printf("%d\t",i++);
}
//
int i;
for(i = 1;i<5;i++)
{
printf("%d\t",i);
}
*/
int s = 0;
for(int i = 1;i<=100; s = s + i,i++)
{
}
printf("%d\n",s);
}
// 循环输出一系列整数,直到100为止
int a;
for(a=30; a<=100; a++)
{
printf("%d\n", a);
}
for嵌套
int main(int argc, char const *argv[])
{
for(int i = 0; i < 5; i++)// 外循环
{
for(int j = 0; j < 4; j++)// 内循环
{
printf("i:%d j:%d\n",i,j); n^2
}
}
return 0;
}
练习:使用for循环实现1+2+…+100的和
int max = 0;
for(int i = 1; i <= 100; max+=i,i++);
// {
// //max += i;
// }
printf("max = %d\n",max);
或者
for(int i = 1; i <= 100; i++)
max+=i;
语法点:
循环的标准语法是: for(表达式1 ; 表达式2 ; 表达式3)
表达式1一般用来初始化循环控制变量
表达式2一般用来作为循环判定条件,为真则进入循环,为假则跳出循环
表达式3一般用来更新循环控制变量
三个表达式均可以省略,但分号不能省略
while注重循环条件,for注重循环次数
break(退出)与continue(继续)
运用场景与特点
break关键字只能用于循环(while for do...while)和switch语句中,表示结束循环或者跳出switch语句
break关键字只能跳出最近一层的循环,也就是说,如果有多重循环,只能跳出最靠近break语句那层循环
break关键字 不能 单独用于 if语句中,除非if语句外面包含了循环
逻辑:
continue关键字只能用于循环体中(while do...while for),用于提前结束当前循环体后,又从最近一层
循环体开始执行
continue关键字不能 单独用于 if语句或者switch 语句中,除非外面包含了循环
break:① 跳出 switch 语句; ② 跳出当层循环体while(1){while(1){break;}}
continue:结束当次循环,进入下次循环
//编写一个程序,输出26个小写字母。
#include <stdio.h>
int main()
{
//用for循环写
char ch;
printf("请输入一个大写字母: ");
scanf("%c",&ch);
if(ch < 'A' || ch >'Z')
{
printf("不好\n");
return -1;
}
//计算总行
int line = ch - 'A' + 1;
int i,j;
for(i = 1;i <= line;i++)
{
//输出空格
for(j = 0;j < line - i; j++)
{
printf(" ");
}
//升序
for(j = 0; j < i; j++)
{
printf("%c",'A'+j);
}
//降序
for(j-=2;j >= 0;j--)
{
printf("%c",'A'+j);
}
printf("\n");
}
return 0;
}
goto语句
逻辑:无条件跳转
格式:
goto 语句标号://程序会直接跳转到语句标号的地方执行
例子
int main()
{
printf("%d\n", __LINE__); // 打印第3行
// 无条件跳转到label处
goto label;
printf("%d\n", __LINE__); // 打印第7行,此处被略过
label:
printf("%d\n", __LINE__); // 打印第9行
}
语法:
goto语句直接跳转到本代码块中的标签处
标签指的是以冒号结尾的标识符
作用:
goto语句的无条件跳转不利于程序的可读性,一般不建议使用
goto语句常被用在程序的错误处理中
#include <stdio.h>
int main()
{
printf("请输入分子与分母:");
int a,b;
scanf("%d/%d",&a,&b);
if(b == 0)
{
goto error;
}
printf("ret = %d\n",a/b);
error:
printf("process exit\n");
return 0;
}
无条件跳转到label处
goto label;
printf(“%d\n”, LINE); // 打印第7行,此处被略过
label:
printf(“%d\n”, LINE); // 打印第9行
}
#### 语法:
goto语句直接跳转到本代码块中的标签处
标签指的是以冒号结尾的标识符
#### 作用:
goto语句的无条件跳转不利于程序的可读性,一般不建议使用
goto语句常被用在程序的错误处理中
```c
#include <stdio.h>
int main()
{
printf("请输入分子与分母:");
int a,b;
scanf("%d/%d",&a,&b);
if(b == 0)
{
goto error;
}
printf("ret = %d\n",a/b);
error:
printf("process exit\n");
return 0;
}