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秒。
注意:需要使用时需要包含头文件
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
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
srand函数返回值无,参数接受unsigned int类型
seed函数是随机数生成器的种子,种子不一样则生成的随机数rand也不一样。
(根据种子+算法=生成随机数rand)。
????这里我们陷入了一个问题,为了生成随机数我们又需要一个随机的种子。
✔✔✔我们就引入time函数来生成我们的种子
time函数
time函数需要头文件#include
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】