分支语句与循环语句——练习

目录

1.计算n的阶乘。

2.计算1!+2!+3!+.......+10!

3.在一个有序数组中查找具体某个数n。(二分查找)

4.编写代码。演示多个字符从两端移动,向中间汇聚。

Sleep函数的介绍:

system("cls")

5.编写代码实现,模拟用户登录情景,并且只能登录三次。

strcmp函数:

6.猜数字游戏的实现

实现用户选择

实现随机数

rand函数

srand函数

time函数 

实现游戏逻辑 

总代码 

 7.关机程序的实现

"shutdown -s -t" 

"shutdown -a"


1. 计算 n的阶乘。
2. 计算 1!+2!+3!+……+10!
3. 在一个有序数组中查找具体的某个数字n。(二分查找)
4. 编写代码,演示多个字符从两端移动,向中间汇聚。
5. 编写代码实现,模拟用户登录情景,并且只能登录三次。
(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。)
6.猜数字游戏
7.关机程序

1.计算n的阶乘。

#include<stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);//n这个数必须是个具体的数,所以我们必须输入一个具体的值
	int i= 0;
	int ret = 1;
		for (i = 1; i <= n; i++)
		{
			ret = ret * i;//产生n的阶乘。例如3的阶乘是6,只是一个数的阶乘
		}
		printf("%d", ret);
	return 0;
}

 

2.计算1!+2!+3!+.......+10!

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

解释:

内层循环:通过i的循环改变ret的值,从而实现1*2*3..的某个数的阶乘。

✔✔✔特别提醒:ret的值必须初始化为1,i的值也必须从1开始循环。

外层循环:通过j实现1~10的数进行内层循环算出阶乘,出内层循环实现相加。

✔✔✔关于*=  +=:ret=ret*i(ret*=i)   sum=sum+ret(sum+=ret)

提高效率:

#include<stdio.h>
int main()
{

	int i= 0;
	int ret = 1;
	int sum = 0;
		for (i = 1; i <= 10; i++)
		{
			ret = ret * i;
			sum = sum + ret;
		}
		printf("%d", sum);
	return 0;
}
//在前一个数的阶乘基础上乘上当前的数字,提高效率
//1!=1*1
//2!=1*1*2
//3!=1*1*2*3
//4!=1*1*2*3*4

3.在一个有序数组中查找具体某个数n。(二分查找)

第一种:遍历(有序无序均可,效率低)

//第一种方法——遍历
//有序数组
//数组下标
//效率低
#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 0;
	scanf("%d", &k);//输入要查找的值
	int i = 0;
	int flag = 0;//flag为假
	for (i = 0; i <= 9; i++)
	{
		if (arr[i] == k)
		{
			printf("找到了,下标为:%d\n", i);
			flag = 1;//找到变成真的
			break;   //找到就不用再循环了,在所有都遍历的情况上提高效率
		}
	}
	if (flag == 0)//遍历了全部还是没找到
		printf("没找到");
	return 0;
}

第二种:二分查找(折半查找,效率高,有序数组且不一定连续)

二分查找只用了4次就找到了这个我们需要的数字。√√√√√那我们写程序需要哪些变量???

寻找的值k

左下标left

右下标right

中间值下标mid=(left+right)/2

中间值arr【mid】和k比较——用分支语句来写一次二分查找

多次二分查找需要循环——while循环

如果小于k

left=mid+1,right不变,mid改变

如果大于k

right=mid-1,left不变,mid改变

如果等于k

找到了!!!flag==1

没找到           flag==0

//第二种
//折半查找——二分查找
//分清楚下标和数组数字
//效率高 有序数组 不一定连续
#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int size = sizeof(arr) / sizeof(arr[0]);//就算数组的元素的个数
	int k = 0;
	scanf("%d", &k);//输入要查找的值
	int flag = 0;
	int left = 0;
	int right = size-1;//设置左右下标
	//分支
	while (left <= right)
	{
		int mid = (left + right)/2;
		if (arr[mid] < k)
			left = mid + 1;
		else if (arr[mid] > k)
			right = mid - 1;
		else
		{
			printf("找到了,下标是%d\n",mid);
			flag = 1;//必须要设置flag
			break;
		}
    }//循环体只是一次二分查找
	if (flag == 0)//注意不是flag=0,赋值🆗
		printf("没找到\n");
	return 0;
}

关于计算数组中元素的个数

//数组中元素的个数的计算sizeof
#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("数组的空间大小:%d\n", sizeof(arr));//单位字节
	printf("数组中1个元素的大小:%d\n", sizeof(arr[7]));//单位字节
	printf("数组中有多少个元素:%d\n", sizeof(arr)/sizeof(arr[7]));//单位个
}

4.编写代码。演示多个字符从两端移动,向中间汇聚。

数组中元素的计算问题: 

