分类
- 顺序结构
- 选择结构
- 循环结构
- 跳转结构
顺序结构
程序从main函数第一句开始执行,执行到最后一句
等待上一句执行完成后才能执行下一句。
选择结构
根据不同的条件执行不同的代码块
if-else switch-case
if-else结构
1、单个if
if(条件表达式)
{
条件表达式为真的时候执行语句
}
2、if-else 二选一组合
if(条件表达式)
{
条件表达式为真的时候执行语句
}
else
{
条件表达式为假的时候执行语句
}
3、if -- else if -- ..... else 多选一
if(条件表达式1)
{
条件表达式为真的时候执行语句
}
else if(条件表达式2)
{
条件表达式1为假,条件表达式2为真的时候执行语句
}
else if(条件表达式3)
{
条件表达式1、2为假,条件表达式3为真的时候执行语句
}
....
else
{
上述条件表达式都为假,执行的语句
}
switch - case结构
switch(条件表达式)
{
case 常量1:
语句块1;
break;
case 常量2:
语句块2;
break;
// ....
default:
语句块3;
break;
}
执行流程:
1、先计算条件表达式的结果
2、拿结果和常量数据进行等值判断(==),如果不等继续拿下面的常量判断,如果相等执行case后面的语句,遇到break结束switch-case结构。
注意:
break结束匹配。
switch-case结构中可以让多个case共用同一段代码
题目1:用switch-case结构输入年份和月份,输出这个月有多少天
#include<stdio.h>
int main()
{
int year;
int month;
printf("请输入一个月份:");
scanf("%d",&month); //先判断月份再判断年份,防止代码冗余
printf("请输入一个年份:");
scanf("%d",&year);
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
printf("你输入的这个月有31天");
break;
case 4:
case 6:
case 9:
case 11:
printf("你输入的这个月有30天");
break;
case 2:
if((year % 4 == 0 && year % 100 != 0) | (year % 400 == 0))
{
printf("你输入的2月在这一年有29天");
}
else
{
printf("你输入的2月在这一年有28天");
}
break;
default:
printf("没有这个月份");
}
return 0;
}
题目2:输入星期的整数,输出星期
#include <stdio.h>
int main(void)
{
int a;
printf("请输入一个星期数字:");
scanf("%d",&a);
switch(a)
{
case 1: printf("星期一"); break;
case 2: printf("星期二"); break;
case 3: printf("星期三"); break;
case 4: printf("星期四"); break;
case 5: printf("星期五"); break;
case 6: printf("星期六"); break;
case 7: printf("星期日"); break;
default: printf("输入有误"); break;
}
printf("结束");
}
if-else和switch-case的区别
if-else 比较适合做范围区间
switch-case 等值判断,不适合大量范围的划分
循环结构
循环:重复执行一段代码,一般有限次,程序执行的时候(记录循环的次数)。
for循环
格式
定义一个循环变量
循环条件表达式
如果这个点表达式的结果为真,则执行循环体,如果为假,循环结束
执行步骤:
1、循环变量赋初值
2、计算循环条件表达式,如果假,结束循环
如果为真,执行循环体,循环变量改变
for(循环变量赋初值;循环条件表达式;循环变量的改变)
{
// 循环体
}
题目:求u8的二进制数中1的个数。
#define u8 unsigned char
int main()
{
u8 a;
printf("请输入一个十六进制的数据:");
scanf("%x",&a);
// a & (1 << n)
// 定义一个计数变量
int count = 0;
int n;
for(n=0;n<=7;n++)
{
if((a & (1 << n)) != 0)
{
count++;
}
}
printf("%d",count);
return 0;
}
while循环
格式:循环变量初始化 --- 定义+赋值
while(循环条件表达式)
{
// 循环体
// 循环变量的改变
}
题目:求一个整数中出现2的次数
int a;
printf("请输入一个整数:");
scanf("%d",&a);
int count = 0;
while(a!=0)
{
int res = a % 10;
if(res == 2)
{
count++;
}
a = a / 10;
}
printf("%d",count);
for循环与while循环的区别
for循环:知道循环次数
while循环:知道结束条件
写while循环的时候 循环条件表达式要写成 结束条件的反面
do-while循环
do
{
//循环体
}while(循环条件表达式);
执行流程:
先执行循环体,在判断循环条件表达式,如果为真继续,如果为假结束循环
while循环和do-while循环的区别:
while循环 先判断再决定是否执行循环体 执行次数>=0
do-while循环:先执行循环体再判断 执行次数>=1
题目:输出100 ~ 999内的每一个数
int i = 100;
do
{
printf("%d ",i);
i++;
}while(i <= 999);
if-goto
跳转的目的地设置一个标识符:格式 “标识符:”
满足条件需要 跳转语句: goto 标识符名;
注意: 标识符的定义位置和 goto 语句必须在同一个函数内部
题目:输出1 ~ 3
int i = 1;
A:
printf("%d ",i);
i++;
if(i <= 3)
{
goto A;
}
printf("end");
//注意: 标识符的定义位置和 goto 语句必须在同一个函数内部。
跳转结构
break
跳出离它最近的一层循环
题目:输出1 ~ 10,如果数据能被3整除结束循环
int a;
for(a=1;a<=10;a++)
{
if(a % 3 == 0)
{
break;
}
else
{
printf("%d ",i);
}
}
continue
跳出本次循环,循环内部continue下面的语句不执行,循环还在继续。
题目:输出1 ~ 10,如果数据能被3整除跳过这个数据
int a;
for(a=1;a<=10;a++)
{
if(a % 3 == 0)
{
continue;
}
else
{
printf("%d ",a);
}
printf("xxxxxx");
}
goto
跳出多层循环
#include<stdio.h>
int main(void)
{
// int i; 1 ~ 9
// int j; 1 ~ 9
// 如果 i > j 终止所有循环
int i,j;
for(i=1;i<=9;i++)
{
printf("---start---%d---\n",i);
for(j=1;j<=9;j++)
{
if(i > j)
{
// break;
goto L;
// return 0;
}
else
{
printf("%d ",j);
}
}
printf("---end---%d---\n",i);
}
L:
printf("结束");
// i=1;1<=9成立,执行循环体
// 输出 start
// j=1 1<=9
// printf 1 j++ j=2
// 2<=9
// printf 2 j++ j=3
// ........
// 9<=9
// printf 9 j++ j=10
// 10<=9 不成立 j循环结束
// 输出 end ---------------------------i++ i=2
// 2<=9成立,执行循环体
// 输出 start
// j=1 1<=9
// printf 1 j++ j=2
// 2<=9
// printf 2 j++ j=3
// ........
// 9<=9
// printf 9 j++ j=10
// 10<=9 不成立 j循环结束
// 输出 end ---------------------------i++ i=2
return 0;
}