一、什么是流程控制
程序代码执行的顺序
二、流程控制的分类
(一)顺序执行
(二)选择执行
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
不是零
(2)while
(3)do……while
break
Continue