目录
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】