一.素数

二.使用代码关闭室友关机程序

三.猜数字游戏

巩固所学的分支与循环的知识,下面是有意思的程序

打印100-200之间的素数,并求出有多少个

素数:即质数,除了1和自己之外,再没有其他的约数,则该数据为素数
第一种方法:试除法


#include<stdio.h>
int main()
{
	int i = 0;
	int count = 0;
	// 外层循环用来获取100~200之间的所有数据,100肯定不是素数,因此i从101开始
	for (i = 101; i <= 200; i++)
	{
		int flag = 1;//用来最终判断是不是素数
		//判断i是否为素数:用[2, i)之间的每个数据去被i除,只要有一个可以被整除,则不是素数
		int j = 0;
		for (j = 2; j < i; j++)
		{
			if (i % j == 0)
			{
				flag = 0;//如果存在这样的j,那i不是素数,break,跳出内层for循环,进行下一次外层for循环
				break;
			}
		}
		if (flag == 1)
		{
			count++;//计算总共有多少个
			printf("%d ", i);
		}
	}

	printf("\ncount = %d\n", count);
	return 0;
}
//方法二:相比较方法一,代码更加优化了。
//我们仔细想想偶数好像不可能为素数,因为他肯定有其他因子除了1和它本身之外
//如果i能够被[2, sqrt(i)]之间的任意数据整除,则i不是素数
//原因:如果 i 能被 2 ~ i-1 之间任一整数整除,其二个因子必定有一个小于或等于sqrt(i),另一个大于或等于 sqrt(i)。假设i=a*b   那么a和b肯定小于或等于i的开根号。
#include<stdio.h>
#include<math.h>
int main()
{
	int i = 0;
	int count = 0;
	for (i = 101; i <= 200; i+=2)//偶数之间不进行判断
	{
		int flag = 1;
		int j = 0;
		for (j = 2; j <= sqrt(i); j++)只判断[2,sqrt(i)]的值
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if (flag == 1)
		{
			count++;
			printf("%d ", i);
		}
	}

	printf("\ncount = %d\n", count);
	return 0;
}

在c语言中提供了一个库函数用来求一个数的平方根就是sqrt( ),使用时要包含头文件#include<math.h>,这个头文件里面有很多数学相关的库函数,自己可以多了解,链接已给大家了。

关机程序

代码运行起来后60s后关机,输入“我是猪”,就取消关机。
关机和取消关机用到system()及其头文件<stdlib.h>
也用到了strcmp()比较两个字符串的大小,及其头文件<string.h>

#include<stdio.h>
#include<string.h>//strcmp的头文件
#include<stdlib.h>//system的头文件
//关机小程序goto语句可以被循环代替,但有时goto语句更好用
int main()
{
	char a[20] = { 0 };
	system("shutdown -s -t 60");//system 函数:执行系统命令,开始关机
	while (1)//死循环知道输入我是猪或者关机才结束
	{
		printf("请输入”我是猪“,否则60秒后关机\n");
		scanf("%s", a);//数组名就是地址,所以不用取地址&符号
		if (strcmp(a, "我是猪") == 0)//比较两个字符串是否相等用strcmp不能用==
		{
			system("shutdown -a");//取消关机
			break;//输入正确会跳出循环
		}
	}
	return 0;
}
//当然我们也可以使用goto语句代替while循环
int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 60");//60s关机
again:
	printf("请输入”我是猪“,否则60秒后关机\n");
	scanf("%s", input);//数组名是地址,不用取地址符号
	if (strcmp(input, "我是猪") == 0)//比较两个字符串是否相等用strcmp不能直接==
	{
		system("shutdown -a");//取消关机
	}
	else
	{
		goto again;//goto语句
	}
	return 0;
}

在这里插入图片描述

下面是运行时的场景
在这里插入图片描述
在这里插入图片描述

猜数字游戏

游戏要求:

  1. 电脑⾃动⽣成1~100的随机数
  2. 玩家猜数字,猜数字的过程中,根据猜测数据的⼤⼩给出⼤了或⼩了的反馈,直到猜对,游戏结束
  3. 可以玩多次
