控制语句1
分支语句
1 if语句
1.1 基本结构
if(表达式)
{
语句块1;
}
else
{
语句块2;
}
执行逻辑: 如果表达式结果为真,则执行语句块1,否则执行语句块2。
【例】
if(下雨)
{带伞;}
else
{不带伞;}
#include <stdio.h>
int main(int argc, char const *argv[])
{
int rain=0;
scanf("%d", &rain);
if(rain)
{
printf("带伞!\n");
}
else
{
printf("不带伞!\n");
}
return 0;
}
练习1:输入a和b两个整数,用if语句实现两数相减(大的减小的)(答案见最后)
1.2分层结构
if ( 表达式 1 ){
语句块1;
}
else if(表达式2)
{
语句块2;
}
else
{
语句块3;
}
执行逻辑:如果判断if中的表达式结果为真则执行语句块1, 如果不满足则进入下面else if中表达式继续判断,如果条件为真则执行语句块2,如果以上条件都不满足则执行else下面的语句块3。
【例】
#include<stdio.h>
int main()
{
int a, b;
scanf("%d %d", &a, &b);
if (a > b)
printf("a>b\n");
else if (a < b)
printf("a<b\n");
else
printf("a==b\n");
return 0;
}
1.3嵌套结构
if ( 表达式 1 ){
if(表达式2)
{
语句块1;
}
else
{
语句块2;
}
}
else
{
语句块3;
}
【例】
if(下雨)
{
带伞;
if(小雨)
{骑车;}
else
{坐车;}
}
else
{不带伞;}
【例】用嵌套结构实现学生等级练习
#include <stdio.h>
int main(int argc, char const *argv[])
{
int score;
printf("请输入学生成绩:");
scanf("%d", &score);
if (score >= 0 && score <= 100) //0-100
{
if (score >= 90) //90-100
printf("A\n");
else if (score >= 80) //80-89
printf("B\n");
else if (score >= 70) //70-79
printf("C\n");
else if (score >= 60) //60-69
printf("D\n");
else
printf("sorry, you lost!\n"); //0-59
}
else
printf("输入错误!\n");
return 0;
}
练习2:输入一个数,如果大于0打印大于0并且再进行判断是否大于10,如果大于等于10打印大于等于10,小于10打印小于。否则如果小于0打印不想要这个数。(答案见最后)
练习3:实现大小写转换(用getchar、putchar实现)(答案见最后)
输入大写字母输出小写字母,
输入小写字母输出大写字母,
输入的不是字母,提示输入错误。
练习4:下列程序段运行后,x 的值是( ) (答案见最后)
a = 1 ; b = 2 ; x = 0 ;
if( ! ( -- a ) )
x -- ;
if( ! b )
x = 7 ;
else
++ x
练习5:下面的一段程序的输出结果为( 答案见最后)
#include <stdio.h>int main()
{
if ( -1 )
printf( " 1 " ) ;
else
printf( " 2 " ) ;
if(0)
printf( " 3 " ) ;
else
printf( " 4 " ) ;
return 0;
}
小总结
- 首先判断if后面的表达式是否成立,如果成立执行if后面的语句块,否则执行else后面的语句块。
- if后面可以没有else, 但是else前面必须有。
- if和else后面如果只有一行语句可以省略花括号{}。
2 switch case语句
基本结构
switch ( 变量或者表达式 ){
case 常量1: 语句块1; break;
case 常量2: 语句块2; break;
case 常量3: 语句块3; break;
...
case 常量n: 语句块n; break;
default: 语句块n+1;
}
执行顺序
当变量或表达式的值与其中一个case语句后的常量相符合时,就执行此case后面的语句块,并依次下去执行后面所有case中的语句块,直到遇见break语句则退出switch语句为止。如果变量或表达式与所有case语句的常量都不相符,就执行default语句中的语句块。
注意:
- 表达式不能是浮点或字符串
- case后面的break可以省略,但是省略时会顺序执行,直到遇到break结束。
【示例】从终端输入一个学生的成绩,判断学生成绩,打印成绩级别用switch写
【90 - 100】 A
【80 - 89】 B
【70 - 79】 C
【60 - 69】 D
【< 60 】 sorry you lost
(注意,若case后面的条件想要包含所有的成绩,如果将100、99等一分作为一个case后的常量,将要写很多很多case语句,因此可以用整除方法将每10分划为一个段,之后进行分支判断。)
#include <stdio.h>
int main(int argc, char const *argv[])
{
int score;
scanf("%d", &score);
if (score >= 0 && score <= 100) //判断成绩是否是一个正确分数,如果成绩在范围之外就不用进行等级判断了
{
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("sorry, you lost!\n");
break;
}
}
else
printf("输入错误!\n");
return 0;
}
练习6:从终端输入一个日期
scanf ("%d %d %d ", &year , &mon , &day ),判断这是这一年的第几天(答案见后面)
(提示:判断闰年还是平年,闰年且闰年二月份以上比平年多一天。普通年份除以4,有余数是平年,对于整百的年份,比如2100年,要除以400,有余数就是平年,整除就是闰年。)
小总结
- 执行顺序:先判断switch()中的条件是否满足以下的case,如果满足则执行满足的case中的语句块,如果都不满足则执行default中的默认语句块。
- 如果case的语句块和下面case中的语句块相同,则可以省略。形式如下:
case 常量1:
case 常量2:语句块1;break;
遵守switch语句规则
switch语句非常有用,但在使用时必须谨慎。所写的任何switch语句都必须遵循以下规则:
(1)只能针对基本数据类型中的整型类型使用switch,这些类型包括int、char等。对于其他类型,则必须使用if语句。
(2)case标签必须是常量表达式,如42或者'4'。
(3)case标签必须是唯一性的表达式;也就是说,不允许两个case具有相同的值。
------------------------------------------------------这是一条分割线------------------------------------------------------
天才预设的上一篇跳转路径:C语言基础3——输入输出-CSDN博客
天才预设的下一篇跳转路径:C语言基础5——控制语句2(循环)-CSDN博客
练习答案
练习1:
输入a和b两个整数,用if语句实现两数相减(大的减小的)
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a, b;
scanf("%d %d", &a, &b);
if (a > b)
printf("%d\n", a - b);
else
printf("%d\n", b - a);
return 0;
}
注意要判断两个数的大小
练习2:
输入一个数,如果大于0打印大于0并且再进行判断是否大于10,如果大于等于10打印大于等于10,小于10打印小于。否则如果小于0打印不想要这个数。(答案见最后)
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a;
scanf("%d",&a);
if (a > 0)
{
printf("大于0");
if (a >= 10)
{
putchar(10);
printf("大于等于10");
}
else
printf("小于10\n");
}
else
printf("不想要这个数\n");
return 0;
}
练习3:
实现大小写转换(用getchar、putchar实现)(答案见最后)
输入大写字母输出小写字母,
输入小写字母输出大写字母,
输入的不是字母,提示输入错误。
#include <stdio.h>
int main(int argc, const char *argv[])
{
char c = getchar();
if (c >= 'a' && c <= 'z')
{
putchar(c - ' ');
putchar(10);
}
else if (c >= 'A' && c <= 'Z')
{
putchar(c + ' ');
putchar(10);
}
else
printf("不是字母\n");
return 0;
}
判断语句中也可写A或a的ASCII码值,对用的A的ASCII值为65,a的ASCII值为97
练习4:
下列程序段运行后,x 的值是( ) (答案见最后)
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 1 , b = 2 , x = 0 ;
if( ! ( -- a ) )
x -- ;
if( ! b )
x = 7 ;
else
++ x ;
printf("%d",x);
}
第一个if语句里面的判断条件--a,首先a要自减,此时a等于0.!0则真,进入第一个if判断语句,x自减,x等于-1。第二个if判断,!2则假,于是进入else语句,对x进行自增,x最终结果为0.(CSDN的编译器对此题运行可能有些错误)
练习5:
下面的一段程序的输出结果为( )
#include <stdio.h>
int main()
{
if ( -1 )
printf( " 1 " ) ;
else
printf( " 2 " ) ;
if(0)
printf( " 3 " ) ;
else
printf( " 4 " ) ;
return 0;
}
在if判断中,非0则真,不要看到-1就显示为假,对应的条件也为真,此时打印1。对应的下一个if、else同理,为0则假,打印4。
练习6:
从终端输入一个日期
scanf ("%d %d %d ", &year , &mon , &day ),判断这是这一年的第几天(答案见后面)
(提示:判断闰年还是平年,闰年且闰年二月份以上比平年多一天。普通年份除以4,有余数是平年,对于整百的年份,比如2100年,要除以400,有余数就是平年,整除就是闰年。)
#include <stdio.h>
int main(int argc, const char *argv[])
{
int y,m,d;
scanf("%d %d %d",&y,&m,&d);
if ((m < 0 && m > 12)||(d < 1 && d > 31))
printf("输入错误\n");
int day = 0;
switch(m)
{
case 1:
day = d;
break;
case 2 :
day = d + 31;
break;
case 3 :
day = d + 31 + 28;
break;
case 4 :
day = d + 31 + 28 + 31;
break;
case 5 :
day = d + 31 + 28 + 31 + 30;
break;
case 6 :
day = d + 31 + 28 + 31 + 30 + 31;
break;
case 7 :
day = d + 31 + 28 + 31 + 30 + 31 + 30;
break;
case 8 :
day = d + 31 + 28 + 31 + 30 + 31 + 30 + 31;
break;
case 9 :
day = d + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31;
break;
case 10 :
day = d + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30;
break;
case 11 :
day = d + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;
break;
case 12 :
day = d + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30;
break;
}
if ((y % 400 == 0 || y % 4 == 0 && y % 100 != 0)&&(m > 2))
{
day = day + 1;
printf("%d\n",day);
}
else
printf("%d\n",day);
return 0;
}
以上代码属于一种比较容易想到的逻辑,分别对月份进行分支判断,进入到该分支之后对前面的月份进行求和,得到该月对应的已有的天数,最后判断平闰年,来判断2月份是否多一天。且每一个case后面都需要跟一个break来终止分支。
以下是另一种思路:
#include <stdio.h>
int main(int argc, char const *argv[])
{
int year, mon, day, days = 0, flag;
scanf("%d %d %d", &year, &mon, &day);
if (year % 100 == 0) //整百年
{
if (year % 400 == 0) //闰年
flag = 1;
else //平年
flag = 0;
}
else //非整百年
{
if (year % 4 == 0) //闰年
flag = 1;
else //平年
flag = 0;
}
switch (mon)
{
case 12:
days += 30;
case 11:
days += 31;
case 10:
days += 30;
case 9:
days += 31;
case 8:
days += 31;
case 7:
days += 30;
case 6:
days += 31;
case 5:
days += 30;
case 4:
days += 31;
case 3:
days += 28 + flag;
case 2:
days += 31;
case 1:
days += day;
break;
default:
printf("err!\n");
break;
}
printf("%04d-%02d-%02d: 是这一年的第%d天\n", year, mon, day, days);
return 0;
}
这串代码是利用一个flag标志来记录平闰年,最终通过flag的值来决定是否要加上2月份的一天。在switch语句中,可以看到除了case1语句后面存在break,其余case后都没有,这是因为switch语句的case后面只有遇到break才会终止运行,否则会越过后面的case分支判断直接执行后面的内容。
走一个例子:当输入的月份为5的时候,分支判断会执行case5后面的内容,后面的语句无break终止程序,于是会执行case4、3、2、1后面的所有语句,也就对应的这几个月的天数也会被累加,直到遇到1后面的break才会停止。
本节内容不多,主要是跟的一些练习,希望读者可以将这些练习题以及对应的注意的点融会贯通~~~