目录
2.2.3.do while循环中的break和continue
1.分支语句(条件判断语句)
条件判断语句也叫分支语句:if语句、switch语句
1.1.if语句
语法结构如下:
语法结构:
if(表达式)
语句;
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
以下为代码演示:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);//录入键盘数据
if(age<18)
{//'{}'之间包裹的是单独的结构
printf("小孩子\n");//打印结果
}
else if(age>=18 && age<30)
{
printf("青年人\n");
}
else if(age>=30 && age<50)
{
printf("中年人\n");
}
else if(age>=50 && age<80)
{
printf("老年人\n");
}
else
{
printf("寿星\n");
}
return 0;
}
1.从代码中可以知道的是:利用if;else-if;else实现条件判断,划分出每个age大小在每个区间时函数的输出对应的结果。
2.c语言中0表示‘假’,1表示‘真’
3.‘{ }’包裹的是一个代码块
下面来看另一段代码:
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
很显然它是逻辑混乱的,修改为以下代码:
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
{
printf("hehe\n");
}
}
else
{
printf("haha\n");
}
return 0;
}
输出结果为“haha”,所以我们需要合理利用‘{ }’来标注好代码的逻辑
注意:else和距离它层级最近的if相匹配
1.1.1.if语句的书写
下面我们来看一段代码:
#include <stdio.h>
int main()
{
int x = 0;
int y = 0;
if (condition)
{
return x;
}
return y;
// 代码2
if (condition)
{
return x;
}
else
{
return y;
}
// 代码3
int num = 1;
if (num == 5)
{
printf("123\n");
}
// 代码4
int num = 1;
//可以防止输入时少输入一个'='把条件变成'永真'
if (5 == num)
{
printf("123\n");
}
}
> 代码4格式更好一些,因为将变量放在后面可以在我们输入错误时IDE提醒我们错误位置,如果变量在前面则输入错误时'num = 5'作为一个赋值式,它是永真的,IDE不能帮助我们发现错误
1.1.2.if语句的简单题目
1.判断输入的数字是否是奇数
参考答案:
#include<stdio.h>
int main()
{
int i;
printf("请输入数字:>");
scanf("%d", &i);
if(i%2 == 1)
{
printf("%d是奇数\n", i);
}
else
{
printf("%d不是奇数\n", i);
}
return 0;
}
1.2.switch语句
switch常用于多分支情况。
例如:
如果使用if-else的形式书写这个代码,会显得很繁复,用switch则正好
以下switch语句完成上述功能:
#include <stdio.h>
int main()
{
int grade = 0;
switch (grade)
{
case 1:
printf("一年级\n");
break;
case 2:
printf("二年级\n");
break;
case 3:
printf("三年级\n");
break;
case 4:
printf("四年级\n");
break;
case 5:
printf("五年级\n");
break;
case 6:
printf("六年级\n");
break;
}
return 0;
}
break语句 的实际效果是把语句列表划分为不同的分支部分。
但是如果我们输入的值在这些case中都对不上呢?
我们可以选择:default语句
1.2.1.default子句
default特点:
1.写在和case标签同级的任何一个位置。
2.每个switch语句中只能出现一条default子句。
default作用:当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
1.2.2.题目
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;//没有break继续向下运行
case 2:
n++;
case 3:
switch (n)
{//switch允许嵌套使用
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d, n = %d\n",m,n);
return 0;
}
问:m,n各等于几?
答案:m = 5,n = 3
2.循环语句
1.while
2.do...while
3.for
2.1.while
2.1.1.while语法展示
实现功能:打印1-100数字
#include <stdio.h>
int main()
{
int i = 1;
while(i<=100)
{
printf("%d ", i);
i = i+1;
}
return 0;
}
2.1.2.while语句中的break
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
//i=5时跳出循环
if(i == 5)
break;
printf("%d ", i);
i = i+1;
}
return 0;
}
打印结果:1 2 3 4
break在while循环中的作用:while中的break是用于永久终止循环的。
2.1.3.while语句中的continue
请看第一段代码
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i = i + 1;
}
return 0;
}
输出结果:1 2 3 4
请看第二段代码
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
i = i + 1;
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
输出结果:2 3 4 6 7 8 9 10 11
由这两种情况我们可以知道,在'i'的自加式子到continue语句前面之后,
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,
而是直接跳转到while语句的判断部分。进行下一次循环的入口判断.
2.2.do...while
2.2.1.do...while语法
do
循环语句;
while(表达式);
2.2.2.do...while的特点
特点:
1.循环至少执行一次
2.先执行后判断
例:
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i=i+1;
}while(i<=10);
return 0;
}
2.2.3.do while循环中的break和continue
首先我们看两段代码:
#include <stdio.h>
int main()
{
int i = 1;
do
{
if (5 == i)
break;
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}
结果:1 2 3 4
#include <stdio.h>
int main()
{
int i = 1;
do
{
if (5 == i)
continue;
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}
结果:1 2 3 4
#include <stdio.h>
int main()
{
int i = 1;
do
{
i = i + 1;//换了位置
if (5 == i)
continue;
printf("%d ", i);
} while (i <= 10);
return 0;
}
结果 :2 3 4 6 7 8 9 10 11
可知与while中相同
2.3.for
2.3.1.for的语法
for(表达式1; 表达式2; 表达式3)
循环语句;
表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。
使用效果:
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}
2.3.2.for的特点
查找和修改更加集中方便
for循环和while循环的对比
for(i=1; i<=10; i++)
{
printf("hehe\n");
}
int i = 0;
i=1;//初始化部分
while(i<=10)//判断部分
{
printf("hehe\n");
i = i+1;//调整部分
}
2.3.3.for中的break和continue
//break
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ",i);
}
return 0;
}
//continue
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
continue;
printf("%d ",i);
}
return 0;
}
break和continue的意义和while循环中是一样的
2.3.4.for循环中的注意事项
1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
两种写法:
int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}
2.3.5.题目
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for(i =0,k=0; k=0; i++,k++)
k++;
return 0;
}
问:循环次数
答案:0次
因为k = 0,恒为假,所以循环0次
3.小题目练练手
3.1.计算1~10的阶乘
答案:
int main()
{
int n = 5;
int count = 1;
int sum = 0;
int i = 0;
printf("请输入n的值");
scanf("%d", &n);
for (int j = 1; j <= n;j++)
{
count = 1;//防止在算之后的阶乘中count的初始值是上一个值的阶乘数值,导致计算结果错误
for (i = 1; i <= j; i++)
{
count = count * i;
}
sum += count;
}
printf("%d\n", sum);
return 0;
}
3.2.在一个有序数组中查找具体的某个数字n。
答案:
int main(){//首先是简单的遍历方法(低效率)
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int k = 0;
scanf("%d", &k);
int i = 0;
int flag = 0;
for (i = 0; i < 10;i++)
{
if(arr[i]==k)
{
printf("找到了,下标是:%d\n", i);
flag = 1;
break;
}
}
if(flag == 0){
printf("没找到");
}
return 0;
}
3.3. 折半查找(二分查找)
特点:效率比较高但是需要有序数组中才能使用。
问题:输入一个数字查找它在数组中的位置
答案:
int main()
{
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
int k = 0;
scanf("%d", &k);
int left = 0;
int right = sz-1;//下标是数组个数减一
int flag = 0;
while (left <= right)
{
int mid = (left + right) / 2;//此条语句要放在循环里面mid才会更新
if (arr[mid] < k)
left = mid + 1;
else if (arr[mid] > k)
right = mid - 1;
else
{
printf("找到了,下标是:%d\n", mid);
flag = 1;
break;
}
}
if (flag == 0)
printf("找不到\n");
}
如果不知道数组中的元素个数,可以使用以下方法
printf("%d\n",sizeof(arr)); - 数组的总大小,单位是字节
printf("%d\n",sizeof(arr[0])); - 数组中单位数据的大小
printf("%d\n",sizeof(arr)/sizeof(arr[0]));,可用于计算数组中元素的个数
4.goto语句
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过
程。
例如:一次跳出两层或多层循环。
多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。(而且还需要设置限制条件)
演示:
// goto语句,可以自由的跳转到想要去的代码行,但是不能跨函数跳转
void test()
{
flag:
printf("321\n");
}
int main()
{
printf("123\n");
goto flag;//只能在同一个函数内部跳转,不能跨函数
return 0;
}
5.整蛊(滑稽)
学习之余娱乐一下
// goto语句适合跳出多层循环使用比break方便(break需要一些理由跳出该层循环)
// 关机程序
// 程序运行起来后一分钟内关机
// 如果输入"我是猪八戒",则取消关机
// 如果不听话则立即关机
int main()
{
char input[20] = {0};
system("shutdown -s -t 60"); //-t表示设置时间,倒计时60秒关机
again:
printf("你的电脑即将在一分钟后关机,如果输入'我是猪'则停止关机程序\n");
scanf("%s", input);
if (strcmp(input, "我是猪八戒") == 0)
{
system("shutdown -a");
printf("有惊无险,已经停止了关机程序\n");
}
else
{
printf("很抱歉你不配合,重启见\n");
system("shutdown -a");
system("shutdown -s -t 3");
}
return 0;
}
代码都可在我的gitee仓库中找到,链接如下: