c语言个人笔记
E.menos
代码规范性!!!
- 如何看懂一个程序?
- 流程
- 每个语句的功能
- 试数
四. 流程控制(重要)
- 什么是流程控制
程序代码执行的顺序
四. 流程控制(重要)
- 什么是流程控制
程序代码执行的顺序
4.1 流程控制的分类
-
顺序执行
-
选择执行
-
定义:
有选择执行某些代码 -
分类:
- if
- if最简单的用法
- if的范围问题
- if…else…的用法
- if…elseif…else…的用法
- c语言对真假的处理
- if举例–取分数的处理
- if的常见问题解析
- switch
- if
-
-
循环执行
-
定义:
某些代码会被重复执行 -
分类:
- for: 【重点:流程】
- while
- do…while
- break与continue
-
4.2 if
-
if最简单的用法
-
格式:
if (表达式) 语句; ```
-
功能:
如果表达式为真,语句执行;
如果表达式为假,语句不执行;
-
-
if的范围问题
if(表达式) 语句A; 语句B;
**if默认只能控制语句A的执行与不执行,无法控制语句B.**
#include <stdio.h> int main(void) { if(1>2) printf("AAAA\n"); printf("BBBB\n"); return 0; } //输出结果是BBBB
if(表达式) { 语句A; 语句B; }
此时if可以控制语句A和语句B.
if默认只能控制一个语句的执行或者不执行,如果想要控制多个语句的执行,就要用{}将这些语句括起来
-
if…else…的用法
-
if…elseif…else…的用法
-
c语言对真假的处理
-
if举例–取分数的处理
-
if的常见问题解析
-
空语句的问题
if(3>2); 等价于 if(3>2) ;//这是一个空语句
if (3>2) //第4行,如果加;会导致程序运行到都6行结束 printf("A"); else if () //第6行 printf("B");
-
elseif
if (表达式1) printf(A); else if (表达式2) printf(B); else if (表达式3) printf(C); //这样写语法没有问题,但逻辑有漏洞
if (表达式1) printf(A); else if (表达式2) printf(B); else if (表达式3) printf(C); else (表达式4)//7行 printf(D); //程序错误,去掉7行的表达式4,或将7行改为else if
if (表达式1) printf("A"); else if (表达式2) printf("B"); else if (表达式3) printf("C"); else (表达式4);//(表达式5);为无实际意义语句 printf("D"); //语法不会出错,但逻辑有错误 else (表达式4); printf("D"); 相当于 else (表达式4); //无意义语句 printf("D"); //输出语句
-
4.3 for
-
程序
for (1,2,3) 语句A; //同if,执行多个语句时用{}括起来
-
【重点】执行的流程
-
单个for循环的使用
for(1;2;3) 语句A; //顺序:1- (2)- A- 3- (2)- A- 3-.....- 3- (2)不成立退出循环
-
多个for循环的嵌套使用
for(1;2;3) //1 for(4;5;6) //2 A; //3 B; //4 //执行顺序:1- (2)- 4- (5)- A- 6- (5)-...-(5)不成立执行3- (2)- 4- (5)- A- 6-...-(2)不成立退出循环-执行B //共有两个语句;123为第一个语句,4位第二个语句;B在循环外
-
-
范围问题
-
做题
- 强制类型转化:
- 格式:
(数据类型)(表达式) - 功能:
把表达式的值强制转化为前面所执行的数据类型
处理方法:强制类型转化#include <stdio.h> int main(void) { int i; float sum = 0; for (i=1; i<=100; ++i>) { sum = sum + 1/i; } printf("sum = %f\n", sum); } //该程序运行结果为1.000000,程序错误。 //因为1是整型,i是整型,1/i结果没有小数位。
#include <stdio.h> int main(void) { int i; float sum = 0; for (i=1; i<=100; ++i>) { sum = sum + 1/(float)(i); } printf("sum = %f\n", sum); }
- 格式:
- 强制类型转化:
4.4 while
-
执行顺序
- 格式:
while (表达式) 语句;
- 格式:
-
与for的相互比较
-
例子
for (i=1; i<101; ++i) { sum = sum + 1; }
i = 1; while (i < 101) { sum = sum + i; ++i; }
-
结论:
for (1; 2; 3) A;
等价于
while (2) { A; 3; }
while和for可以相互转换,但for的逻辑性更强,不容易出错.
-
-
举例
(斐波那契数列) -
什么时候使用while,什么时候使用for
(多做题自己感觉)
while有时候很简单,大多数时候用for比较清晰
4.5 do…while【人机交互】
-
格式:
do { ... } while (表达式)
主要用于人机交互
-
do…while与while与for
do…while并不等价于for,也不等价于while
(do…while必会执行一次,而for和while可以一次都不执行) -
举例:
#include <stdio.h> int main(void) { double a, b, c; double delta; double x1,x2; do { printf("请输入一元二次方程的三个系数\n"); printf("a = "); scanf("%d",&a); printf("b = "); scanf("%d",&b); printf("c = "); scanf("%d",&c); delta = b*b - 4*a*c; if(delta > 0) { x1 = (-b + sqrt(delta)) / (2*a); x2 = (-b - sqrt(delta)) / (2*a); printf("有两个解,x1 = %lf, x2 = %lf\n",x1,x2); } else if (0 == delta) { x1 = x2 = (-b) / (2*a); printf("有一个解,x1 = x2 = %lf\n",x1,x2); } else ( printf("无实数解!\n") ) printf("您想继续吗(Y/N):"); scanf(" %c", &ch); //前面必须加一个空格符,原因略 } while ('y' == ch || 'Y' == ch); //y和Y写前面为了代码美观 return 0; }
4.6 switch【电梯程序】
-
举例:
#include <stdio.h> int main (void) { int val; printf("请输入您要到达的楼层:"); scanf("%d%", &val); switch(val) { case 1; printf("1层开!\n"); break; //如果没有这个break,输入1时运行结果为“1层开! 2层开!”(见程序最后的解释) case 2; printf("2层开\n:"); break; case 2; printf("3层开\n"); break; default: printf("没有该层\n"); break; } } \\case为程序的入口,val判断入口;入口确认后从上往下顺序执行,所以要有break停止程序。
-
格式
switch(表达式) { case 常量表达式1: 语句1; case 常量表达式2: 语句2; case 常量表达式3: 语句3; ... case 常量表达式n: 语句n; default: 语句n+1; }
-
- 所有case后面的常量表达式为便于描述我们姑且称之为标签,这些标签都只能是(1)枚举常量(有些书称之为枚举元素),(2)数值常量,(3)字符常量,(4)常变量,(5)宏名中的一种,注意普通变量,枚举变量是不能作为标签使用的。
-
- witch后面括号里的“表达式”允许是任何类型。但是Vc++中只允许为int或char类型(1)
-
- 执行完一个case语句后,流程控制就转移到下一个case字句继续执行。 case常量表达式只是起语句标号的作用,并不是在该处进行条件判断。在执行 swtich语句时,根据switch()中表达式的值找到与之匹配的case子句,就从此case子句开始执行下去,不再进行判断。
- 当i == 1时,从case1处开始往下一个不落的执行,当i == 2时从case2处开始往下个不落的执行,当i3时,只执行case3一句,当i == 4时,从default处开始往下个不落的执行,当i == 0时执行情况同i==4.
-
- switch是选择不是循环,如果在switch中出现了berak语句。该语句的功能只是退出switch语句转去执行它下面的语句。在switch中出现continue是错误的,除非switch本身就属于for或while循环的一部分。
-
4.7 break和continue
-
break
-
break如果用于循环:终止循环
-
break如果用于switch:终止switch
-
break不能用于if,除非if是循环内的一个语句
for (i=0; i<3; ++i) { if(3>2) break; //break虽然是if内部的语句,但却是用来终止外面的for循环; printf("hello world\n"); } return 0; //验证方法:看输出个数,如果输出只有一个,那么终止的是for循环
-
在多重循环中,break只能终止离它最近的循环
for (i=0; i<3; ++i) { for(j=0; j<3; ++j) break; //break只能终止距离它最近的循环 printf("hello world\n"); } //输出结果为三个,故终止的是内部的for。
-
在多重switch嵌套中,break只能终止的是离它最近的
switch(x) //第一个switch { case 1: switch(y) //第二个switch { case 0: a++; break; //终止第二个switch case 1: b++; break; //终止第一个switch } break; case 2: a++; b++; break; }
-
-
continue
-
用以跳过本次循环余下的语句,转去判断是否需要执行下次循环
for (1; 2; 3) { A; B; continue; //如果执行该语句,则执行完该语句后会执行3;C D 会被跳过 C; D; }
while (表达式) { A; B; continue; //如果执行该语句,则执行完该语句后会执行表达式;C D 会被跳过 C; D; }
-