流程控制while

一、什么是流程控制

程序代码执行的顺序

二、流程控制的分类

(一)顺序执行

(二)选择执行
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值