//数组中元素的个数的计算sizeof
#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("数组的空间大小:%d\n", sizeof(arr));
	printf("数组中1个元素的大小:%d\n", sizeof(arr[7]));
	printf("数组中有多少个元素:%d\n", sizeof(arr)/sizeof(arr[7]));
}
//数组中元素的计算字符串sizeof和strlen
#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = "a,b,c";
	printf("数组中元素的个数:%d\n", sizeof(arr) / sizeof(arr[0]));
	printf("数组中最右元素的下标:%d\n", sizeof(arr) / sizeof(arr[0]) - 2);
	//-2指的是下标从0开始和减去"\0"
	printf("数组中元素的个数:%d\n", strlen(arr));
	//strlen是不计算"\0"的,需要包含头文件#include<string.h>
	printf("数组中最右元素的下标:%d\n", strlen(arr) - 1);
	//所以只要-1就是指的是下标从0开始
	return 0;
}

 编写代码:

//4. 编写代码,演示多个字符从两端移动,向中间汇聚。
 #include<stdio.h>
#include<windows.h>
int main()
{
	char arr1[] = "hello word!!" ;//无{}
	char arr2[] = "************" ;
	int left = 0;
	int right = sizeof(arr1) / sizeof(arr1[0]) - 2;
	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		/*arr1[left]=arr2[left];
		arr1[right]=arr2[right];*/
		printf("%s\n",arr2);
		Sleep(1000);
		system("cls");//清空屏幕
		left++;//变化循环
		right--;
	}
	printf("%s\n", arr2);
	return 0;
}

屏幕录制 2023-07-23 100119

Sleep函数的介绍:

概念:Sleep函数可以使计算机程序(进程,任务或线程)进入休眠,使其在一段时间处于非活跃状态。当函数设定的计时器到期或者接收到型号,程序发生中断都会导致程序运行。

语法:Sleep() ()里的是时间数字,单位为毫秒。1000毫秒就是1秒。

注意:需要使用时需要包含头文件<windows.h>

system("cls")

清除屏幕的内容。 

5.编写代码实现,模拟用户登录情景,并且只能登录三次。

(只允许输入三次密码,如果密码正确则提示登录成功;反之,则退出程序)

#include<stdio.h>
#include<string.h>
int main()
{
	int i = 0;
	char ch[20] = { 0 };
	int flag = 0;
	for(i = 1; i <= 3; i++)
	{
		printf("请输入密码:\n");
		scanf("%s", &ch);
		//if (ch == "123456")//两个字符串判断相等一定不能用“==”🆗?
		if(strcmp(ch,"123456") == 0)
		{
			printf("登录成功\n");
			flag = 1;
			break;
		}
		else
		{
			printf("密码错误\n");
		}
	}
	if(flag == 0)
	printf("退出程序\n");
	return 0;
}

不同写法: 

#include<stdio.h>
int main()
{
	int i = 0;
	char ch[20] = { 0 };
	int flag = 0;
	for (i = 0; i < 3; i++)//边界条件很重要
	{
		printf("请输入密码:\n");
		scanf("%s", &ch);
		if(strcmp(ch,"123456") == 0)
		{
			printf("登录成功\n");
			break;
		}
		else
		{
			printf("密码错误\n");
		}
	}
	if (i == 3)//关于“=”和“==”的区别也很重要
		printf("退出程序\n");
	return 0;
}

strcmp函数:

关于字符串之间不能用"==" ,所以我们引出一个函数strcmp。

strcmp函数是比较字符串大小的。(实质:比较不是内容大小,而是字符串的起始地址)

例如:(strmp(password ,"123456") == 0)

strcmp函数的返回值为0,则两个字符串相等。

                       返回值<0,则两个字符串关系<

                       返回值>0,则两个字符串关系>

strcmp函数包含头文件#include<stdio.h>

6.猜数字游戏的实现

实现用户选择

void menu()
{
	printf("***********************\n");
	printf("********Play.1*********\n");
	printf("********Over.0*********\n");
	printf("***********************\n");
}
void game()
{
	//实现游戏
}
#include<stdio.h>
int main()
{
	//实现选择
	int input = 0;
	do
	{
		printf("游戏选择如下:\n");
		menu();//设置一个游戏菜单函数
		printf("请玩家选择:\n");
		scanf("%d", &input);
		switch (input)
		{
		    case(1):
				printf("进入游戏\n");
				game();//实现游戏逻辑
				break;
			case(0):
				printf("游戏结束\n");
				break;
			default:
				printf("输入错误,请重新输入\n");
				break;
		}
	} while (input);
	//input=1或其他(只要是非0)都是表达式为真,进入循环
	//input为0 表达式为假,跳出循环
	return 0;
}

当然,除了switch语句还可以使用if else语句,大家可以动手试一试🙂🙂🙂🙂🙂

实现随机数

✔✔✔✔先介绍三个函数。

rand函数

rand函数返回值为int,参数不接受。

