C语言之分支与循环

一. 控制语句

控制语句用于控制程序的执行流程

分成三类:

1.条件判断语句(分支语句):if,switch

2.循环执行语句:do while, while, for 

3.转向语句:break, goto, continue, return

二. 分支语句

1.if语句

if(conddition)
{
    return x;
}
return y;

上面的代码是不明确的,会有歧义 ,应该写成下面这种形式。

if (condition)
{
    return x;
}
else
{
    return y;
}

示例代码: 

# include<stdio.h>
int test()
{
	int n = 10;
	if (n > 5)
		return 1;
	else
		return 2;//return之后再输入什么代码都不会执行
}
int main()
{
	int m = test();
	printf("%d\n", m);

	return 0;
}

返回结果 : 1

int main()
{
	int n = 5;
	if (n = 3)
		printf("hehe\n");

	return 0;
}

当一个常量和一个变量相比较的时候,一般把常量放等号左边 

int main()
{
	int n = 5;
	if (3 == n)
		printf("hehe\n");

	return 0;
}

练习:

1.判断一个数是否为奇数。

int main()
{
	int n = 0;
	scanf("%d", &n);
	if (n % 2 == 1)
	{
		printf("是奇数\n");
	}
	else {
		printf("是偶数\n");
	}

	return 0;
}

2.输出1到100的奇数

int main()
{
	int i = 1;
	while (i <= 100)
	{
		//判断i是奇数的话,就打印i
		if (i % 2 == 1)
		{
			printf("%d ", i);
		}
		printf("%d", i);
		++i;
	}
	return 0;
}
int main()
{
	int i = 1;
	while (i <= 100)
	{
		printf("%d ", i);
		i += 2;
	}
	return 0;
}

第二种方法比较简便

2.switch语句

常用于多分支情况

如:输入1,就输出星期一

输入2,就输出星期二

输入3,就输出星期三

输入4,就输出星期四

输入5,就输出星期五

输入6,就输出星期六

输入7,就输出星期天

这种情况写成if...else if...else...语句太复杂了

可以用switch语句来写

switch(整形表达式)
{
    case 1:
        ...
    case 2:
        ....
}
int main()
{
	int day = 0;
	scanf("%d ", day);
	switch (day)
	{
	case 1://case这里只能用整型
		printf("星期一\n");
		break;//case决定的是入口,现在需要给他一个出口,即用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;
}
//周一到周五是工作日,周六日是周末
int main()
{
	int day = 0;
	scanf("%d ", day);
	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;
}

default语句

在上面的代码中,如果输入1到7以外的数字,系统仍不会报错,这不符合常规,所以我们给程序加上一个default,只要用户输入错误数字就会报错

int main()
{
	int day = 0;
	const int n = 1;
	scanf("%d ", day);
	switch (day)
	{
	default:
		printf("输入错误\n");
		break;
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("weekday\n");
	case 6:
	case 7:
		printf("weekend\n");
		break;//编程好习惯,在最后一个case后加上break
	}
	return 0;
}

练习:求m,n的值

int main()
{
	int n = 1;
	int m = 2;
	switch (n)
	{
	case 1:
		m++;//m = 3
	case 2:
		n++;//n = 2
	case 3:
		switch (n)//因为n = 2,直接进到case 2
		{//switch允许嵌套使用
		case 1:
			n++;
		case 2://直接进到这里
			m++;//m = 4
			n++;//n = 3
			break;//break只会跳出一层switch
		}
	case 4:
		m++;//m = 5
		break;
	default:
		break;
	}
	printf("m = %d, n = %d", m, n);//m = 5, n = 3
	return 0;
}

三. 循环语句

1.while 语句

格式:

while(表达式)

        循环语句;

//在屏幕上打印1到10
int main()
{
	int n = 1;
	while (n<=10)
	{
		printf("%d ", n);
        n++;
	}
	return 0;
}

break作用:终止循环

int main()
{
	int n = 1;
	while (n<=10)
	{
		if (n == 5)
			break;
		printf("%d ", n);
		n++;
	}
	return 0;
}

代码结果: 

我们可以看出,在n=5的时候,break直接跳出循环不再打印了

continue

int main()
{
	int n = 1;
	while (n<=10)
	{
		if (n == 5)
			continue;
		printf("%d ", n);
		n++;
	}
	return 0;
}

 代码结果:

可以看出,结果中数字后面的光标一直在闪,这表明程序进入死循环,为什么会进入死循环呢。

因为continue在其中的作用是跳过本次循环continue后面的代码,直接去判断while循环的判断部分。所以有一直重来的效果。

 小测试:这段代码会输出什么结果呢?

int main()
{
	int n = 1;
	while (n<=10)
	{
		n++;
		if (n == 5)
			continue;//continue直接跳过后面两句代码
		printf("%d ", n);
		
	}
	return 0;
}

这道题有两个要注意的点:

1.n = 1进来循环的时候值先被改写(n++)再打印

2.因为n++放在前面,所以这里的continue只是跳过了n = 5这次循环,后面的循环依旧能运行。

代码结果:

对比break和continue

break一出现,这个程序中的包含break的循环永久终止。

continue一出现,直接跳过这一层循环(一次只能跳一层),进入下一层循环,不影响后面的循环操作。

插播:

int main()
{
	int ch = getchar();//输入一个字符
	printf("%c\n", ch);
    putchar(ch);//输出字符
	return 0;
}

设计字符输入输出程序

int main()
{
	int ch = 0;
    //EOF- end of file 文件结束标志
    //在函数读取失败的时候返回EOF
    //scanf函数读取成功,返回的是读取到的数据的个数
    //读取失败返回EOF
    //getchar 读取成功返回字符的ASCII值
    //读取失败返回EOF
    //ctrl + z - 会让scanf或者getchar返回EOF
	while ((ch = getchar()) != EOF)
	{
		putchar(ch);
	}
	return 0;
}

 下面浅讲一下char

int main()
{
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);//password是数组,本身具有地址,所以不需要取地址
	printf("请确认密码(Y/N)");
	char input = 0;
	scanf("%c", &input);
	if ('Y' == input)
		printf("确认成功\n");
	else
		printf("确认失败\n");
	return 0;

这段代码输出结果不尽人意,如下

这是因为我们在使用getchar或者input的时候,输入密码后按了enter键,系统自动把我们的回车键当作\n输入到缓存区中,在确认密码那里系统帮我们把\n输进去了,所以自动“确认失败”。

 怎样去掉这个\n呢,最朴实的方法就是加上一行getchar()

修改后的代码:

	printf("请确认密码(Y/N)");
	char input = 0;
	scanf("%c", &input);
	input = getchar();//加上这一行
    if ('Y' == input)
		printf("确认成功\n");
	else
		printf("确认失败\n");
	return 0;

在一些情况下,清理一个\n是不够的,用户如果密码中包含空格这类字符,输入的空格也给塞到缓冲区中,那不就糟糕了吗

所以我们借鉴上面while ((ch = getchar()) != EOF)的写法,再写一个清除缓冲区的代码

修改后的代码如下:

int main()
{
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);//password是数组,本身具有地址,所以不需要取地址
	printf("请确认密码(Y/N)");
	char input = 0;
	scanf("%c", &input);
	while (getchar() != '\n')
	{
		;
	}
	input = getchar();
	if ('Y' == input)
		printf("确认成功\n");
	else
		printf("确认失败\n");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值