[编程笔记]第四章 流程控制
1.流程控制? 【是我们学习C语言的第一个重点】 ***
1). 什么是流程控制
程序代码执行的顺序。
2). 流程控制的分类
【顺序执行】 —— 正常情况
【选择执行】 ——
定义: 某些代码可能执行,也可能不执行,
有选择地执行某些代码
分类:if switch
if
1. if最简单的用法
格式:
if(表达式)
语句 ;
功能:
如果表达式为真,则执行语句 ;
如果表达式为假,则不执行 ;
#include<stdio.h>
int main(void)
{
int x = 10 ;
if (x>8)
printf("x = %d",x) ;
return 0 ;
}
2. if的范围问题
if(表达式)
语句A ;
语句B ;
解释:if默认只能控制语句A的执行或不执行
而无法控制语句B的执行或不执行
换言之,语句B一定会执行
if(表达式)
{
语句A ;
语句B ;
}
//此时if可以控制语句A和语句B
由此可见,if默认只能控制一个语句的执行或不执行
如果想控制多个语句的执行或不执行就必须用{}括起来。
//实例
#include<stdio.h>
int main(void)
{
if (3>2)
printf("AAAA\n") ;
printf("BBBB\n") ; //BBBB仍然输出
return 0 ;
}
3. if..else..的用法
格式:
if(表达式)
语句A ;
else
语句B;
#include<stdio.h>
int main(void)
{
int i,j ;
scanf("%d %d",&i,&j) ;
if(i > j)
printf("i大于j\n") ;
else
printf("i小于j\n") ;
return 0 ;
}
4. if..else if...else的用法
格式:
if(表达式1)
语句A ;
else if(表达式2)
语句B ;
else if(表达式3)
语句C ;
else
语句D ;
解释:若表达式1成立,执行语句A ;
若1不成立,2成立,执行B ;
若1,2不成立,3成立,执行C ;
若1,2,3,都不成立,执行D ;
//例
#include<stdio.h>
int main(void)
{
double delta = 3 ;
if(delta > 0)
printf("有两个解") ;
else if(delta == 0)
printf("有一个唯一解") ;
else
printf("无解") ;
}
/*
5. C语言对真假的处理
非零是真,零就是假
*/
6. 程序实例
//if举例 —— 求分数的等级
#include <stdio.h>
int main(void)
{
float score ; //score 分数
printf("请输入你的考试成绩:") ;
scanf("%f",&score) ;
if (score > 100)
printf("这是做梦\n") ;
else if (score >= 90 && score <= 100)
printf("优秀!\n") ;
else if (score >= 80 && score <= 90)
printf("良好! \n") ;
else if (score >= 60 && score <= 80)
printf("及格! \n") ;
else if (score >= 0 && score <= 60)
printf("不及格!继续努力!\n") ;
else
printf("输入成绩过低!") ;
return 0;
}
//互换两个数字
#include<stdio.h>
int main(void)
{
int k ;
int i = 3 ; //i = 5 ,j = 5
int j = 5 ; //i = 5 ,j = 5
k = j ;
i = j ;
j = k ;
printf("i = %d,j = %d\n",i,j) ;
return 0 ;
}
//三个数排序
#include <stdio.h>
int main(void)
{
int a , b , c ;
int t ;
printf("请输入三个整数,中间以空格分隔");
scanf("%d %d %d",&a,&b,&c) ;
if (a < b)
{
t = a ;
a = b ;
b = t ;
}
if (b < c)
{
t = b ;
b = c ;
c = t ;
}
if(a < c)
{
t = a ;
a = c ;
c = t ;
}
//编写代码,完成a是最大值,b是中间值,c是最小值
printf("%d %d %d\n",a,b,c) ;
return 0 ;
}
7. if的常见问题解析
1.空语句的问题:if (3 > 2) ;
等价于 if (3 > 2)
;
#include <stdio.h>
int main(void)
{
if (1 > 2) ;//";"本行语句结束,跳转下一条
printf("AAAA\n") ;
printf("BBBB\n") ;
return 0 ;
}
2.if..else问题
if(表达式1) //if后不能加;,否则else后出错
A ;
else
B ;
3.if..else if问题
if (表达式1)
A ;
else if (表达式2)
B ;
else if (表达式3)
C ;
else
D ;
//实例
#include<stdio.h>
int main(void)
{
if (3 > 2)
printf("AAAA\n") ;
else if (3 > 1)
printf("BBBB\n") ;
else
printf("CCCC\n") ;
return 0 ;
}
4.if (表达式1)
A ;
else if (表达式2)
B ;
else if (表达式3)
C ;
//这样写不会出错,但是逻辑上有漏洞
5.if (表达式1)
A ;
else if (表达式2)
B ;
else if (表达式3)
C ;
else (表达式4)
D ;
///这样写是不对的正确的写法是
//要么去掉(表达式4) ;
//要么去掉,else后面加if ;
//else(表达式4) ;语法上正确,但逻辑出错
switch
用的很少,后面再讲
【循环执行】
定义:某些代码会被重复执行
分类:for、while、do..while
for
1. 格式:for(1 ; 2 ; 3)
4 ;
5 ;
2. 执行的流程【重点】
【单个for循环的使用】
/*执行顺序:先执行1,判断2是否成立
2成立,执行循环,先执行4再执行3
3执行结束,标志着循环一次结束
2不成立,终止循环 */
//实例
#include<stdio.h>
int main(void)
{
int i ;
for(i=1; i<=10; ++i)
sum = sum + i ;
printf("sum = %d\n",sum) ;
return 0 ;
}
/*执行流程:
1) i = 1 ; 1 <= 4 ;
sum = 1; i= 2 ;
2) i = 2 ; 2 <= 4 ;
sum = 3 ; i = 3 ;
3) i = 3 ; 3 <= 4 ;
sum = 6 ; i = 4
4) i = 4 ; 4 <= 4 ;
sum = 10 ; i = 10 ;
print("sum = %d\n",sum) ; */
for 和 if 的嵌套使用
//例1
#include <stdio.h>
int main(void)
{
int i ;
for (i=5; i<4; ++i)
{
printf("AAAA\n") ;
printf("BBBB\n") ;
return 0 ;
}
}
//例2 求1到100之间所有的能被3整除的数字之和
#include<stdio.h>
int main(void)
{
int i ;
int sum = 0 ;
for (i=3; i<=100; ++i)
{
if (i%3==0) //如果i能够被3整除
sum = sum + i ;
printf("sum = %d\n",sum) ;
}
return 0 ;
}
//例1 —— 求1到100之间的奇数之和
#include <stdio.h>
int main(void)
{
int i ;
int sum = 0 ;
for (i=1; i<101; ++i)
{
if (i%2==1)
sum += i ; //sum = sum + i ;
}
printf("sum = %d\n",sum) ;
return 0 ;
}
//例2 —— 求1到100之间的奇数的个数
#include <stdio.h>
int main(void)
{
int i ;
int cnt = 0 ; //个数一般用cnt表示
for (i=1; i<101; ++i)
{
if (i%2==1)
++cnt ;
}
printf("cnt = %d\n",cnt) ;
return 0 ;
}
//例3 —— 求1到100之间的奇数的平均值
#include <stdio.h>
int main(void)
{
int i ;
int sum = 0 ;
int cnt = 0 ;
float avg ; //average 缩写
for (i=1; i<101; ++i)
{
if (i%2==1)
{
sum += 1 ;
++cnt ;
}
}
avg = 1.0*sum / cnt ; //1.0默认是double类型
printf("sum = %d\n",sum) ;
printf("cnt = %d\n",cnt) ;
printf("avg = %f\n",avg) ;
return 0 ;
}
//例4 —— 求1到100之间的奇数之和,
再求1到100之间的偶数之和
#include <stdio.h>
int main(void)
{
int i ;
int sum1 = 0 ; //奇数和
int sum2 = 0 ; //偶数和
for (i=1; i<101; ++i)
{
if (i%2==1)
{
sum1 += i ;
}
else
{
sum2 += i ;
}
}
printf("sum1 = %d\n",sum1) ;
printf("sum2 = %d\n",sum2) ;
return 0 ;
}
【多个for循环的嵌套使用】**
1.结构1
for (1 ; 2 ; 3) //1
for (4 ; 5 ; 6) //2
A ; //3
B ; //4
/*整体是两个语句,1 2 3是一个语句
4 是一个语句 */
/*执行顺序:
1 -> 2 -> 4 -> 5 -> A -> 6 -> 3 */
2.结构2
for (1 ; 2 ; 3)
for (4 ; 5 ; 6)
{
A ;
B ;
} //整体是一个语句
3.结构3
for (7 ; 8 ; 9)
for (1 ; 2 ; 3)
{
A ;
B ;
for (4 ; 5 ; 6)
C ;
} //整体是一个语句
3. 范围问题
4. 举例
1+2+3+...+100
1+1/2+1/3+...+1/100
//例2 1+1/2+1/3+...+1/100
#include<stdio.h>
int main(void)
{
int i ;
float sum ;
for (i=1; i<=100; ++i)
{
sum = sum + 1/i ; //error
sum = sum + 1 / (float)(i) //ture
//sum = sum + (float)(1/i) ;是错的
//更简单的写法是 sum = sum + 1.0/i ;
}
printf("sum = %d\n",sum) ;
return 0 ;
}
//总结:强制类型转化对初学者很重要
//强制类型转化
格式: (数据类型)(表达式)
功能: 把表达式的值强制转化为前面所执行的数据类型
例子: (int)(4.5+2.2) 最终值是 6
(float)(5) 最终值是 5.000000
//浮点数的存错所带来的问题
float 和 double 都不能保证可以把所有的实数都准确的
保存在计算机中
例子:float i = 99.9 ;
printf("%f\n",i) ;
最终在Vc++6.0中的输出结果是:99.900002
因为浮点数无法准确存储,所以就衍生出来两个编程问题;
有一个浮点型变量x,如果判断x的值是否为零
if (|x-0.000001|<=0.000001)
是零
else
不是零
为什么循环中更新的变量不能定义成浮点型
//实例
#include<stdio.h>
int main(void)
{
float i ;
float sum = 0 ;
for (i=1; i<=100; ++i)
{
sum = sum + 1/i ;
}
printf("sum = %f\n",sum) ;
return 0 ;
}
while
1.执行问题
格式:
while (表达式)
语句 ;
2. 与for的相互比较
for与while可以相互转换
for (1 ; 2 ; 3)
A ;
等价于
1 ;
while (2)
{
A ;
3 ;
}
//while和for可以相互转换
//但for的逻辑性更强,更不容易出错,推荐多使用for
3. 举例
从键盘输入一个数字,如果该数字是回文数
则返回yes,否则返回no
4. 什么时候使用while和for
无法具体说明情况,用多了自然就能感受到。
do..while
格式:
do
{
....
}while(表达式) ;
do...while并不等价于for,当然也不等价于while
//主要用于人机交互
break 和 continue
break :
break 如果用于循环是用来终止循环的
break 如果用于 switch,则是用于终止 switch
break 不能直接用于 if,除非 if 属于循环内部的一个子句。
//例1:
for (i=0; i<3; ++i)
{
if (3 > 2)
break ;
//break虽然是if内部的语句,但break终止
//的却是外部for的循环
printf("嘿嘿!\n") ;
}
/*在多层循环中,break只能终止最里面包裹它的那个循环*/
//例2:
for (i=0; i<3; ++i)
{
for (j=1; j<4; ++j)
break ;
//break只能种植距离它最近的循环
printf("同志们好\n") ;
}
//在多层switch嵌套中,break只能终止距离它最近的switch
//例3
int x=1,y=0,a=0,b=0 ;
switch(x) // 第一个switch
{
case 1 :
switch(y) // 第二个switch
{
case 0 :
a++ ;
break ; // 终止的是第二个switch
case 1 :
b++ ;
break ;
}
b = 100 ;
break ; // 终止的是第一个switch
case 2 :
a++ ;
b++ ;
break ;
}
printf("%d %d\n",a,b) ; //26行
continue
功能:用于跳过本次循环余下的语句
转去判断是否需要执行下次循环
例子:
1.
for (1; 2; 3)
{
A ;
B ;
continue ;
//如果执行该语句,则执行后,C和D不会被执行
C ;
D ;
}
2.
while (表达式)
{
A ;
B ;
continue ;
//如果执行该语句,则执行完该语句后,
//会执行表达式,C和D都会被跳过去,C和D不执行
C ;
D ;
}
2. 流程控制的重要性
1.随着c语言发展,流程控制可被其他语言继承
C-> C++ -> java /C#
2.流程控制体现了软件工程的思想
3.看懂一个程序的前提是学会流程控制
Talk is cheap. Show me the code