三、语句
1、分支语句
1.1、if
分支语句里的if语句请参考day03
1.2、switch
switch(变量或表达式)
{
case 常量1:语句块1;break;
case 常量2:语句块2;break;
……
case 常量n:语句块n;break;
default:语句块n+1;
}
执行顺序:
判断switch后面的表达式结果,和case后面的常量匹配,如果匹配成功,就执行对应的语句块,碰到break则switch结束;如果没有匹配成功,则执行default后面的语句块,碰到break后switch结束。
示例如下:
#include<stdio.h>
int main()
{
int a;
scanf ("%d", &a );
switch ( a )
{
case 1:
printf (" 1\n");
break;
case 2:
printf (" 2\n");
break;
case 3:
printf (" 3\n");
break;
default:
printf ("other\n");
break;
}
return 0;
}
注意:
1、表达式不能是浮点型或字符串,只能整型或者是字符型
练习:从终端输入年月日,判断这是这一年的第几天
#include<stdio.h>
int main()
{
int year, month, day;
int number;
printf ("Please enter the date:");
scanf ("%d/%d/%d", &year, &month, &day );
number = day;
switch ( month)
{
case 1:
break;
case 2:
number+= 31;
break;
case 3:
number+= 31+28;
break;
case 4:
number+= 31+28+31;
break;
case 5:
number+= 31+28+31+30;
break;
case 6:
number+= 31+28+31+30+31;
break;
case 7:
number+= 31+28+31+30+31+30;
break;
case 8:
number+= 31+28+31+30+31+30+31;
break;
case 9:
number+= 31+28+31+30+31+30+31+31;
break;
case 10:
number+= 31+28+31+30+31+30+31+31+30;
break;
case 11:
number+= 31+28+31+30+31+30+31+31+30+31;
break;
case 12:
number+= 31+28+31+30+31+30+31+31+30+31+30;
break;
}
if ( year% 4 == 0)
{
number+=1;
}
printf ("%d/%d/%d is %d", year, month, day, number);
return 0;
}
进阶用法:
case 后面可以不加break,程序会执行下一个case,直到遇到break。这种情况通常在两个或多个case共用一个语句块,即多个case表达同一个意思时使用,可以有效减少代码行数。
示例如下:
#include<stdio.h>
int main()
{
int a;
scanf ("%d", &a );
switch ( a )
{
case 1:
printf (" 1\n");
//break;
case 2:
printf (" 2\n");
//break;
case 3:
printf (" 3\n");
//break;
default:
printf ("other\n");
//break;
}
return 0;
}
运行结果如下:
上述练习题可以简化代码
#include<stdio.h>
int main()
{
int year, month, day;
int number;
printf ("Please enter the date:");
scanf ("%d/%d/%d", &year, &month, &day );
switch (month)
{
case 12: number += 30;
case 11: number += 31;
case 10: number += 30;
case 9: number += 31;
case 8: number += 31;
case 7: number += 30;
case 6: number += 31;
case 5: number += 30;
case 4: number += 31;
case 3: number += 28;
case 2: number += 31;
case 1: number += day;
}
if ( year% 4 == 0)
{
number+=1;
}
printf ("%d/%d/%d is %d", year, month, day, number);
return 0;
}
2、循环语句
2.1、for循环
2.1.1、for循环基本结构
for(表达式1;表达式2;表达式3)
{
语句块1;}
表达式1:初值
表达式2:终止条件
表达式3:增或减
执行顺序:
首先执行表达式1,然后判断表达式2是否成立,如果成立,则执行语句块1,然后执行表达式3,第一次循环结束,第二次循环开始,再次判断表达式2是否成立,成立继续循环,不成立退出循环,执行下面的语句;如果第一次判断表达式2不成立,那么直接结束循环,执行后面的语句。
示例如下
#include <stdio.h>
int main(int argc, char const *argv[])
{
int i;
for (i = 1; i <= 10; i++)
{
if(i == 10)
{
printf("恭喜宿主成功回到主世界\n");
}
else
{
printf("你已经死了%d次,还差%d次就可以回到主世界了\n", i, 10-i);
}
}
return 0;
}
2.1.2、for循环嵌套结构
for循环中的语句块也可以是另一个for循环
for(表达式1;表达式2;表达式3)
{
for(表达式4;表达式5;表达式6){
语句块1;
}
}
执行顺序:
里面的for循环循环一轮,外面的循环循环1次
示例如下:
#include <stdio.h>
int main(int argc, char const *argv[])
{
int i, j;
for (i = 1; i <= 10; i++)
{
for (j = 1; j <=10; j++)
{
printf("%d:%d ", i, j);
}
printf("\n");
}
return 0;
}
运行结果如下:
可以很明显看到,里面的for循环循环一轮,外面的循环循环1次,即外层循环控制行数,内层循环控制列数
2.1.3、for循环的省略
for循环里面的表达式1,2,3都可以省略,但’;‘不能
表达式1
for(;表达式2;)
{
语句块1;
表达式3;
}
表达式1:for循环的初值,所以在for循环前面完成初值的定义和赋值
表达式2:for循环的终止条件,省略的话就是一个死循环,在未来的项目中可能会出现死循环的应用
表达式3:for循环的增值或减值,在for循环当次的循环中最后执行,省略不写的话也是死循环
练习:打印以下图案
*
**
***
****
*****
#include<stdio.h>
int main()
{
for( int i=0;i<5;i++)
{
for(int j=0;j<=i;j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
进阶练习:打印以下图案:
*
**
***
****
**********
*******
**
*
#include <stdio.h>
int main()
{
int i, j, s;
for (i = 1; i <= 5; i++)
{
for (j = 1; j <= i; j++)
{
printf("*");
}
printf("\n");
}
for (i = 1; i <= 5; i++)
{
for (s = 0; s < i-1; s++)
{
printf(" ");
}
for (j = 0; j <= 5-i; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}