0、C语言的三大结构
顺序结构
语句从上至下 ,从左至右执行
分支结构(选择结构)
if(), switch()
循环结构
goto, while(), do while(), for()
1、if() 语句
if语句的三种基本形式
1)
if( 表达式 )
语句;
只要“表达式”的值为真(非0),那么就执行“语句”
如果“表达式”的值为假(0),那么就跳过该“语句”,不执行它
“表达式”:任意一种C语言合法的表达式都可以的
任何表达式都是有值的
比如:
a+b, 3+4, 100, ...
“语句”:分为单语句 和 复合语句
单语句:只有一个分号;的语句
例子:
if(a>b)
c=1;
复合语句:用{}括起来的语句
例子:
if(a>b)
{
c=1;
d=2;
}
例子:
int a=200, b=100;
int c;
if(a<b)
c = a; //不执行
a = b; //会执行
b = a; //会执行
printf("%d %d\n",a,b); // 100 100
int a=200, b=100;
int c;
if(a<b)
{
c = a;
a = b;
b = a;
}
printf("%d %d\n",a,b); //200 100
编程建议:
不管if语句的后面是单语句还是复合语句,都请自觉写上{}
if( 表达式 )
{
语句;
}
2)
if( 表达式 )
{
语句1;
}
else
{
语句2;
}
如果“表达式”的值为真(非0),那么就执行“语句1”
否则(如果“表达式”的值为假(0)),那么就执行“语句2”
例子:
int a, b,
if(5>3)
{
a=1;
b=2;
}
else
{
a=3;
b=4;
}
printf("%d %d\n", a,b); // 1 2
int a, b,
if(5>3)
{
a=1;
b=2;
}
else
a=3;
b=4; //会执行
printf("%d %d\n", a,b); // 1 4
编程建议:
不管if else 语句的后面是单语句还是复合语句,都请自觉写上{}
3)
if( 表达式1 )
{
语句1;
}
else if(表达式2)
{
语句2;
}
else if(表达式3)
{
}
...
else
{
语句n;
}
先判断“表达式1”的值,如果值为真(非0),那么就执行“语句1”,
如果“表达式1”的值为假(0),那么就去判断“表达式2”的值,
如果“表达式2”的值为真,那么就执行“语句2”,
否则再去判断“表达式3”的值 .... 一直判断下去
直到所有的条件都为假时,就执行“语句n”
例子:
if(同意)
{
//cp
}
else if( 你是个好人)
{
//朋友
}
else if(流氓)
{
//栓Q
}
else if(嗯....)
{
// 备胎
}
4)if语句的嵌套
if()
{
if()
{}
else
{}
}
else if()
{
}
else
{
}
注意:else总是和最近的、上面的、同级的、且未匹配的if语句 进行匹配
练习:
1)从键盘上输入两个整数,按从小到大的顺序输出
int main()
{
int a, b;
scanf("%d%d", &a, &b); //从键盘上获取一个整数,存储到变量a对应的地址空间中去
if(a>b)
{
printf("%d, %d\n", b,a);
}
else
{
printf("%d, %d\n", a,b);
}
}
2)从键盘上输入三个整数,判断是否能够组成三角形? YES/NO
两边之和大于第三边,两边之差小于第三边
#include <stdlib.h>
int abs(int j);
功能:求绝对值
参数:
j:整数
返回值:
返回这个参数j的绝对值
三目运算符:
a-b>0 ? a-b : b-a
int main()
{
int a, b,c;
scanf("%d%d%d", &a, &b, &c);
if( a+b>c && abs(a-b)<c) //if( a+b>c && (a-b>0 ? a-b : b-a)<c)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
2、switch语句 (开关语句)
语法:
switch(表达式)
{
case 常量或常量表达式1:
语句1;
case 常量或常量表达式2:
语句2;
...
case 常量或常量表达式n:
语句n;
default:
语句m;
}
规则:
拿“表达式”的值 与 case后面的“常量或常量表达式”的值进行匹配
一旦怕匹配成功(值相等),那么就执行case后面的语句,
而且会一直往下执行,直到遇到break 或者switch语句结束
如果没有一个case后面的“常量或常量表达式”的值与之相等,
那么就默认执行default后面的语句
注意:
1)switch后面的“表达式”的值必须是整数值(整型、字符型、枚举类型);
2)case后面的常量或常量表达式的值也必须是整数值,且每一个值必须各不相同
3)各个case语句和default语句 出现的次序不影响匹配结果,
一旦匹配成功,就会从此处往下执行,直到遇到break 或者switch语句结束
4)break的作用 用来跳出switch语句
例子:
switch(a)
{
case 1:
printf("1");
case 2:
printf("2");
case 3:
printf("3");
case 4:
printf("4");
default:
printf("5");
}
1) 当a==4时,输出结果为 45
2)当a==5时,输出结果为 5
switch(a)
{
default:
printf("5");
case 1:
printf("1");
case 2:
printf("2");
case 3:
printf("3");
case 4:
printf("4");
}
1) 当a==5时,输出结果为 51234
2)当a==5时,且在default后面增加break时,输出结果为 5
default:
printf("5"); break;
5) case后面的要执行的“语句”,是可以省略的
意思就是,可以 多个case共用一组“语句”
例子:
switch(a)
{
case 1:
case 2:
case 3:
printf("小");break;
case 4:
case 5:
case 6:
printf("大");break;
default:
break;
}
练习:
从键盘上获取一个成绩(int),把它对应的等级输出
A 90~100
B 80~89
C 70~79
D 60~69
E 0~59
int main()
{
int score;
scanf("%d", &score);
switch( score/10 )
{
case 10:
case 9:
printf("A\n");break;
case 8:
printf("B\n");break;
case 7:
printf("C\n");break;
case 6:
printf("D\n");break;
default:
printf("E\n");break;
}
}
3、练习
1、从键盘上输入一个日期(年、月、日),求该日期 到 该年年末有多少天?
2022 6 17
6,7,8,9,10,11,12 - 17
3.14
3,4,5,6,7,8,9,10,11,12 - 14
2.14
2,3,4,5,6,7,8,9,10,11,12 - 14 (平年 与 闰年 )
int main()
{
int year, month, day; //年月日
scanf("%d%d%d", &year, &month, &day);
int sum = 0; //保存结果 天数
switch( month )
{
case 1: sum += 31; //sum = sum + 31;
case 2:
sum += 28;
if( year%400 == 0 || (year%4==0 && year%100!=0) ) //闰年2月有29天
{
sum++;
}
case 3: sum += 31;
case 4: sum += 30;
case 5: sum += 31;
case 6: sum += 30;
case 7: sum += 31;
case 8: sum += 31;
case 9: sum += 30;
case 10: sum += 31;
case 11: sum += 30;
case 12: sum += 31;break;
default:
printf("输入的日期不合法 !\n");break;
}
sum = sum - day; //减去 已经过去的日期
printf("该日期距离年末还有 %d 天 \n", sum);
return 0;
}