目录
控制语句即用来实现对程序流程的选择、循环、转向和返回等进行控制。
1. 分支语句
1.1 if语句
1.1.1 基本结构
if(表达式)
{
语句块1;
}
else
{
语句块2;
}
执行顺序:如果条件成立,则执行语句块1,如果调节不成立,则执行语句块2。
例子:
if(下雨)
{
带伞;
}
else
{
不带伞;
}
#include
#define RAIN 1
int main(int argc, char const *argv[])
{
if(RAIN)
printf("with unbrella\n");
else
printf("no unbrella\n");
return 0;
}
练习:输入a和b两个整数,用if语句实现两数相减
#include
int main()
{
int a=0,b=0;
scanf("%d%d",&a,&b);
if(a>b)
printf("%d\n",a-b);
else
printf("%d\n",b-a);
}
1.1.2 分层结构
if(表达式1)
{
语句块1;
}
else if(表达式2)
{
语句块2;
}
else
{
语句块3;
}
执行顺序:如果满足if中的表达式则执行if后面的语句块1,如果不满足则进行else if后面表达式2的判断,如果满足表达式则会执行语句块2。如果前面条件都不满足则会执行else后面的语句块3。
例子:
#include
int main()
{
int a=0,b=0;
scanf("%d%d",&a,&b);
if(a>b)
printf("a>b");
else if(a<b)
printf("a);
else
printf("a=b");
}
练习:从终端输入一个学生的成绩,判断学生成绩,打印成绩级别。
【90 - 100】 A
【80 - 89】 B
【70 - 79】 C
【60 - 69】 D
< 60 sorry you lost
#include
int main()
{
int score =0;
scanf("%d",&score);
if(score>=90)
printf("A\n");
else if(score>=80)
printf("B\n");
else if(score>=70)
printf("C\n");
else if(score>=60)
printf("D\n");
else
printf("sorry,you lost!\n");
return 0;
}
1.1.3 嵌套结构
if(表达式1)
{
if(表达式2)
{
语句块1;
}
else
{
语句块2;
}
}
else
{
语句块3;
}
举例子:如果今天下雨,我就带伞,并且如果下小雨我就骑车,否则我就坐车,不下雨我就不带伞。
#include
#define RAIN 0
#define LIANG 0
int main()
{
if(RAIN)
{
printf("with umbrella!\n");
if(LIANG>50)
printf("by car\n");
else
printf("walk\n");
}
else
printf("no umbrella!\n");
return 0;
}
练习:输入一个数,如果大于0打印大于0并且再进行判断是否大于10,如果大于等于10打印大于等于10,小于10打印小于。否则如果小于0打印不想要这个数。
#include
int main()
{
int a;
scanf("%d", &a);
if (a > 0)
{
printf(">0\n");
if (a >= 10)
printf(">=10\n");
else
printf("<10\n");
}
else
{
printf("i don't want this number\n");
}
return 0;
}
总结:
-
(1)首先判断表达式是否成立,如果成立就执行语句块1,否则执行语句块2。
-
(2)if后面可以没有else,但是else前面必须有if。
-
(3)if和else后面如果只有一行语句可以省略花括号{}。
1.2 switch case 语句
基本结构:
swtich(变量或表达式)
{
case 常量1: 语句块1;break;
case 常量2: 语句块2;break;
case 常量3: 语句块3;break;
...
case 常量n: 语句块n;break;
default:语句块n+1;
}
执行顺序:
当变量或表达式的量与其中一个case语句中的常量相符时,就执行此case后面的语句,并依次向下执行后面所有case中的语句,除非遇到break语句就会跳出swtich语句为止。如果变量或者表达式都不相符,就会执行default后面的语句。
注意🚨:
-
表达式不能是浮点型或者字符串。
-
ase后面的break可以省略,但是省略时会顺序执行,指导遇到break就会结束。
-
如果case的语句块和下面case中的语句块相同,则可以省略。形式如下:
case 常量1:
case 常量2:语句块1;break;
练习:从终端输入一个学生的成绩,判断学生成绩,打印成绩级别用switch写
【90 - 100】 A
【80 - 89】 B
【70 - 79】 C
【60 - 69】 D
< 60 sorry you lost
#include
int main()
{
int score;
scanf("%d", &score);
switch (score / 10)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
printf("you lost\n");
break;
case 6:
printf("D\n");
break;
case 7:
printf("C\n");
break;
case 8:
printf("B\n");
break;
case 9:
case 10:
printf("A\n");
break;
default:
printf("error!\n");
break;
}
return 0;
}
练习:从终端输入一个日期 scanf ("%d %d %d ", &year , &mon , &day ),判断这是这一年的第几天
(提示:判断闰年还是平年,闰年且闰年二月份以上比平年多一天。普通年份除以4,有余数是平年,对于整百的年份,比如2100年,要除以400,有余数就是平年,整除就是闰年。)
方式1:
#include
int main(int argc, char const *argv[])
{
int year,month,day,days=0,leap=0;
scanf("%d %d %d",&year,&month,&day);
if(year % 100==0)
{
if(year%400==0)
leap=1;
else
leap=0;
}
else
{
if(year%4==0)
leap=1;
else
leap=0;
}
// leap = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
switch (month)
{
case 1:days = day;break;
case 2:days = 31+day;break;
case 3:days = 31+28+leap+day;break;
case 4:days = 31+28+leap+31+day;break;
case 5:days = 31+28+leap+31+30+day;break;
case 6:days = 31+28+leap+31+30+31+day;break;
case 7:days = 31+28+leap+31+30+31+30+day;break;
case 8:days = 31+28+leap+31+30+31+30+31+day;break;
case 9:days = 31+28+leap+31+30+31+30+31+31+day;break;
case 10:days= 31+28+leap+31+30+31+30+31+31+30+day;break;
case 11:days = 31+28+leap+31+30+31+30+31+31+30+31+day;break;
case 12:days =31+28+leap+31+30+31+30+31+31+30+31+30+day;break;
default:
printf("month err\n");
return -1;
}
printf("这是这一年的第%d天\n",days);
return 0;
}
方式2:
#include <stdio.h>
int main()
{
int year, mon, day, sum;
int sumMon=0;//前面 mon-1 个月的天数
int flag = 0;//润年平年标志
printf("请输入年月日(例如:2023 5 4):\n");
scanf("%d %d %d",&year,&mon,&day);
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
flag = 1;
else
flag = 0;
switch (mon)
{
case 12:sumMon += 30; //若是12月xx日,加上11~1月天数
case 11:sumMon += 31; //若是11月xx日,加上10~1月天数
case 10:sumMon += 30; //若是10月xx日,加上9~1月天数
case 9:sumMon += 31; //若是9月xx日,加上8~1月天数
case 8:sumMon += 31; //若是8月xx日,加上7~1月天数
case 7:sumMon += 30; //若是7月xx日,加上6~1月天数
case 6:sumMon += 31; //若是6月xx日,加上5~1月天数
case 5:sumMon += 30; //若是5月xx日,加上4~1月天数
case 4:sumMon += 31; //若是4月xx日,加上3~1月天数
case 3:sumMon += (flag==1?29:28);//若是3月xx日,加上2~1月天数
case 2:sumMon += 31; //若是2月xx日,加上1月天数
case 1:sumMon += 0;break; //若是1月xx日,加0
default:printf("月份错误!\n");break;
}
sum = sumMon + day;
printf("这是%d年的第%d天\n",year,sum);
return 0;
}
2.循环语句
2.1 for循环
2.1.1 基本结构
格式:
for(表达式1;表达式2;表达式3)
{
语句块;
}
-
表达式2:判断条件
-
表达式3:增值或减值语句
执行顺序:首先执行表达式1进行赋值,然后判断表达式2是否成立,如果成立就进入循环执行语句块,最后再执行表达式3增值或减值语句,然后再判断表达式2是否成立如果成立再进入循环,指导表达式2不成立的时候退出循环。
例子:循环打印1 2 3 4 5
for(int i=1;i<=5;i++)
printf("%d\n",i);
例子:求5!
#include
int main(int argc, char const *argv[])
{
int sum =1;
for(int i=1;i<=5;i++)
sum *=i; //sum=sum*i;
printf("%d\n",sum);
return 0;
}
2.1.2 嵌套结构
格式:
for(表达式1;表达式2;表达式3)
{
for(表达式4;表达式5;表达式6)
{
语句块;
}
}
练习:用for循环打印99乘法表
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
#include<stdio.h>
int main(int argc, char const *argv[])
{
int i=0,j=0;
for(i = 1;i <= 9;i++){
for(j = 1;j <= i;j++){
printf("%d*%d=%d\t",j,i,j*i);
}
putchar(10);
}
return 0;
}
2.1.3 变形
(1)变形一:
表达式1;
for(;表达式2;表达式3)
{
语句块;
}
(2)变形二:
表达式1;
for(;表达式2;)
{
语句块;
表达式3;
}
(3)变形三:
表达式1;
for(;;) //死循环
{
if(表达式2)
{
语句块;
表达式3;
}
else
{
break;
}
}
练习:打印所有的水仙花数。(水仙花数:一个三位数,百位立方+十位立方+个位立方 = 原数)
#include <stdio.h>
#include <math.h>
int main(int argc, char const *argv[])
{
int i;
int ge, shi, bai;
for (i = 100; i <= 999; i++)
{
ge = i % 10;
shi = i / 10 % 10;
bai = i / 100;
// if (ge * ge * ge + shi * shi * shi + bai * bai * bai == i)
// printf("%d ", i);
if(pow(ge,3)+pow(shi,3)+pow(bai,3) == i)
printf("%d ", i);
}
putchar(10);
return 0;
}
练习:打印以下图案:
要求行数从终端输入。
输入:5
输出以下:
#include
int main(int argc, char const *argv[])
{
int n=0;
scanf("%d",&n);
for (int i = 1; i <=n; i++)
{
for (int j = 1; j <=i ; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
练习:
要求行数从终端输入。
输入:5
输出以下:
行数i | 空格数=i-1 | 星星数=5-i+1 |
---|---|---|
1 | 0=1-1 | 5=5-1+1 |
2 | 1=2-1 | 4=5-2+1 |
3 | 2=3-1 | 3=5-3+1 |
4 | 3=4-1 | 2=5-4+1 |
5 | 4=5-1 | 1=5-5+1 |
#include <stdio.h>
int main(int argc, char const *argv[])
{
int n = 0;
scanf("%d", &n);
/*1. 实现上半部分打印*/
for (int i = 1; i <= n; i++) //行数
{
for (int j = 1; j <= i; j++) //打印每行星星数
{
printf("*");
}
printf("\n"); //每行打印结束后换行
}
/*2. 实现下半部分打印*/
for (int i = 1; i <= n; i++) //行数
{
for (int k = 1; k < i; k++) //实现打印每行空格数
printf(" ");
for (int j = 1; j <= n - i + 1; j++)//实现打印每行星星数
printf("*");
printf("\n"); //每行打印结束后换行
}
return 0;
}
2.2 while循环
格式:
定义循环变量并赋值;
while(判断条件)
{
语句块;
增值或减值语句;
}
执行顺序:
首先定义循环变量并且赋值,然后判断条件是否满足,如果满足就进入循环执行语句块,以及执行增值或减值语句。然后再进行判断,如果满足再次进入循环,直到不满足之后退出循环。相当于for循环的变形。
例如: 求从1加到100
#include <stdio.h>
int main(int argc, char const *argv[])
{
int i=1,sum=0;
while (i<=100)
{
sum+=i;
i++;
}
printf("%d\n",sum);
return 0;
}
2.3 do while循环
格式:
do
{ 语句块;
增值减值语句;
}while(判断条件);
执行顺序:先执行后判断
例如:实现1-10求和?
#include <stdio.h>
int main(int argc, char const *argv[])
{
int i=1,sum=0;
do
{
sum+=i;
i++;
} while (i<=10);
printf("%d\n",sum);
return 0;
}
左边do-while 右边while
两者区别:
- 执行顺序不同:do while是先执行后判断,while先判断后执行。
- 执行次数不同:do while至少会执行一次。
2.4 死循环
for(;;){}
while(1){}
while(1);
2.5 循环控制语句
break continue goto
-
(1)break:直接结束循环
-
(2)continue:结束本次循环,继续下一次循环
-
(3)goto:强制跳转到标签位置,可以应用于多重循环嵌套。
例如:
for(...)
{
for(...)
{
for(...)
{
if(错误条件)
goto error;
}
}
}
...
error:
...//处理情况
练习:打印100到200中能被三整除的数
#include <stdio.h>
int main(int argc, char const *argv[])
{
int n;
for(n=100;n<=200;n++)
{
if(n%3 !=0 ) continue;
printf("%d ",n);
}
return 0;
}
练习:从终端上循环输入一个字符并在终端上输出这个字符,当输入字符为‘q’时,程序结束。
#include <stdio.h>
int main(int argc, char const *argv[])
{
char ch;
while(1)
{
scanf("%c",&ch);
//getchar();
if(ch=='\n')
continue;
if(ch == 'q')
break;
printf("%c\n",ch);
}
return 0;
}
使用场景:
使用在循环语句中,做为结束循环的应用。使用时需要有判断条件。
练习:循环输入一个5位数,判断它是不是回文数。当输入0时循环结束,是回文数循环也结束。
即12321是回文数,个位与万位相同,十位与千位相同。
#include <stdio.h>
int main(int argc, char const *argv[])
{
int n;
int g, s, b, q, w;
while (1)
{
scanf("%d", &n);
if (n == 0)
break;
g = n % 10;
s = n / 10 % 10;
b = n / 100 % 10;
q = n / 1000 % 10;
w = n / 10000;
if ((g == w) && (s == q))
{
printf("YES!\n");
break;
}
else
{
printf("NO!!\n");
continue;
}
}
return 0;
}
%c",&ch);
//getchar();
if(ch==‘\n’)
continue;
if(ch == ‘q’)
break;
printf(“%c\n”,ch);
}
return 0;
}
使用场景:
使用在循环语句中,做为结束循环的应用。使用时需要有判断条件。
练习:循环输入一个5位数,判断它是不是回文数。当输入0时循环结束,是回文数循环也结束。
即12321是回文数,个位与万位相同,十位与千位相同。
```c
#include <stdio.h>
int main(int argc, char const *argv[])
{
int n;
int g, s, b, q, w;
while (1)
{
scanf("%d", &n);
if (n == 0)
break;
g = n % 10;
s = n / 10 % 10;
b = n / 100 % 10;
q = n / 1000 % 10;
w = n / 10000;
if ((g == w) && (s == q))
{
printf("YES!\n");
break;
}
else
{
printf("NO!!\n");
continue;
}
}
return 0;
}