生成随机数
1rand

rand用于生成随机数,它的头文件为<stdlib.h>

  int rand (void);

C语⾔提供了⼀个函数叫rand,这函数是可以⽣成随机数的,函数原型如下所⽰:
rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的⼤⼩是依赖编译器上实现的,⼤部分编译器上是32767
那我们来试一试这个函数

#include<stdio.h>
#include<stdlib.h>
int main()
{
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	return 0;
}

第一次运行
在这里插入图片描述
第二次运行
在这里插入图片描述
结果两次结果一样,这也不符合我们随机数的要求啊,所以这被称为伪随机数加粗样式rand数是对⼀个叫"种⼦"的基准值进⾏运算⽣成的随机数,之所以一样是因为其“种子”为1,如果想要变换,就要改变种子**的值

2 srand

C语⾔中⼜提供了⼀个函数叫srand,⽤来初始化随机数的⽣成器的

  void srand (unsigned int seed);

在这里插入图片描述
可以发现这时候的随机值的却变了,但我们也不能每次都输入吧

3 time

因为时间时刻在发⽣变化的,我们可以把时间当作“种子” c语言中有time函数来表示时间

 time_t time (time_t* timer); 

time函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的
差值,单位是秒.,因为time需要接受一个指针,如果timer是NULL(空指针),就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳
time函数的头文件是 <time.h>

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
    //srand接受的是unsigned int类型而time返回的是int类型,所以要进行强制类型转换
	srand((unsigned int)time(NULL));
	//生成1-100之间的数字就rand%100的值是0-99在家上1就行了
	printf("%d\n", rand() % 100 + 1);
	printf("%d\n", rand() % 100 + 1);
	printf("%d\n", rand() % 100 + 1);
	printf("%d\n", rand() % 100 + 1);
	printf("%d\n", rand() % 100 + 1);
	return 0;
}

在这里插入图片描述
在这里插入图片描述
明显我们随机值的创建已经完成了,下面是完整代码展示

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("**********************\n");
	printf("********1 play********\n");
	printf("********0 exit********\n");
	printf("**********************\n");
}
void game()
{
	//生成随机数用到rand 但主函数要调用srand让其生成随机值固定(一次游戏内)
	int ret = rand() % 100 + 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("猜对了,是%d\n", ret);
			break;
		}
	}
}
int main()
{
	srand((unsigned int)time(NULL));//强制类型转化,这里给time空指针NULL
	int input = 0;
	do
	{
		menu();//打印小菜单,菜单是简单函数
		printf("请选择 : ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);//这样可以玩多次,除非自己输入0离开游戏
	return 0;
}


//那我们可以限制五次输入,如果五次输入机会都没猜对,那就游戏失败
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("**********************\n");
	printf("********1 play********\n");
	printf("********0 exit********\n");
	printf("**********************\n");
}
void game()
{
	//先生成随机数用到rand 但主函数要调用srand让其生成随机值固定(一次游戏内)
	int ret = rand() % 100 + 1;//生成1-100之间的数
	int guess = 0;
    int count = 5;//限制五次猜数机会
	while (count)
	{
		printf("你还有%d次机会\n", count);
		printf("请输入要猜的数字\n");
		scanf("%d", &guess);
		if (guess > ret)
		{
			printf("猜大了\n");
		}
		else if (guess < ret)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("猜对了,是%d\n", ret);
			break;
		}
		count--;
	}
	if (count == 0)
	{
		printf("次数用完了\n");
		printf("正确数字为%d\n",ret);
	}

}
int main()
{
	srand((unsigned int)time(NULL));//强制类型转化,这里给time空指针NULL
	int input = 0;
	do
	{
		menu();//打印小菜单
		printf("请选择 : ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);//这样可以玩多次
	return 0;
}

无限机会猜数
在这里插入图片描述
限制猜数次数
在这里插入图片描述
这个猜数字游戏结合了所学的switch do-while if-else复合语句等等也涉及了rand生成随机值等一些知识,如果完成了这个小游戏,我相信你肯定对分支与循环已经了如指掌了
在这里插入图片描述

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