rand函数虽然要生成随机数,但是如果你测试就会发现生成的随机数基本都有规律和相同。

rand函数生成的是伪随机数。

rand函数生成的随机数的范围是:0~RAND_MAX(32767)。

rand函数在生成随机数之前,要使用srand函数设置随机数的随机数生成器。

✔✔✔我们就引入srand函数

srand函数

srand函数需要头文件  #include<stdlib.h>

srand函数返回值无,参数接受unsigned int类型

seed函数是随机数生成器的种子,种子不一样则生成的随机数rand也不一样。

(根据种子+算法=生成随机数rand)。

????这里我们陷入了一个问题,为了生成随机数我们又需要一个随机的种子。

✔✔✔我们就引入time函数来生成我们的种子

time函数 

time函数需要头文件#include<time.h>

time函数的返回值类型time_t (本质是long long 的整形)  参数接受类型为指针。

time函数的返回值是一个时间戳。

时间戳

时间戳简单来说就是时间和数字之间的转换。

时间:当前计算机的时间相较于计算机的起始时间之间的差值。

//生成随机数
#include<stdlib.h>
#include<time.h>
#include<stdio.h>
int main()
{
	srand((unsigned int)time(NULL));
	int ret = rand();
	printf("%d", ret);
	return 0;
}


//srand((unsigned int)time(NULL));
//time接受的参数是指针,放入一个空指针就🆗了(相当于0)
// srand需要的返回值值unsigned int 类型  void srand (unsigned int seed);
// 这里我们需要强制转换把time_t转换称unsigned int
void game()
{
	
	int ret = rand()%100+1;
//取模得到余数1~99之间+1就是1~100之间的随机数
}

实现游戏逻辑 

void game()//游戏逻辑的实现
{
	
	int ret = rand()%100+1;
	int guess = 0;
	
	while (1)//如果不跳出去,永远死循环循环
	{
		printf("请输入你猜测的数字:\n");
		scanf("%d", &guess);
		if (guess < ret)
			printf("猜小了\n");
		else if (guess > ret)
			printf("猜大了\n");
		else
		{
			printf("恭喜你猜中了!\n");
			break;
		}
	}
}

总代码 

#include<stdlib.h>
#include<time.h>
#include<stdio.h>
void menu()
{
	printf("***********************\n");
	printf("********Play.1*********\n");
	printf("********Over.0*********\n");
	printf("***********************\n");
}
void game()//游戏逻辑的实现
{
	
	int ret = rand()%100+1;//取模得到余数1~99之间+1就是1~100之间的随机数
	int guess = 0;
	
	while (1)//如果不跳出去,永远死循环循环
	{
		printf("请输入你猜测的数字:\n");
		scanf("%d", &guess);
		if (guess < ret)
			printf("猜小了\n");
		else if (guess > ret)
			printf("猜大了\n");
		else
		{
			printf("恭喜你猜中了!\n");
			break;
		}
	}
}
#include<stdio.h>
int main()
{
	//实现选择
	int input = 0;
	srand((unsigned int)time(NULL));
	//srand不需要频繁调用,只用调用一次即可
	do
	{
		printf("游戏选择如下:\n");
		menu();//设置一个游戏菜单函数
		printf("请玩家选择:\n");
		scanf("%d", &input);
		switch (input)
		{
		    case(1):
				printf("进入游戏\n");
				game();//实现游戏逻辑
				break;
			case(0):
				printf("游戏结束\n");
				break;
			default:
				printf("输入错误,请重新输入\n");
				break;
		}
	} while (input);
	//input=1或其他(只要是非0)都是表达式为真,进入循环
	//input为0 表达式为假,跳出循环
	return 0;
}

 

 7.关机程序的实现

#include<stdio.h>
int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 180");//开始倒计时关机
	//命令是关机
again:
	printf("开始关机倒计时,请输入:我是猪,取消关机\n");
	scanf("%s", &input);
	if (strcmp(input, "我是猪") == 0)
	{
		system("shutdown -a");
		//取消关机的命令
		printf("已经取消关机\n");
	}
	else
	{
		goto again;
	}
	return 0;
}
#include<stdio.h>
int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 180");//开始倒计时关机
	//命令是关机
    while (1)
	{
		printf("开始关机倒计时,请输入:我是猪,取消关机\n");
		scanf("%s", &input);
		if (strcmp(input, "我是猪") == 0)
		{
			system("shutdown -a");
			//取消关机的命令
			printf("已经取消关机\n");
			break;
		}
	}
	return 0;
}

"shutdown -s -t" 

关机命令,t的单位秒

"shutdown -a"

取消关机

 以上就是关于分支与循环的练习,大家可以实操!

✔✔✔✔感谢大家的阅读,欢迎大家指正不错和错误

代码---------------→【gitee:https://gitee.com/TSQXG

联系---------------→【邮箱:2784139418@qq.com】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐唐思

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值