因为个人原因,长时间没有更新博客,从今天开始,我将继续为大家更新C以及后面的知识。
接着上一次的博客,上一次的博客我们讲解了分支和循环语句的知识点,趁热打铁,我们更新几个我在学习过程中的相关题目,供大家一起学习!!!
1. 计算 n的阶乘。
思想:
1.形成1-n的数字
2.可以简化n的阶乘
例如:2!= 1!*2 3!= 2!*3…..n! = (n-1)!*n 其实我们只需要把每次生成的数乘以前一个数的阶乘即可(后期学过函数之后也可以采用递归的方法来写,这里我们只采用迭代的方法来写)
int main()
{
int n = 0;
scanf("%d", &n);
int ret = 1;//注意这里不能是0
//生成1-n的数字
int i = 0;
for (i = 1; i <= n; i++)
{
ret = ret * i;
}
printf("%d\n", ret);
return 0;
}
我们输入5可知5!=120。
2.
计算
1!+2!+3!+……+10!思想:这一题只是在第一题的基础上扩充了一下,我们只需要再定义一个sum变量,把每一次算出的阶乘加在sum上即可
int main()
{
int ret = 1;
int sum = 0;
//生成1-10的数字
int i = 0;
for (i = 1; i <= 10; i++)
{
ret = ret * i;
sum = sum + ret;
}
printf("%d\n", sum);
return 0;
}
读者可自行设置变量来验证代码的逻辑性是否正确!
3.
在一个有序数组中查找具体的某个数字
n
。(讲解二分查找)思想:这个题目的主要思想就是二分查找,也就是常说的折半查找;首先我们需要定义一个left变量指向这个有序数组的第一个元素,定义一个right变量指向有序数组的最后一个元素(其中right变量我们可以采用sizeof的运算符求得,即right=sizeof(arr)/sizeof(arr[0])-1,再定义一个mid变量指向这个数组的中间元素,
为防止mid变量越界,我们可以令mid=left+(right-left)/2;若查找的元素比mid指向的元素大则left=mid+1,若查找的元素比mid指向的元素小则right=mid-1,若相等则查找成功,每次查找可以排除一半的元素,其时间复杂度为logn,当left>right时,查找结束,此时若还没有查找到,则查找失败!
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//定义一个整型数组
int k = 7;//若查找的元素时7
int sz = sizeof(arr) / sizeof(arr[0]);//计算整型数组的元素个数
int left = 0;
int right = sz - 1;
//查找
while (left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid] > k)
{
right = mid - 1;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
printf("找到了,下标为:%d\n", mid);
break;//查找成功则跳出循环
}
}
if (left > right)
{
printf("查找失败\n");
}
return 0;
}
注意:
1.mid变量一定要定义再while循环内部,因为每一次查找mid都会发生改变
2.求整型数组的长度以后都会采用sizeof(arr)/sizeof(arr[0])
3.为防止mid变量越界,我们一般采用mid = left+(right-mid)/2 ,读者可自行画图理解
4.
编写代码,演示多个字符从两端移动,向中间汇聚。思想:定义两个数组,再定义两个变量,一个指向数组的第一个元素,另一个指向数组的最后一个元素(同上题思想一样),每次把一个数组中的一个元素赋值给另外一个数组,然后令left++,right–,当left>right时,说明操作完成,退出循环#include <string.h> #include <windows.h> int main() { char arr1[] = "hello world!!!"; char arr2[] = "##############"; int sz = strlen(arr1);//求数组的长度 int left = 0; int right = sz - 1; //交换 while (left <= right) { system("cls");//清屏 arr2[left] = arr1[left]; arr2[right] = arr1[right]; left++; right--; printf("%s\n", arr2); Sleep(500);//停留500ms } return 0; }
因为每一次printf在循环内部,且每一次循环都会清屏,所以是一个动态过程,大家在编译的时候可以自己看见!
注意:
1.求字符数组的长度有两种方法:第一种是上一题利用sizeof求解,第二种就是这里写的利用strlen,需要调用库函数string.h
2.这里的system(“cls”)是清屏函数,Sleep(500)是为了让打印结果在屏幕中停留,停留的时间自己定义,单位是毫秒,需要调用库函数windows.h
5.
编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则 提示登录成,如果三次均输入错误,则退出程序。思想:利用循环进行模拟登录,循环三次,若三次内密码正确则break跳出循环提示登录成功,否则登陆失败#include <string.h> int main() { char password[20] = { 0 };//假设密码是abcdef printf("请登录\n"); int i = 0;//记录登录次数 while (i < 3) { printf("请输入密码:"); scanf("%s", password); if (strcmp(password, "abcdef") == 0) { printf("登录成功\n"); break; } else { printf("密码输入错误,请重新输入\n"); i++; } } if (i == 3) { printf("三次密码输入错误,退出程序\n"); } return 0; }
登录成功:
登录失败:
注意:
比较字符串是否相等时,需要strcmp函数,相等则结果为0,需要调用库函数string.h
5.猜数字游戏实现
思想:
利用srand函数生成1-100的数字,进行猜数字,猜数字的逻辑:若所猜数字大于随机生成的数字则提示猜大了,若小于随机生成的数字则提示猜小了,否则猜成功
#include <stdlib.h>
#include <time.h>
//打印游戏菜单界面
void menu()
{
printf("************************\n");
printf("***** 猜数字游戏 *****\n");
printf("***** 1.play *****\n");
printf("***** 0.exit *****\n");
printf("************************\n");
}
//打印游戏菜单界面
void game()
{
int ret = rand() % 100 + 1;
int k = 0;
printf("猜数字\n");
while (1)
{
printf("请输入:");
scanf("%d", &k);
if (k < ret)
{
printf("猜小了\n");
}
else if (k > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
srand((unsigned int)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;
}
注意:
srand函数用来定义生成随机数的起点,这里采用的是时间戳,每一次游戏时间起点只需定义一次,所以srand函数定义在主函数一开始即可
关于循环和分支语句的题目就讲到这里,掌握这些题目该章节你的水平将有显著提升!
加油,感谢三连!!!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/89470.html