流程控制for

一、什么是流程控制

程序代码执行的顺序

二、流程控制的分类

(一)顺序执行

(二)选择执行
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(重要)
●i++和++i的区别

/*
时间:2020年1月
编辑人:pinkowonote
功能:
目的:i++和++i的区别
*/
# include <stdio.h>
int main(void)
{
	int i, x;
	
	/*x = i++;*/
	i = 1;
	x = 1;
	/*x = i,i = i + 1*/
	//先让x变成i的值1,再让i加1
	x = i++;    
	
	//输出的x为1,输出的i为2
	printf("当x = i++时,x = %d,i = %d\n", x, i);

	/*x = ++i;*/
	i = 1;
	x = 1;
	/*i = i + 1,x = i*/
	//先让i加1, 再让x变成i的值2
	x = ++i;    

	//输出的x为2,输出的i为2
	printf("当x = ++i时,x = %d,i = %d\n", x, i);

	return 0;
}

/*
	在VS_2013中输出结果是:
--------------------------------
当x = i++时,x = 1,i = 2
当x = ++i时,x = 2,i = 2
--------------------------------
*/

《1》for循环最简单的用法——1+2+3+……+100之和

/*
时间:2020年1月
编辑人:pinkowonote
功能:
目的:for循环最简单的用法——1+2+3+……+100之和
*/
# include <stdio.h>
int main(void)
{	
	int i;
	int sum = 0;

	/*i++和++i的区别要理解*/
	/*i++和++i不参与运算时【在for(表达式)里】,是一样的,都是【i = i + 1】,因为变量只有一个i*/
	/*for默认只控制一个语句*/
	/*①i=1;②判断i <= 100;③sum = sum + i;④++i;标志着循环1次结束
			②判断i <= 100;③sum = sum + i;④++i;标志着循环2次结束
			……*/
	for (i = 1; i <= 100; ++i)
		sum = sum + i;

	printf("sum = %d\n",sum);
	
	return 0;
}
/*
	在VS_2013中输出结果是:
--------------------------------
sum = 5050
--------------------------------
*/

《2》for循环最简单的用法——求1~10内的奇数之和

/*
时间:2020年1月
编辑人:pinkowonote
功能:
目的:for循环最简单的用法——求1~10内的奇数之和
*/
# include <stdio.h>
int main(void)
{
	int i;
	int sum = 0;
	int n = 0;

	/*i += 2等价于i = i + 2*/
	for (i = 1; i < 10; i += 2)
	{
		sum = sum + i;
		/*用来验证循环了几次!*/
		/*这是我自己按照i和n的数值规律【i = 2n - 1】硬套出来的,不知道有没有什么别的好的方法?*/
		//n = (i + 1) / 2;
		/*这里直接写++n就可以了,我2个小时前到底在想什么(lll¬ω¬)*/
		/*如果这里直接写++n,需要在最开始给n赋初值0;
		写n = (i + 1) / 2就不用赋值,直接定义n*/
		++ n;
	}

	printf("已循环%d次\n", n);
	printf("sum = %d\n", sum);

	return 0;
}
/*
在VS_2013中输出结果是:
--------------------------------
已循环5次
sum = 25
--------------------------------
*/

●for的循环次数(i++)

/*
时间:2020年1月
编辑人:pinkowonote
功能:
目的:for的循环次数
*/
# include <stdio.h>
int main(void)
{
	int i;
	int sum = 0;

	/*这里循环几次可以直接口算出来,因为这里是++i,不是i+=2
	直接用4-1=3次就可以算出循环几次!*/
	for (i = 1; i < 4; ++ i)
		printf("AAAA\n", sum);
	printf("BBBB\n", sum);

	return 0;
}
/*
	在VS_2013中输出结果是:
--------------------------------
AAAA
AAAA
AAAA
BBBB
--------------------------------
*/

《3》for和if的嵌套使用——求1~100内所有能被3整除的数字之和

/*
时间:2020年1月
编辑人:pinkowonote
功能:
目的:for和if的嵌套使用——求1~100内所有能被3整除的数字之和
*/
# include <stdio.h>
int main(void)
{
	int i;
	int sum = 0;
	
	/*这里虽然可以用i+=3,但是还是要使用i++。
	是因为这里的知识点是要使用for和if的嵌套,必须要用if来判断数字是否能被3整除*/
	for (i = 3; i < 100; i++)
	{
		if (i % 3 == 0)
			sum = sum + i;
		//可以不用写“else;”直接写if语句也可以
	}
	
	printf("sum = %d\n", sum);

	return 0;
}
/*
	在VS_2013中输出结果是:
--------------------------------
sum = 1683
--------------------------------
*/

