你真的掌握分支与循环了吗,下面一些简单有趣的c语言程序
好玩的关机程序,和猜数字游戏。
分支与循环练习
一.素数
二.使用代码关闭室友关机程序
三.猜数字游戏
巩固所学的分支与循环的知识,下面是有意思的程序
打印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~100的随机数
- 玩家猜数字,猜数字的过程中,根据猜测数据的⼤⼩给出⼤了或⼩了的反馈,直到猜对,游戏结束
- 可以玩多次
生成随机数
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生成随机值等一些知识,如果完成了这个小游戏,我相信你肯定对分支与循环已经了如指掌了
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)