1.表达式与语句的区别
> 不含有分号的是表达式
> 含有分号的是语句
2.什么是流程控制
程序代码执行的顺序
3.流程控制的分类
顺序
选择
> 定义:
某些代码可能执行,也可能不执行,有选择的执行某些代码
>分类:
- if
· if最简单的用法
格式:
if (表达式)
语句;
功能:
如果表达式为真,执行语句
如果表达式为假,语句不执行
· if的范围问题
if (表达式)
语句A;
语句B;
解释:
if默认只能控制语句A的执行或不执行
if无法控制语句B的执行或不执行
if (表达式)
{
语句A;
语句B;
}
此时if可以控制语句A和语句B
/*
由此可见:
if默认只能控制一个语句的执行或不执行
如果想控制多个语句的执行或不执行,就必须把这些语句用{}括起来
*/
· if ... else ... 的用法
· if ... else if ... else ...的用法
格式:
if (1)
A;
else if (2)
B;
else if (3)
C;
else
D;
· C语言对真假的处理
非零是真
零就是假
真用1表示
假用0表示
· if举例 —— 求分数的等级
/*
时间:2020年2月13日
功能:求分数的等级
目的:举例
*/
#include <stdio.h>
int main(void)
{
float 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
printf("输入的分数过低,不要如此自卑!\n");
return 0;
}
/*
在Microsoft Visual Studio 2010的过程:
-----------------------------------
请输入您的考试成绩:88
良好!
请按任意键继续. . .
-----------------------------------
*/
· if的常见问题解析
空语句的问题
if (3 > 2);
等价于
if (3 > 2)
;//这是一个空语句
if (表达式1)
A;
else
B;
是正确的
if (表达式1);
A;
else
B;
是错误的
if (表达式1)
A;
else if (表达式2)
B;
else if (表达式3)
C;
else
D;
即便表达式1和2都成立,也只会执行A语句
if (表达式1)
A;
else if (表达式2)
B;
else if (表达式3)
C;
这样写语句不会出错,但逻辑上有漏洞
if (表达式1)
A;
else if (表达式2)
B;
else if (表达式3)
C;
else (表达式4) //50行
D;
这样写是不对的,正确的写法是:
要么去掉50行的(表达式4)
要么在50行的else后面加if
if (表达式1)
A;
else if (表达式2)
B;
else if (表达式3)
C;
else (表达式4);
D;
这样写语法不会出错,但逻辑上是错误的
else (表达式4);
D;
等价于
else
(表达式4);
D;
- switch
· 格式:
switch (表达式)
{
case 常量表达式1:
语句1;
break;
case 常量表达式2:
语句2;
break;
case 常量表达式... ...:
语句... ...;
break;
default:
语句4;
break;
}
·注意:
所有case后面的常量表达式为便于描述我们姑且称之为标签,这些标签都只能是:
枚举常量(有些书称之为枚举元素)
数值常量
字符常量
常变量
宏名中的一种,注意普通变量,枚举变量是不能作为标签使用的
switch后面括号里面的"表达式"允许是任何类型,但在VC++中只允许为int或char类型
执行完一个case语句后,流程控制就转移到下一个case字句继续执行。"case"常量表达式只是起语句标点的作用,并不是在该处进行条件判断。在执行switch语句时,根据switch()中表达式的值找到与之匹配的case子句,就从此case子句开始执行下去,不再进行判断
switch是选择不是循环,如果在switch中出现了break语句。该语句的功能只是退出switch语句转去执行它下面的语句。在switch中出现continue是错误的,除非switch本身就属于for或while循环的一部分
· 例子 —— 电梯程序:
/*
时间:2020年2月14日
功能:电梯程序
目的:举例
*/
#include <stdio.h>
int main(void)
{
int val;
printf("请输入您要进入的楼层:");
scanf("%d", &val);
switch (val)
{
case 1:
printf("1层开!\n");
break;
case 2:
printf("2层开!\n");
break;
case 3:
printf("3层开!\n");
break;
default:
printf("没有盖到这一层!\n");
break;
}
return 0;
}
/*
在Microsoft Visual Studio 2010的过程:
-----------------------------------
请输入您要进入的楼层:3
3层开!
请按任意键继续. . .
-----------------------------------
总结:
... ...
*/
循环
>定义:
某些代码会被重复执行
>分类:
- for
· 格式:
for (1; 2; 3)
语句A;
· 执行的流程【重点】
单个for循环的使用
for (1; 2; 3)
语句A;
执行顺序:
______________________________
| |
v |
1 -> (判断2是否为真) —— (真) ——> 语句A; -> 3
—— (假) ——> 结束for循环
多个for循环的嵌套使用
for (1; 2; 3) //1行
for(1; 2; 3) //2行
A; //3行
B; //4行
整体是两个语句,1行 2行 3行是第一语句,4行是第二语句
for (1; 2; 3)
for (4; 5; 6)
{
A;
B;
}
整体是一个语句
for (7; 8; 9)
for (1; 2; 3)
{
A;
B;
for (4; 5; 6)
C;
}
整体是一个语句
· 范围问题
· 举例:
例子 —— 1 + 2 + 3 + ... ... +100
/*
时间:2020年2月14日
功能:1 + 2 + 3 + ... ... +100
目的:举例
*/
#include <stdio.h>
int main(void)
{
int val = 0;
int i;
for (i = 1; i <= 100; ++i)
{
val += i; //等价于 val = val + i;
}
printf("1 + 2 + 3 + ... ... +100 = %d\n", val);
return 0;
}
/*
在Microsoft Visual Studio 2010的过程:
-----------------------------------
1 + 2 + 3 + ... ... +100 = 5050
请按任意键继续. . .
-----------------------------------
总结:
... ...
*/
例子 —— 1 + 1/2 + 1/3 + ... ... + 1/100
/*
时间:2020年2月14日
功能:1 + 1/2 + 1/3 + ... ... + 1/100
目的:举例
*/
#include <stdio.h>
int main(void)
{
double val = 0.0;
int i;
for (i = 1; i <= 100; ++i)
{
val += (1 / (double)(i)); //等价于 val = val + (1 / (double)(i));
}
printf("1 + 1/2 + 1/3 + ... ... + 1/100 = %lf\n", val);
return 0;
}
/*
在Microsoft Visual Studio 2010的过程:
-----------------------------------
1 + 1/2 + 1/3 + ... ... + 1/100 = 5.187378
请按任意键继续. . .
-----------------------------------
总结:
... ...
*/
- while
· 执行顺序
格式:
while (表达式)
语句;
顺序:
先判断表达式是否为真,
真就执行语句,语句执行完再判断表达式是否继续为真,
直到判断表达式为假,循环结束
· 与for的相互比较
for (1; 2; 3)
A;
等价于
1;
while (2)
{
A;
3;
}
while和for可以相互转化,
但for的逻辑性更强,更不容易出错,推荐多使用for
· 例子 —— 从键盘输入一个数字,如果该数字是回文数,则返回yes,否则返回no
回文数: 正着写和倒着写都一样,如:121 12321 都是回文数
/*
时间:2020年2月14日
功能:判断回文数
目的:举例
*/
#include <stdio.h>
int main(void)
{
int val;
int m;
int sum = 0;
printf("请输入您需要判断的数字:");
scanf("%d", &val);
m = val;
while (m)
{
sum = sum * 10 + (m % 10);
m /= 10;
}
if (sum == val)
printf("yes!\n");
else
printf("no!\n");
return 0;
}
/*
在Microsoft Visual Studio 2010的过程:
-----------------------------------
请输入您需要判断的数字:12321
yes!
请按任意键继续. . .
-----------------------------------
总结:
... ...
*/
· 什么时候使用while,什么时候使用for
没法说,用多了自然而然就知道了
- do ... while
· 执行顺序:
格式:
do
{
语句;
}while (表达式);
顺序:
先执行语句,再判断表达式是否为真,
真执行语句,执行完语句,再判断表达式是否为真,
直到判断表达式为假,循环结束
· do ... while并不等价于for,当然也不等价于while
· do ... while主要用于人机交互
· 例子 —— 一元二次方程
/*
时间:2020年2月14日
功能:一元二次方程
目的:举例
*/
#include <stdio.h>
#include <math.h>
int main(void)
{
double a, b, c;
double delta;
double x1, x2;
char ch;
do
{
printf("请输入一元二次方程的三个系数:\n");
printf("a = ");
scanf("%lf", &a);
printf("b = ");
scanf("%lf", &b);
printf("c = ");
scanf("%lf", &c);
delta = b * b - 4 * a * c;
if (delta > 0)
{
x1 = (-b + sqrt(delta) / (2 * a));
x2 = (-b - sqrt(delta) / (2 * a));
printf("有两个解;x1 = %f, x2 = %f\n", x1, x2);
}
else if (0 == delta)
{
x1 = x2 = (-b) / (2*a);
printf("有一个解;x1 = x2 = %f\n", x1);
}
else
{
printf("无解\n");
}
printf("您想继续么(Y/N):");
scanf(" %c", &ch);
//注意%c前必须得加一个空格
//原因:
// 空白符的问题
}while('y' == ch || 'Y' == ch);
return 0;
}
/*
在Microsoft Visual Studio 2010的过程:
-----------------------------------
请输入一元二次方程的三个系数:
a = 1
b = 9
c = 5
有两个解;x1 = -5.094875, x2 = -12.905125
您想继续么(Y/N):n
请按任意键继续. . .
-----------------------------------
总结:
... ...
*/
- break和continue
· break:
break如果用于循环是用来终止循环
break如果用于switch,则是用于终止switch
break不能直接用于if,除非if属于内部的一个句子
例子:
for (i = 0; i < 3; ++i)
{
if (3 > 2)
break;//break虽然是if内部的语句,
//但break终止的确是外部的for循环
printf("嘿嘿!\n");//永远不会输出
}
在多层循环中,break只能终止最里面包裹它的那个循环
例子:
for (i = 0; i < 3; ++i)
{
for (j = 1; j < 4; ++j)
break; //break只能终止距离它最近的循环
printf("同志们好!\n");
}
在多层switch嵌套中,break只能终止距离它最近的switch
例子:
int x = 1, y = 0, a = 0, b = 0;
switch (x)
{
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);
最终输出结果是: 1 100
· continue:
用于跳过本次循环余下的语句,转去判断是否需要执行下次循环
例子:
for (1; 2; 3)
{
A;
B;
continue;//如果执行该语句,则执行完该语句后,会执行语句3,C和D都会被跳过去,C和D不会被执行
C;
D;
}
while (表达式)
{
A;
B;
continue;//如果执行该语句,则执行完该语句后,会执行表达式,C和D都会被跳过去,C和D不会被执行
C;
D;
}
如有不对或者疏漏的地方,请多多指出。谢谢(⁄ ⁄•⁄ω⁄•⁄ ⁄)