一、什么是流程控制
程序代码执行的顺序
二、流程控制的分类
(一)顺序执行
(二)选择执行
1.定义:
某些代码可能执行,也可能不执行,有选择的执行某些代码
2.分类:
(1)if(比switch重要的多)
《1》if最简单的用法
《2》if的范围问题(重要)
《3》if……else……的用法
《4》if……else if……else……的用法
《5》C语言对真假的处理
《6》if举例——求分数的等级
《7》if的常见问题解析——对任意三个数字进行排序
《8》if的常见问题解析——if空语句问题
《9》if的常见问题解析——if表达式成立时的输出语句问题
(2)switch
(三)循环执行
1.定义:
某些代码会被重复的执行
2.分类:
(1)for(重要)
《1》for循环最简单的用法——1+2+3+……+100之和
《2》for循环最简单的用法——求1~10内的奇数之和
《3》for和if的嵌套使用——求1~100内所有能被3整除的数字之和
《4》单独使用for循环 OR for和if的嵌套
《5》for的格式
《6》for执行的流程【重点】
《7》for范围问题
《8》试数的详细步骤
《9》浮点数的存储所带来的问题
(2)while
《1》while执行顺序
● 格式:
while(表达式)
语句;
● 功能:while和for一样默认只能控制一个语句
当表达式成立,执行语句,否则跳过while();执行下面的部分
《2》while与for的相互比较
for和while可以相互转换
for(1;2;3)
A
等价于
1;
while(2)
{
A
3;
}
for的逻辑性更强,不容易出错,推荐使用for循环!
/*
时间:2020年1月
编辑人:pinkowonote
功能:
目的:while与for的相互比较——求1+2+3+……+100用for和
用while实现区别
*/
# include <stdio.h>
int main(void)
{
/*求1+2+3+……+100用for实现*/
int i;
int sum1 = 0;
for (i = 1; i <= 100; ++i)
{
sum1 += i;
}
printf("sum1 = %d\n", sum1);
/*求1+2+3+……+100用while实现*/
int a = 1;
int sum2 = 0;
while (a <= 100)
{
sum2 += a;
a++;
}
printf("sum2 = %d\n", sum2);
return 0;
}
/*
在VS_2013中输出结果是:
--------------------------------
sum1 = 5050
sum2 = 5050
--------------------------------
总结:
*/
《3》while举例——如何判断一个数字是回文数
从键盘输入一个数字,如果该数字是回文数,返回YES,否则返回NO
回文数:正着写和倒着写一样
eg:121 12321 我是你爹你是我;)
/*
时间:2020年1月
编辑人:pinkowonote
功能:从键盘输入一个数字,如果该数字是回文数,返回YES,
否则返回NO
目的:while举例——如何判断一个数字是回文数
*/
# include <stdio.h>
int main(void)
{
/*存放待判断的数字,存放m初始值*/
int val;
int m;
int sum = 0;
printf("请输入需要判断的数字:");
scanf_s("%d", &val);
m = val;
while (m)
{
/*不断取走m后面的数字转换为sum的前置数字,
等到m的数字取完就变成0,while不会再执行,
sum相当于m反过来的数字*/
/*eg:① m = 1234,sum = m % 10 = 4(取余——>
个位数),m /= 10,m = 123(取整——>千百十位)
② m = 123,sum = sum * 10(个位数——>十位数)
+ m % 10(取余——>个位数)= 43,m /= 10,
+ m = 12(取整——>千百位)
……*/
sum = sum * 10 + m % 10;
m /= 10;
printf("sum = %d\n", sum);
}
if (sum == val)
printf("YES\n");
else
printf("NO!\n");
return 0;
}
/*
在VS_2013中输出结果是:
--------------------------------
请输入需要判断的数字:12321
sum = 1
sum = 12
sum = 123
sum = 1232
sum = 12321
YES
请输入需要判断的数字:1234
sum = 4
sum = 43
sum = 432
sum = 4321
NO!
--------------------------------
总结:
*/
《4》for举例——斐波拉契数列
1、2、3、5、8、13、21、34
第一、二项是没有规律的,从第三项开始,每一项都死前两项得的和
/*
时间:2020年1月
编辑人:pinkowonote
功能:求斐波拉契数列第n项
目的:while举例——斐波拉契数列
*/
# include <stdio.h>
int main(void)
{
int i;
int n;
int f1, f2, f3;
f1 = 1;
f2 = 2;
printf("请输入需要求第n项的序列:");
scanf_s("%d", &n);
/*1 == n比n == 1好,这是长期实验得出来的:因为在实际编成的时候,人由于疲惫/不仔细很容易漏打=*/
if (1 == n)
{
f3 = 1;
}
else if (2 == n)
{
f3 = 2;
}
else
{
for (i = 3; i <= n; ++i)
{
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
}
printf("斐波拉契数列第n项为%d\n", f3);
return 0;
}
/*
在VS_2013中输出结果是:
--------------------------------
请输入需要求第n项的序列:6
斐波拉契数列第n项为13
--------------------------------
总结:
试数:n = 6
①i = 3; i <= 6; f3 = f1 + f2 = 3; f1 = f2/f1 = 2; f2 = f3/f2 = 3; ++i; i = 4
②i = 4; i <= 6; f3 = f1 + f2 = 5; f1 = f2/f1 = 3; f2 = f3/f2 = 5; ++i; i = 5
③i = 5; i <= 6; f3 = f1 + f2 = 8; f1 = f2/f1 = 5; f2 = f3/f2 = 8; ++i; i = 6
④i = 6; i <= 6; f3 = f1 + f2 = 13; f1 = f2/f1 = 8; f2 = f3/f2 = 13; ++i; i = 7
⑤i = 7; i > 6
*/
《5》什么时候使用while,什么时候使用for
知道运行多少次用for,至少运行一次用do……while,不确定多少次用while
没法说
(3)do……while
● 功能:主要用于人机交互
● 格式:
do
{
……
}
while(表达式);
先执行……,(表达式)判断是否成立,成立时执行……
do……while和while / for不能相互转换
……一定会执行一次,再判断表达式是否成立
while和for之间可以相互转换:
表达式为真,执行…… / 表达式为假,跳过执行下一步
……不一定会执行
while(表达式)
{
……
}
等价于
for(1;2;3)
{
……
}
《1》do……while举例——一元二次方程
printf()用%f输出double型,而scanf却用%lf呢?
/*
时间:2020年1月
编辑人:pinkowonote
功能:
目的:do……while举例——一元二次方程
*/
# 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 = ");
/*printf()用%f输出double型,而scanf却用%lf*/
scanf_s("%lf", &a);
printf("b = ");
scanf_s("%lf", &b);
printf("c = ");
scanf_s("%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 = %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):");
/*%c前面必须加一个空格 原因:
《c/c++ primer plus》*/
scanf_s(" %c", &ch);
} while ('Y' == ch || 'y' == ch);
/*while后面有分号*/
return 0;
}
/*
在VS_2013中输出结果是:
--------------------------------
请输入一元二次方程的三个系数:
a = 1
b = 5
c = 6
有两个解,x1 = -2.000000,x2 = -3.000000
您想继续么(Y/N):y
请输入一元二次方程的三个系数:
a = 3
b = 4
c = 8
无实数解!
您想继续么(Y/N):n
--------------------------------
总结:
*/
break
Continue