第二节 分支语句和循环语句

目录

1. 什么是语句?

 2.分支语句(选择结构)

2.1 if语句

2.1.1 悬空else

2.1.2 if书写形式的对比

2.1.3错误的程序

2.1.4修改代码 

2.1.5练习题目 

 2.2switch语句

2.2.1 在switch语句中的 break

 2.2.2 default子句

2.2.3switch允许嵌套使用

3.循环语句

3.1 while循环

3.1.1 while语句中的break和continue

3.2 for循环

3.2.1 语法

3.2.2 break和continue在for循环中

3.2.3 for语句的循环控制变量 

3.2.4 一些for循环的变种

        3.3 do...while()循环

3.3.1 do..while语句的语法:

 3.3.2do..while语句的特点

3.3.4 do...while循环中的break和continue 

3.4练习

4. goto语句


1. 什么是语句?

C语言中由一个分号;隔开的就是一条语句。

printf("hehe");
1+2;

 2.分支语句(选择结构)

2.1 if语句

//if语句的语法结构

//1.
if(表达式)
语句;




//2.
if(表达式)
{
    语句1;
else
    语句2;
}

//3.
//多分支
if(表达式1) 
{
    语句1;
else if(表达式2)
    语句2;
//这里可以再补充n条
//else if(表达式n)
    语句n;
else
    语句;
}

 如果表达式的结果为真,则语句执行。

在C语言中如何表示真假?0表示假,非0表示真。

这里的一对 { }就是一个代码块。

2.1.1 悬空else

int main()
{
	int a = 0; int b = 2; 
	if (a == 1) 
		if (b == 2)
		printf("hehe\n");
	else
		printf("haha\n");
	//打印结果是空,因为else与最近的if匹配了
	return 0;
}

else的匹配:else是和它离的最近的if匹配的。

2.1.2 if书写形式的对比

//代码1
if (condition) {
    return x;
}
return y;

//代码2
if(condition)
{
    return x;
}
else
{
    return y;
}

//代码3
int num = 1; 
if(num == 5) 
{
    printf("hehe\n");
}

//代码4
    int num = 1; 
    if(5 == num) 
    {
    printf("hehe\n");
    }//代码2和代码4更好,逻辑更加清晰,不容易出错。

2.1.3错误的程序

 

为什么会这样?没有输入直接确认了
先了解函数getchar()和函数putchar()的作用.
1.使用getchar()函数以后,将会在控制台输入字符。例如输 入单个字符‘a’,然后按下回车,就将单个字符‘a’输入缓 冲区了,而且顺带多了一个回车的字符,此时缓冲区有两个字
符a\n,就是单个字符a、回车字符.

2.putchar函数作用,输出一个字符 

 

password拿了abcdef,遇到不同字符就停
\n依然被放在缓冲区
ch直接拿到/n--根本不容你确认密码就先行判断了 

2.1.4修改代码 

修改代码,在确认密码前加上函数getchar,将字符’\n’取走,再次输入字符‘Y’

 

清空缓冲区了,但这种不可取,因为如果有很多个\n,就得打 很多条这语句

在修改

2.1.5练习题目 

练习:
1. 判断一个数是否为奇数
2. 输出1-100之间的奇数

1. 判断一个数是否为奇数
标题2. 输出1-100之间的奇数

 2.2switch语句

switch语句也是一种分支语句。 常常用于多分支的情况。

比如:
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日

 写成if...else if ...else if的形式太复杂了!

int main()
{
	int day = 0;
	if (day == 1)
	{
		printf("星期一");
	}
	else if (day == 2)
	{
		printf("星期二");
	}
	else if (day == 3)
	{
		printf("星期三");
	}
	else if (day == 4)
	{
		printf("星期四");
	}
	else if (day == 5)
	{
		printf("星期五");
	}
	else if (day == 6)
	{
		printf("星期六");
	}
	else
	{
		printf("星期日");
	}
	return 0;
}

用switch语句就简单了!

switch(整型表达式)
{
    语句项;
}

//语句项:
case 整形常量表达式: 
    语句;

2.2.1 在switch语句中的 break

在switch语句中,我们没法直接实现分支,搭配break使用才能实现真正的分支。 

int main()
{
	int day = 0;
	switch (day)
	{
	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; 
	case 7:
		printf("星期天\n");
		break;
	}
	return 0;
}

有时候我们的需求变了:
1. 输入1-5输出的是“weekday”;

2. 输入6-7输出“weekend”

#include <stdio.h>
//所以我们的代码就应该这样实现了:
int main()
{
	int day = 0;
	switch (day)
	{
	case 1: 
	case 2: 
	case 3: 
	case 4: 
	case 5:
		printf("weekday\n");
		break; 
	case 6: 
	case 7:
		printf("weekend\n");
		break;
	}
	return 0;
}

break语句的实际效果是把语句列表划分为不同的部分。

编程好习惯:
在最后一个 case 语句的后面加上一条 break语句。(之所以这么写是可以避免出现在以前的最后 )

 2.2.2 default子句

如果表达的值与所有的case标签的值都不匹配怎么办? 其实也没什么,结构就是所有的语句都被跳过而已。
程序并不会终止,也不会报错,因为这种情况在C中并不认为适合错误。
但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
你可以在语句列表中增加一条default子句,把下面的标签 

  • default:

写在任何一个case标签可以出现的位置。