●for的循环陷阱哈哈

/*
时间:2020年1月
编辑人:pinkowonote
功能:
目的:for和if的嵌套使用——求1~12内所有能被3整除的数字之和
*/
# include <stdio.h>
int main(void)
{
	int i;
	int sum = 0;
	
	for (i = 3; i < 12; i++)
	{
		/*如果if(表达式)不成立,直接执行printf();语句,sum不会+1*/
		if (i % 3 == 0)
			sum = sum + i;
		printf("sum = %d\n", sum);
	}

	return 0;
}
/*
	在VS_2013中输出结果是:
--------------------------------
sum = 3
sum = 3
sum = 3
sum = 9
sum = 9
sum = 9
sum = 18
sum = 18
sum = 18
--------------------------------
	总结:体现出了试数的重要性!
*/

《4》单独使用for循环 OR for和if的嵌套
①求1~100内的奇数之和

/*
时间:2020年1月
编辑人:pinkowonote
功能:
目的:单独使用for循环或者for和if的嵌套——求1~100内的奇数之和
*/
# include <stdio.h>
int main(void)
{
	/*单独使用for*/
	int i;
	int sum = 0;
	int n;

	for (i = 1; i < 100; i += 2)
	{
		/*sum += i;*/
		sum = sum + i;
		++ n;
	}

	printf("单独使用for循环了%d次,sum = %d\n", n, sum);

	/*for和if的嵌套*/
	int i2;
	int sum2 = 0;
	int n2 = 0;

	for (i2 = 1; i2 < 100; ++ i2)
	{
		if (i2 % 2 != 0)
			sum2 = sum2 + i2;
		++ n2;
	}
	
	printf("for和if的嵌套循环了%d次,sum2 = %d\n", n2, sum2);

	return 0;
}
/*
	在VS_2013中输出结果是:
--------------------------------
单独使用for循环了50次,sum = 2500
for和if的嵌套循环了99次,sum2 = 2500
--------------------------------
	总结:定义变量的时候要看清楚,如果一个程序里用两种方法解决,需要在一种方法解决完后初始化变量.
	如果两种方法定义的变量一样,会有【error C2374:“sum”: 重定义;多次初始化】的错误出现!
*/

②求1~100内的奇数的个数

/*
时间:2020年1月
编辑人:pinkowonote
功能:
目的:单独使用for循环或者for和if的嵌套——求1~100内的奇数的个数
*/
# include <stdio.h>
int main(void)
{
	/*单独使用for*/
	int i;
	int count = 0;
	int n = 0;

	for (i = 1; i < 100; i += 2)
	{
		++ count;
		++ n;
	}

	printf("单独使用for循环了%d次,count = %d\n", n, count);

	/*for和if的嵌套*/
	int i2;
	int count2 = 0;
	int n2 = 0;

	for (i2 = 1; i2 < 100; ++i2)
	{
		if (i2 % 2 != 0)
			++ count2;
		++ n2;
	}
	
	printf("for和if的嵌套循环了%d次,count2 = %d\n", n2, count2);

	return 0;
}
/*
	在VS_2013中输出结果是:
--------------------------------
单独使用for循环了50次,count = 50
for和if的嵌套循环了99次,count2 = 50
--------------------------------
	总结:
*/

③求1~100内的奇数的平均值

