分支语句和循环语句

目录

前言

一、分支语句(选择结构)

(一)if语句

1、年龄

2、判断数字是否为奇数

3、输出1~100的奇数

 (二)switch语句

总结:

二、循环语句

(一)while循环

 打印1~10

总结:

(二)continue

总结:

接下来举几个关于循环的例子:

例一:

例二:猜数字游戏

总结代码:

(三)goto语句 

写一个关机程序


前言

分支语句和循环语句_第1张图片

 C语言有九种控制语句,可以分为三类:

1.条件判断语句,也叫分支语句:if语句、switch语句;

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

3.转向语句:break语句、goto语句、continue语句、return语句。

一、分支语句(选择结构)

(一)if语句

单分支

if(表达式)
    语句;

双分支

if(表达式)
    语句1;
else
    语句2;

多分支

if(表达式1)
    语句1;
else if (表达式2)
    语句2;
else
    语句3;

举个例子:

1、年龄

int main()
{
	int age = 0;
	scantf("%d", &age);
	//单分支
	//if (age >= 18)
	//	printf("成年\n")

	//双分支
	/*if (age >= 18)
		printf("成年\n");
	else
		printf("未成年\n");*/

	//多分支
	if (age <= 6)
		printf("儿童\n");
	else if (age > 6 && age <= 16)
		printf("少年\n");
	else if (age > 16 && age <= 30)
		printf("青年\n");
	else if (age > 30 && age <= 60)
		printf("壮年\n");
	else if (age > 60 && age <= 80)
		printf("老年\n");
	else
		printf("老寿星\n");

	return 0;
}

if语句可以嵌套使用

2、判断数字是否为奇数

//判断数字是否为奇数
int main()
{
	int num = 0;
	scanf("%d", &num);
	//判断是否为奇数
	if (num % 2 == 1)
		printf("奇数\n");
	else
		printf("偶数\n");

	return 0;
}

3、输出1~100的奇数

(1)循环先产生1~100的数字,

(2)判断产生的数字是不是奇数,

(3)是奇数打印

int main()
{
	int i = 1;
	while (i <= 100)
	{
		if (i % 2 == 1)
		{
			printf("%d", i);
		}
	i++;
	}
	return 0;
}

或者

int main()
{
	int i = 1;
	while (i <= 100)
	{
			printf("%d", i);
			i+=2;//i+2的意思
	}
	return 0;
}

 (二)switch语句

switch(整型表达式)

{

        语句项;

        case(整型常量表达式):

        语句;

        break;

}

int main()
{
	int day = 0;
	scanf("%d", &day);
	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;
    default:
        printf("选择错误\n");
	}
	return 0;
}

总结

一般来说,case 决定入口,break 决定出口,若输入的信息错误则会跳到default

只要逻辑恰当,case顺序可以调整;

default如果不在最后,应在后面添加break;

int main()
{
	int day = 0;
	scanf("%d", &day);
	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;
 default:
		printf("选择错误\n");
	}
	return 0;
}
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch(day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("休息日\n");
		break;
 default:
		printf("选择错误\n");
	}
	return 0;
}

两串代码效果相同,因此并不是每个case后面都需要break

二、循环语句

(一)while循环

while(表达式)

        循环语句;

//表达式为真,执行循环语句

分支语句和循环语句_第2张图片

 打印1~10

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

那while循环中break应该如何使用,举个例子

int main()
{
	int n = 1;
	while (n <= 10)
	{

		if (5==n)
		{
			break;
		}

		printf("%d", n);
		n++;
	}

	return 0;
}

分支语句和循环语句_第3张图片

总结:

break在while循环中的作用:

在循环中人只要遇到break,就停止后期的所有循环,直接终止循环。

因此,while循环中的break是用于永久终止循环的。

(二)continue

我们将上面代码中的break换成continue看看效果:

分支语句和循环语句_第4张图片

 此时,光标闪烁,代码等待,进入死循环