当 switch表达式的值并不匹配所有case标签的值时,这个default子句后面的语句就会执行。

所以,每个switch语句中只能出现一条default子句。

但是它可以出现在语句列表的任何位置,而且语句流会像贯穿一个case标签一样贯穿default子句

编程好习惯
在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。

2.2.3switch允许嵌套使用

3.循环语句

3.1 while循环

我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。

C语言中给我们引入了:while语句,可以实现循环。

//while 语法结构
while(表达式)
    循环语句;

 

 在屏幕上打印1-10的数字。

#include <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

3.1.1 while语句中的break和continue

#include <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			break;
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}
//这里代码输出的结果是什么?1 2 3 4

总结:
break在while循环中的作用:
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。

也是停止这一层循环

所以:while中的break是用于永久终止循环的。 

#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 6 7 8 9 10

总结:
continue在while循环中的作用就是:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接 跳转到while语句的判断部分。进行下一次循环的入口判断。

3.2 for循环

3.2.1 语法

for(表达式1;表达式2;表达式3) 
    循环语句;

表达式1
表达式1为初始化部分,用于初始化循环变量的。

表达式2
表达式2为条件判断部分,用于判断循环时候终止。

表达式3
表达式3为调整部分,用于循环条件的调整。

//使用for循环 在屏幕上打印1 - 10的数字。
#include <stdio.h>
int main()
{
	int i = 0;
	//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
	for (i = 1; i <= 10; i++)
	{
		printf("%d ", i);
	}
	return 0;
}

 

对比一下for循环和while循环。

int main()
{
	int i = 0;
	//实现相同的功能,使用while
	i = 1;//初始化部分 
	while(i<=10)//判断部分
	{
		printf("hehe\n");
		i = i + 1;//调整部分
	}

	//实现相同的功能,使用while
	for (i = 1; i <= 10; i++) {
		printf("hehe\n");
	}
	return 0;
}

可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离 较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹。 for循环使用的频率也最高。

3.2.2 break和continue在for循环中

for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。 

3.2.3 for语句的循环控制变量 

一些建议:
1. 不可在for 循环体内修改循环变量,防止 for  循环失去控制。

2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。

int main()
{
	int i = 0;
	//前闭后开的写法
	for (i = 0; i < 10; i++) {}
	//两边都是闭区间
	for (i = 0; i <= 9; i++) {}

	return 0;
}

3.2.4 一些for循环的变种

#include <stdio.h>
int main()
{
	//变种1--死循环
	for (;;) 
    {
		printf("hehe\n");
	}

	//变种2
	int x, y; 
	for (x = 0, y = 0; x < 2 && y < 5; ++x, y++) //注意控制两个变量
	{
		printf("hehe\n");
	}
	return 0;
}

3.3 do...while()循环

3.3.1 do..while语句的语法:

do
    循环语句;
while(表达式);

 3.3.2do..while语句的特点

循环至少执行一次,使用的场景有限,所以不是经常使用。

3.3.4 do...while循环中的break和continue 

do...while循环中也可以出现break和continue,他们的意义和在while循环中是一样的。 

3.4练习

1. 计算 n的阶乘。
2. 计算 1!+2!+3!+……+10!
3. 在一个有序数组中查找具体的某个数字n。
编写int binary_search(int x, int v[], int n); 功能:在v[0]<=v[1]<=v[2]<= ….<=v[n-1]的数组中查找x.
4. 编写代码,演示多个字符从两端移动,向中间汇聚。
5. 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。

//1. 2.
//求阶乘ret 和 阶乘和sum
int main()
{
	int n = 0;
	int ret = 1;
	int sum = 0;
	for (n = 1; n <= 4; n++)
	{
		ret = ret *n;//阶乘 n!=(n-1)!*n
		sum = sum + ret;//阶乘和
	}
	printf("%d", sum);
	return 0;
}
//3.

//二分查找法
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz - 1;
	int k = 10;
	while (left <= right)
	{
		int mid = (right + left) / 2;
		
		if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else
		{
			printf("找到了,下标是%d",mid);
			break;
		}
	}
	if (left > right)
	{
		printf("找不到");
	}
	return 0;
}
//4.
#include<stdio.h>
#include <stdlib.h>
#include <windows.h>

int main()
{
	char arr1[] = "hello world";
	char arr2[] = "###########";

	int length = strlen(arr1);
	int left = 0;
	int right = length - 1;
	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		Sleep(1000);//1000毫秒 - 1秒
		system("cls");
		left++;
		right--;
	}
	printf("%s\n", arr2);
	return 0;
}
//5.

#include<stdio.h>
#include <string.h>
int main()
{
	int i = 0;
	char password[20] = {0};

	for (i = 1; i <= 3; i++)
	{
		printf("请输入密码\n");
		scanf("%s", &password);

		if (strcmp(password, "abcdef") == 0)
		{
			printf("登陆成功");
			break;
		}
		else
		{
			printf("登录失败");
		}

	}
	if (i == 3)
	{
		printf("三次密码输入错误,退出程序\n");
	}
	return 0;
}

4. goto语句

C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。

从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。

但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。
这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。 

goto语言真正适合的场景如下:跳出多层循环

for(...) 
    for(...) 
   {
        for(...) 
       {
        if(disaster) 
        goto error;
       }
   }
...

error: if(disaster)
// 处理错误情况

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值