/*
时间:2020年1月
编辑人:pinkowonote
功能:
目的:单独使用for循环或者for和if的嵌套——求1~100内的奇数的平均值
*/
# include <stdio.h>
int main(void)
{
	/*单独使用for*/
	int i;
	/*float sum2 = 0;最好不要这样写*/
	int sum = 0;
	int count = 0;
	float avg;

	for (i = 1; i < 100; i += 2)
	{
		sum = sum + i;
		++count;
	}

	/*加上1.0*就可以将整型变量的计算式转换为浮点型的答案!
	1.0默认是double类型,avg是float类型,所以会产生警告*/
	avg = 1.0 * sum / count;

	printf("单独使用for方法:1~100内的奇数之和为%d,奇数的个数是%d,奇数的平均值是%f\n", sum, count, avg);

	/*for和if的嵌套*/
	int i2;
	/*float sum2 = 0;最好不要这样写*/
	int sum2 = 0;
	int count2 = 0;
	float avg2;

	for (i2 = 1; i2 < 100; ++i2)
	{
		if (i2 % 2 != 0)
		{
			/*sum2 += i2;*/
			sum2 = sum2 + i2;
			++count2;
		}
	}

	/*加上1.0*就可以将整型变量的计算式转换为浮点型的答案!
	1.0默认是double类型,avg是float类型,所以会产生警告*/
	avg2 = 1.0 * sum2 / count2;

	printf("for和if的嵌套方法:1~100内的奇数之和为%d,奇数的个数是%d,奇数的平均值是%f\n", sum2, count2, avg2);

	return 0;
}
/*
在VS_2013中输出结果是:
--------------------------------
单独使用for方法:1~100内的奇数之和为2500,奇数的个数是50,奇数的平均值是50.000000
for和if的嵌套方法:1~100内的奇数之和为2500,奇数的个数是50,奇数的平均值是50.000000
--------------------------------
总结:
●如果定义变量为int类型,输出变量为%f类型,则输出时,
值会变为0!???
●奇数之和 / 奇数的个数 = 平均值会不会是小数?
会!所以你可以使用【强制转换】*/
/*哈哈哈哈现在发现最好的方法不是这么写(●ˇ∀ˇ●)*/
/*eg:
int k1 = 5;
int k2 = 2;
float t = k1 /(float) k2 ;
OR
float t = (float)k1 / k2 ;
OR
float t = (float)k1 /(float) k2 ;
都是可以的,这个强制转换并没有改变k1 k2两个int类型,或者就按我程序的方法来,只要有一个是浮点型变量的加减乘除,结果一定是浮点型变量
*/

④求1~100内的奇数之和与偶数之和

/*
时间:2020年1月
编辑人:pinkowonote
功能:
目的:单独使用for循环或者for和if的嵌套——求1~100内的奇数之和与偶数之和
*/
# include <stdio.h>
int main(void)
{
	/*单独使用for*/
	int odd;
	int sum1 = 0;
	int n1 = 0;
	int even;
	int sum2 = 0;
	int n2 = 0;

	for (odd = 1; odd <= 100; odd += 2)
	{
		sum1 = sum1 + odd;
		++n1;
	}
	for (even = 2; even <= 100; even += 2 )
	{
		sum2 = sum2 + even;
		++n2;
	}

	printf("单独使用for:奇数中循环了%d次,奇数和为%d;偶数中循环了%d次,偶数和为%d\n", n1, sum1, n2, sum2);

	/*for和if的嵌套*/
	int num;
	int sum_o = 0;
	int n_o = 0;
	int sum_e = 0;
	int n_e = 0;

	for (num = 1; num <= 100; ++num)
	{
		if (num % 2 != 0)
		{
			/*sum_o += num;*/
			sum_o = sum_o + num;
			++n_o;
		}
		else
		{
			/*sum_e += num;*/
			sum_e = sum_e + num;
			++n_e;
		}
	}

	printf("for和if的嵌套:奇数中循环了%d次, 奇数和为%d;偶数中循环了%d次, 偶数和为%d\n", n_o, sum_o, n_e, sum_e);

	return 0;
}
/*
在VS_2013中输出结果是:
--------------------------------
单独使用for:奇数中循环了50次,奇数和为2500;
偶数中循环了50次,偶数和为2550

for和if的嵌套:奇数中循环了50次, 奇数和为2500;
偶数中循环了50次, 偶数和为2550
--------------------------------
*/

《5》for的格式
for(1;2;3)
语句A;

《6》for执行的流程【重点】
①单个for循环的使用(上面已练习过)
②多个for循环的嵌套使用
for(1;2;3)
for(4;5;6)
语句A;

语句B;

1、判断2(成立)
4、判断5(成立)、A、6、判断5(成立)、A、6、判断5(不成立)
3、判断2(成立)
4、判断5(成立)、A、6、判断5(不成立)
3、判断2(不成立)
B

/*
时间:2020年1月
编辑人:pinkowonote
功能:
目的:for执行的流程——多个for循环的嵌套使用1
*/
# include <stdio.h>
int main(void)
{
	int i, j;

	for (i = 0; i < 3; ++i)
	{
		for (j = 2; j < 5; ++j)
			printf("哈哈!\n");
	}
	
	printf("嘻嘻!\n");

	return 0;
}
/*
	在VS_2013中输出结果是:
--------------------------------
哈哈!
哈哈!
哈哈!
哈哈!
哈哈!
哈哈!
哈哈!
哈哈!
哈哈!
嘻嘻!
--------------------------------
	总结:
*/
/*
时间:2020年1月
编辑人:pinkowonote
功能:
目的:for执行的流程——多个for循环的嵌套使用2
*/
# include <stdio.h>
int main(void)
{
	int i, j;

	for (i = 0; i < 3; ++i)
		printf("嘿嘿!\n");
	
	for (j = 2; j < 5; ++j)
		printf("哈哈!\n");
	
	printf("嘻嘻!\n");

	return 0;
}
/*
	在VS_2013中输出结果是:
--------------------------------
嘿嘿!
嘿嘿!
嘿嘿!
哈哈!
哈哈!
哈哈!
嘻嘻!
--------------------------------
	总结:
*/
/*
时间:2020年1月
编辑人:pinkowonote
功能:
目的:for执行的流程——多个for循环的嵌套使用3
*/
# include <stdio.h>
int main(void)
{
	int i, j;

	for (i = 0; i < 3; ++i)
	{
		printf("嘿嘿!\n");
		for (j = 2; j < 5; ++j)
		{
			printf("哈哈!\n");
			printf("嘻嘻!\n");
		}
		printf("呜呜!\n");
	}

	return 0;
}
/*
	在VS_2013中输出结果是:
--------------------------------
嘿嘿!
哈哈!
嘻嘻!
哈哈!
嘻嘻!
哈哈!
嘻嘻!
呜呜!
嘿嘿!
哈哈!
嘻嘻!
哈哈!
嘻嘻!
哈哈!
嘻嘻!
呜呜!
嘿嘿!
哈哈!
嘻嘻!
哈哈!
嘻嘻!
哈哈!
嘻嘻!
呜呜!
--------------------------------
	总结:
*/

《7》for范围问题
①1 + 2 + 3 + …… + 100

/*
时间:2020年1月
编辑人:pinkowonote
功能:
目的:for范围问题——1 + 2 + 3 + …… + 100
*/
# include <stdio.h>
int main(void)
{
	/*单独使用for*/
	int i;
	int sum = 0;

	for (i = 1; i <= 100; ++ i)
		sum = sum + i;

	printf("数字1~100之和为%d\n", sum);

	return 0;
}
/*
在VS_2013中输出结果是:
--------------------------------
数字1~100之和为5050
--------------------------------
*/

②1 + 1/2 + 1/3 + 1/4 + …… + 1/100
●强制类型转换:
○格式:(数据类型)(表达式)
○功能:把表达式的值强制转换为前面所指定的数据类型
eg:(int)(4.5+2.2)= 6

/*
时间:2020年1月
编辑人:pinkowonote
功能:
目的:for范围问题——1 + 1/2 + 1/3 + …… + 1/100
*/
# include <stdio.h>
int main(void)
{
	/*单独使用for*/
	int i;
	float sum = 0;

	for (i = 1; i <= 100; ++i)
		/*除法中被除数和除数都是int型是没有整数位的,如果定义int i,1/i无论i是什么都等于0(除了i=1之外),因为1/2=0.5,但是是int型,会把小数位除去,也就等于0,所以一开始设置int i,计算出的1 / i会等于0,sum会等于1*/
		/*可以【float i定义变量】ヽ(*。>Д<)o゜不可以这样!看下面【《9》浮点数的存储所带来的问题】就知道啦!
		OR【强制类型转换】*/
		/*sum = sum + (float)(1/i);这样写也是不对的,因为1和i都是整型,1 / i计算结果根本没有小数,就算强制转换也没有用*/
		/*OR sum = sum + (float)(1) / i;不推荐!*/
		/*OR sum = sum + 1 / (float)(i);不推荐!*/
		sum = sum + 1.0 / i;//不用强制转换,推荐!
		
	/*printf();的输入控制符一定要按照【所定义的输出参数的类型】来定义*/
	printf("数字1~1/100之和为%f\n", sum);

	return 0;
}
/*
在VS_2013中输出结果是:
--------------------------------
数字1~100之和为5.187378
--------------------------------
*/

《8》试数的详细步骤
一般写5次数据代入

《9》浮点数的存储所带来的问题
float和double都不能保证可以精确的存储一个小数
eg1:有一个浮点型变量x,如何判度x值是否是零?
if(|x-0.000001| <= 0.000001)–>x=0
是零
else
不是零

eg2:为什么循环中更新的变量不能定义成浮点型?
由于浮点型存储的是一个近似值,所以在进行循环的判断条件的求值的时候,其值会影响判断条件的结果。
比如说:i<=100,如果这个时候i的值是100.000001,于是这一步就没有加入循环,这个时候就会影响整个循环的执行,我们更新部分的值只能是一个整数。

(2)while
(3)do……while
break
Continue

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值