代码反复在while和continue之间运行,但对输出结果没有任何改变

总结:

continue用于终止本次循环,也就是本次continue后面的代码不会再执行,

而是直接跳到while语句的判断部分,进行下一次循环的入口判断。

接下来举几个关于循环的例子:

例一:

先介绍一个函数:getchar   putchar  

int main()
{
	char ch = 0;
	/*scanf("%c", &ch);
	printf("%c", ch);*/
	//scanf和printf用于各种类型,如:整型、字符、浮点型……
	//getchar putchar只用于字符

	ch = getchar();
	putchar(ch);

	return 0;
}

getchar输入字符,在输入缓冲区检查有无字符,没有字符,在键盘上输入字符,getchar从缓冲区中取一个字符A,while循环判断,不等于EOF输出;此时缓冲区中还有 \n ,getchar取出,判断,换行,等待输入……

分支语句和循环语句_第5张图片

putchar输出字符,读取成功返回字符的ASCII码值;读取失败返回EOF

分支语句和循环语句_第6张图片

 这里为什么错误呢?

scanf遇到 \n 甚至是空格 就不拿走了,剩下的\n只能到下面的getchar中,而\ n 不是 Y 就进入else,确认失败。

既然这样的话,我加入一个 getchar 拿走 \n 是不是就可以了?

但如果我输入了

 就又不行了。

于是,一鼓作气,加一个while循环,直到getchar拿到了'\n'才停止

int main()
{
	char password[20] = { 0 };
	int ch = 0;

	printf("请输入密码:_");
	scanf("%s", password);
	//这里的password是数组,数组名本来就是地址,因此不需要使用取地址符

	while(getchar()!='\n')
	{
		;
	}
	//清除缓冲区

	printf("请确认密码(Y/N)");
	ch = getchar();
	if (ch == 'Y')
		printf("确认成功\n");
	else
		printf("确认失败\n");
		
	return 0;
}

例二:猜数字游戏

1.程序会生成一个1~100之间的随机数

2.猜数字

        1>猜大了,程序告诉你猜大了,继续猜

        2>猜小了,程序告诉你猜小了,继续猜

        3>猜对了,程序告诉你:恭喜你,猜对了

3.可以反复玩

设置一个菜单,选择继续玩还是退出

希望游戏一开始就能打印菜单,说明游戏至少能进行一次,使用do while循环

void menu()//void表示这个函数不需要返回
{
	printf("************************\n");
	printf("******   1.play   ******\n");
	printf("******   0.exit   ******\n");
	printf("************************\n");
}

int main()
{
	int input = 0;
	do
	{
		menu();//打印菜单
		printf("请选择:__\n");
		scanf("%d", &input);//需要有一个数字输入决定玩还是不玩
		switch (input)//判断一下输入的数字
		{
		case 1://玩猜数字游戏
			printf("开始游戏\n");
			break;
		case 0://退出,不玩
			printf("退出游戏\n");
			break;
		default ://输入的数字错误
			printf("选择错误,重新选择\n");
			break;
		}

	} while (input);


	return 0;
}

此时,框架已初步完成;我们需要开始编写游戏部分

首先要生成随机数,介绍一个函数rand,rand函数是专门用来生成随机数的

rand函数返回的是0~RAND_MAX(32767)之间的一个随机数,它的头文件是#include

在这个时候,就有人兴致勃勃的去实践了,他就可能直接写:

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include

void menu()
{
	printf("************************\n");
	printf("******   1.play   ******\n");
	printf("******   0.exit   ******\n");
	printf("************************\n");
}

void game()
{
	//1.生成随机数,打印看看
    int ret=rand();
    printf("%d\n",ret);
	
}

int main()
{
	int input = 0;
	do
	{
		menu();//打印菜单
		printf("请选择:__\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1://玩猜数字游戏
			game();//game函数中是猜数字的整个路基逻辑,不需要返回
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default :
			printf("选择错误,重新选择\n");
			break;
		}

	} while (input);


	return 0;
}

