版权声明:本文为博主原创文章,未经博主允许不得转载! https://blog.csdn.net/weixin_42839965/article/details/86573395
流程控制
1.什么是流程控制【C语言的第一个重点】
程序代码执行的顺序;
2.流程控制的分类
顺序执行:
选择执行:
定义:
某些代码可能执行,也可能不执行,有选择的执行某些代码;
分类:
if
1.if最简单的用法
格式:
if(表达式)
语句;
功能:
如果表达式为真,执行语句,否则,不执行
2.if的范围问题
1.格式:
if(表达式)
语句A;
语句B;
//if默认只控制语句A的执行与否,无法控制语句B是否执行;
//换言之,语句B一定会执行;
2.if(表达式)
{语句A;
语句B;}
//语句A和语句B的执行与否受if()的控制
//若是if语句控制多个语句,用{}将语句括起来;
3.if...else...的用法
4.if...else if...else...的用法
5.C语言对真假的处理
非零是真,零是假;
例题:if(90<=score<=100)其中90<=score是逻辑表达式,返回值是0或者1,均小于100,所以,表达式永远成立;
修改:if(90<=score&&score<=100)
6.if举例-求分数等级、两个数交叉互换、三个数字的最大值
三个数排序
#include<stdio.h>
int main(void)
{//编写代码,其中,a是最大值,b是中间值,c是最小值
int a,b,c;
int t;
printf("请输入三个整数(中间以空格分开):");
scanf("%d %d %d",&a,&b,&c);
/*如果a>b
则a与c比较,若a>c,则输出a,
若a<c,则输出c;
否则,
b与c比较,若b<c,则输出c,
若b>c,则输出b;*/
if(a<b)
{
t=a;
a=b;
b=t;
}
if (a<c)
{
t=a;
a=c;
c=t;
}
if (b<c)
{
t=b;
b=c;
c=t;
}
printf("%d %d %d\n",a,b,c);
return 0;
}
1.判断一个数字是否是素数/回文数
2.编程实现求一个十进制数字的二进制形式
3.求一个数字的每位是奇数的数字取出来组合形成的新数字
4.求一个数字倒过来的数字
7.if的常见问题解析
1.空语句的问题
if(3>2);
等价于
if(3>2)
;//这是一个空语句
2.分号问题:
if(表达式)//若在此处加分号会导致语法错误;
A;
else
B;
3.if(表达式1)
A;
else if (表达式2)
B;
else if(表达式3)
C;
else
D;
//若是条件1与条件2都满足,仍然执行A;
//执行顺序问题,两者不会同时执行
4.if(表达式1)
A;
else if (表达式2)
B;
else if(表达式3)
C;
//语法不会有错,但是逻辑上有误
5.if(表达式1)
A;
else if (表达式2)
B;
else if(表达式3)
C;
else (表达式4)//第7行,此处语法错误
D;
第7行的语法错误订正:
1.else
D;
2.else if(表达式4)
D;//此处的if不能省略
6.else (表达式4);
D;//语法无错,但逻辑有误
等价于
else
(表达式4);
D;
如何看懂一个程序,三部曲:
1.流程;
2.每个语句的功能;
3.试数;
循环执行:
定义:
某些代码会被重复执行
分类:
for
1.格式:
for(1;2;3)
{
语句A;//循环体
}
2.执行的流程【重点】
1.单个for循环的使用;
//求和1+2+3+...+10;
#include<stdio.h>
int main(void)
{
int i;
int sum=0;
for (i=1;i<11;i++)
sum =sum+i;
printf("sum=%d\n",sum);
return 0;
}
说明:
❶ ❷ ❸
for (i=1;i<11;i++)
❹
sum =sum+i;
先执行❶,再执行❷判断条件是否满足,
满足执行❹,最后执行❸,一次循环结束;
再执行❷判断条件是否满足,
满足执行❹,最后执行❸,二次循环结束;
其中❶只在第一次循环时执行一次;
若是❷不成立则执行printf()语句;
2.求和1~100之间能被3整除的数的和
将上述循环体
for (i=1;i<11;i++)
sum =sum+i;
修改为
for (i=1;i<100;i++)
if(i%3==0)
sum =sum+i;
课外题:求1到100之间的奇数之和、偶数之和;
求1到100之间的奇数的个数;
求1到100之间的奇数的平均值;
#include <stdio.h>
int main(void)
{
int i;
int sum1 = 0, sum2 = 0, count = 0;
float ave;
for (i = 1; i<101; i++)
{
if (i % 2 == 1)
{
sum1 = sum1 + i;
count++;
ave = (float)(sum1) / count;//另一种表达形式:ave=1.0*sum1/count;
/*1.0默认是double类型,等式的计算结果是double类型,
ave是float类型,double类型转换成float类型,
会造成数据的精准度的缺失*/
}
if (i % 2 == 0)
sum2 = sum2 + i;
}
printf("奇数之和是:%d\n", sum1);
printf("奇数的个数是:%d\n", count);
printf("平均值是:%.2f\n", ave);
printf("偶数之和是:%d\n", sum2);
return 0;
}
2.多个for循环
2.多个for循环的使用;
for(1;2;3)
{
for(4;5;6)
A;
}
B;//执行过程类似单个for循环
3.范围问题
4.举例:
1+2+3+…+100;
1+1/2+1/3+…+1/100;
#include <stdio.h>
int main(void)
{
int i;
float sum=0;
for (i=1;i<101;i++)
sum =sum +1/i;//1/i 均为整型,整除,结果为整型,无小数位
//sum=sum+1.0/i;
printf("sum=%.3f\n",sum);
return 0;
}
/*
(float)(1/i) 的结果仍为0.000000;因为整除的结果为零;
可修改为1/(float)(i)或者是sum=sum+1.0/i;
*/
while
do...while
break和continue
试数的详细步骤:
强制类型转换:
格式:
(数据类型)(表达式)
功能:
把表达式的值强制转化为前面所执行的数据类型
举例:(int)(4.5+2.2) 最终值6
(float)(5) 最终值5.000000
浮点数存储带来的问题
#include<stdio.h>
int main(void)
{
float i;
float sum=0;
for (i=1;i<101;i++)
sum =sum +1/i;
printf("sum=%f\n",sum);
return 0;
}
浮点数的存储所带来的问题
float和double都不能保证可以精确的存储一个小数;
举例:
有一个浮点型的变量x,如何判断x的值是否是零
if(|x-0.000001|<=0.000001)
是零值;
else
非零值;
为什么循环中更新的变量不能是浮点型?
浮点数不能保证准确存储;