选择if语句
if()括号内的内容若为真则运行,若为假则不运行
其执行语句在最初接触if语句时,最好用大括号括起来
方便自己检查错误之处,也能保证代码的正确运行
若是不使用大括号,使用TAB对运行的语句进行缩进
if语句后不能加分号,否则将编译报错和不执行
if-else选择结构
其实质为
if(表达式1)
{
语句1;
}
else if(表达式2)
{
语句2;
}
else if(表达式3)
{
语句3;
}
if与if-else二者之间的区别
就好比谈恋爱的道理
if()语句是向对方表白
其执行内容为表白结果
表白失败就歇逼
表白成功就牵手
但是如果不表白也就意味着没有结果
if-else语句是你是海王
表达式1、2、3分别为你养的第一条鱼、第二条鱼、第三条鱼
过年过节了去找鱼们要礼物
若第一条鱼不给礼物
则去找第二条鱼要
若第二条鱼不给礼物
则去找第三条鱼要
按照if-else选择出现的先后顺序进行执行
换种说法
if是上帝给你开了一扇门
没门就歇逼
if-else是上帝给你开了一扇门还有好多扇窗
只不过要按顺序进行执行
2.1.4条件运算符(三目运算符)
表达式1?表达式2:表达式3;
如果表达式1为真就执行表达式2,否则执行表达式3
switch语句
switch(表达式)
{
case 对应值1:表达语句1;break;
case 对应值2:表达语句2;break;
case 对应值3:表达语句3;break;
default:表达语句4:break;
}
为表达式匹配对应值进行语句的执行
注意在每种情况之后一定要加分号
若对应值1、2、3皆没有的话,则执行default后语句
case意为情况,每个case之间的值不可以相同
若不加分号,譬如:
switch(表达式)
{
case 对应值1:表达语句1;
case 对应值2:表达语句2;
case 对应值3:表达语句3;
default:表达语句4:break;
}
则执行完表达语句1后,继续往下执行表达语句2、表达语句3、表达语句4才跳出
if-else语句和switch的区别
if-else是对少量情况的检验,判断速度较快,随着判断情况的逐渐复杂,速度会逐渐变慢,并且后续的情况进行添加的话较为麻烦
switch语句适合对多种情况进行判断,每种情况的判断速度都相同,但是默认default的判断速度略快于各种case的判断速度,当判断情况较多时,首先推荐switch
while语句
while(表达式)
{
循环体;
}
当while括号内的表达式为真时,while循环语句一直运行
当while括号内的表达式为假时,while循环语句终止循环
由于计算机中的浮点数为一个近似值
因此在用浮点数作为循环的标志时会导致数据出错
因此要用整数值来控制计数循环
若括号内语句恒为真,则为死循环或者无限循环
一般while会用于多次循环输入值测试
在c语言中:
while(~scanf(“%d”,&a))或者while(scanf(“%d”,&a)!=EOF)均可实现无限次输入
在c++中
while(cin>>a)也可实现无限次输入
do-while语句
do-while语句用于最少要执行一次的循环情况
do{
循环体;
}while(表达式);
首先执行一次循环体,若表达式的值为真,则再次循环
注意:do-while语句中,while后面一定要加一个分号
for语句
for(表达式1;表达式2;表达式3)
{
循环体;
}
表达式1->循环变量赋初值
表达式2->循环条件
表达式3->循环变量改变
若是表达式省略的话,则默认值为1
注意:不可以在for语句后面的括号加上分号,否则会被误认为空语句,不执行
三种循环体的比较
- 循环条件在while和do-while语句当中都在while后面跟,for语句的循环条件在表达式3的位置跟,但相比较来说,for语句的功能更加强劲,凡是while语句能够实现的,for语句均可实现。
- 初始化步骤一般在while和do-while语句前完成,在for语句的表达式1完成
- while、do-while、for均可以使用break语句和continue语句
break用法、continue用法、goto语句
在循环体之中,使用break语句能够强行终止,跳出本层循环
在循环体制中,使用continue语句能够强行终止,进行下一次循环
goto语句一般用于多层循环之中,方便在于最内层循环找到所需要的值后跳出所有循环,避免使用break语句逐层跳出从而避免在每层跳出的地方添加break语句导致错误,简单高效但不推荐使用,容易产生错误
例如:ZZULIOJ:1070: 小汽车的位置
#include<stdio.h>
int main()
{
int pretime=0,curtime,time,command,direction=0;
/*定义之前时间为0
默认
direction为0时在y轴正半轴
direction为1时在x轴负半轴
direction为2时在y轴负半轴
direction为3时在x轴正半轴*/
int x=0,y=0;//初始化小车坐标为(0,0)
while(~scanf("%d%d",&curtime,&command))//输入现在时刻
{
time=curtime-pretime;//计算走了多长时间
pretime=curtime;//进行时间的更新
switch(direction)
{
//方向判断一定要在命令之前,因为命令是改变下一次运动时的方向
case 0:y=y+time*10;break;
case 1:x=x-time*10;break;
case 2:y=y-time*10;break;
case 3:x=x+time*10;break;
}
//对于路程变化进行匹配
switch(command)//指令直接对于方向进行操作
{
case 1:direction++;break;
case 2:direction--;break;
case 3:goto loop;break;
//若为3,使用goto语句进行直接跳出并输出当前坐标
}
direction=(direction+4)%4;
//避免方向为负值
}
loop:printf("%d %d",x,y)
return 0;
}
使用goto语句可以简单高效的完成任务
2.1.12类型溢出问题
相信在以往的做题过程中我们会发现很多时候都会有那么一个提示:
避免类型溢出
那么我们如何避免呢
很多时候发现在测试用例时
我们定义的int型变量往往能够输出正确的数值
但是在判断机上却发生了错误
原因在于我们理解的数据范围存在误差
譬如int的变量表示范围在之前简单的c程序设计上有提及
一般来说,int变量可以正确表达9位及以下的整数
准确来说其上限是2147483647
由阶乘表可得
int 能够准确表示12!及之前的数据
而double却能够准确表示21!及之前的数据
所以为了避免类型溢出,我们常常使用double命名变量计算
或者先除后乘避免溢出
附一个自己写的阶乘表
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
double mul;
for(int i=1;i<=n;i++)
{
mul=1;
for(int j=1;j<=i;j++)
{
mul=mul*j;
}
printf("%-4d%-20.0lf\n",i,mul);
}
return 0;
}