运行就发现问题了,无论你运行几次,每次打印的数字都是一样的;

分支语句和循环语句_第7张图片

 这是因为:在使用rand函数时,还要使用另外一个函数srand去初始化随机数生成起点

于是,我就把代码改动一下

void game()
{
    srand(0)
    int ret=rand();
printf("%d\n",ret):

}

这次运行又不行:srand()中括号里是什么值,运行后就只对应一个数,要想不断随机出不同的数,括号里面就要是一个随机数,死循环。

换个思路,其实我们不一定要随机数,要一个变化的数就行,时间就是在不断变化的,这里引入时间戳的概念。Unix时间戳就是从1970年1月1日开始到现在所经过的秒数,不考虑闰秒。

C语言中time函数会返回时间戳。头文件是#include
 

但是,运行起来还是有弊端,当我运行速度很快时,他所显示的随机数就会很接近,甚至相同。其实,我们是不是只要调取一次srand就行,不需要频繁调取。所以,将srand函数放到main函数中。

有细心的人就发现了,我们这个数太大了呀,随机数不是只要0~100吗?

这里只要把生成的随机数%100+1就行了。无论再大的数,%100后都不可能等于100,+1后也不可能是0。

最后,编写猜数字环节,输入数字,存放“我”猜的数字,然后与 ret 进行比较,用if语句比较,while语句循环。

总结代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include

void menu()//void表示这个函数不需要返回
{
	printf("************************\n");
	printf("******   1.play   ******\n");
	printf("******   0.exit   ******\n");
	printf("************************\n");
}

void game()
{
	//1.生成随机数,rand函数是专门用来生成随机数的
	int ret = rand()%100+1;
	int num = 0;
		//printf("%d\n", ret);
	//2.猜数字
		while (1)
		{
			printf("请猜数字:》\n");
			scanf("%d", &num);
			if (num < ret)
			{
				printf("猜小了\n");
			}
			else if (num > ret)
			{
				printf("猜大了\n");
			}
			else
			{
				printf("恭喜你,猜对了!\n");
				break;
			}
				
		}

}

int main()
{
	srand(time(NULL));//此时time函数中传入空指针
	//srand函数只要在程序中调用一次就好了,不需要多次调用,因此放在mian函数中
	int input = 0;
	do
	{
		menu();//打印菜单
		printf("请选择:__\n");
		scanf("%d", &input);//需要有一个数字输入决定玩还是不玩
		switch (input)//判断一下输入的数字
		{
		case 1://玩猜数字游戏
			game();//game函数中是猜数字的整个路基逻辑,不需要返回
			break;
		case 0://退出,不玩
			printf("退出游戏\n");
			break;
		default ://输入的数字错误
			printf("选择错误,重新选择\n");
			break;
		}

	} while (input);


	return 0;
}

(三)goto语句 

int mian()
{
flag:
	printf("o_o\n");
	goto flag;
	return 0;
}

运行这个代码会不断的打印 o_o ,因为在同一个函数内部中,当代码运行到goto时,会跳转到flag,此处不断循环。

最常见的用法是在深度嵌套的函数中,goto就能直接跳出并结束程序。

写一个关机程序

1.程序执行起来就倒计时关机,倒计时一分钟

2.如果输入“快停下来啊!!!”就取消关机

这里需要用到两个命令:

shutdown -s -t 60    一分钟后关机

shutdown -a             取消关机

这里一定记得前面要空格

#include
#include
int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 60");
again:
	printf("系统将在一分钟内关机,如果输入:快停下来啊!!!将取消关机\n");
	scanf("%s", input);
	//判断
	if (strcmp(input, "快停下来啊!!!") == 0)
	{
		system("shutdown -a");
	}
	else
	{
		goto again;
	}

	return 0;
}

你可能感兴趣的:(学习生活,算法,c++,开发语言)