C语言 分支与循环经典例题(适用初学者)
C语言 分支与循环经典例题(致力于初学者的理解与巩固)
1.计算n的阶乘
首先我们看到这个题目,从数学的角度分析
例如:5!=1×2×3×4×5=120
会出现1到5这5个顺序数字,故我们不可避免的想到循环
故
#include <stdio.h>
int main()
{
//n的阶乘
int i, n;
scanf("%d", &n);
int ret = 1;//ret是阶乘的最终得数,因为1×任何数=任何数
for (i = 1; i <= n; i++)
{
ret = ret * i;
}
printf("%d的阶乘为:%d",n , ret);
return 0;
}
2.计算 1!+2!+3!+……+10!
拿下刚刚的开胃小菜后,再来看这题
是阶乘的相加
我们已经会算n的阶乘
那如何计算有顺序阶乘的相加呢
上题中的n是几就可以计算谁的阶乘
则我们可以在嵌套一个循环,n当循环变量
int main()
{
int i, n;
int sum = 0;
int ret = 1;
for (n = 1; n <= 5; n++)
{
for (i = 1; i <= n; i++)
{
ret = ret * i;
}
sum = sum + ret;//for循环嵌套中要注意表达式的位置噢,万万不可搞错循环体
}
printf("%d",sum);
return 0;
}
如此一来
我们就大功告成
——————————————————————————————————————————————————————————————————————————————————————————
然而当运行如上代码时
会发现结果不对
进行调试(摁F10,进调试中的监视,输入ret与sum进行查看)
,找到原因是ret在每一次进入第二个for中没有变为1,导致出现数据异常高
则我们需要再第一个for循环中增加ret=1;
修改后得到
int main()
{
int i, n;
int sum = 0;
int ret = 1;
for (n = 1; n <= 5; n++)
{
ret = 1;
for (i = 1; i <= n; i++)
{
ret = ret * i;
}
sum = sum + ret;//for循环嵌套中要注意表达式的位置噢,万万不可搞错循环体
}
printf("%d",sum);
return 0;
}
即可得到正确的答案
3.在一个有序数组中查找具体的某个数字n的下标。(二分查找)
注意:是有序数组!!!!!
首先我们要了解基本原理,关于二分查找相信很多人还没接触过,先来简单了解一下
根据二分中的2可以简单想象,这是从中间开始查找,一次查找可以排除一半的数据,查找进行的运算比较简练
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int left = 0;
int right = (sizeof(arr) / sizeof(arr[0]))-1;//数组下标从0开始
int input;//你要查找的数字
int flag = 0;//一个标志,用来判断是否找到数字
scanf("%d", &input);
while (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid] < input)
{
left = mid+1;
}
else if (arr[mid] > input)
{
right = mid-1;
}
else
{
printf("congratulations,下标是%d\n", mid);
break;
int flag = 1;
}
}
if (flag == 0)
{
printf("找不到");
}
return 0;
}
4.猜数字小游戏
重头戏 重头戏 重头戏 重要的事情说三遍
有了以上的基础,相信我们已经可以写出简单的小游戏
既然写小游戏,肯定要有设计思路
设计思路
首先需要创建菜单进行选择,选择进入游戏之后需要一个随机数与我们输入的数进行比较。
如此我们分为3个模块进行设计:菜单,随机数,比较。
菜单
菜单的设计无需复杂操作,要知道,大道至简
故设计一个函数
到这相信小白们又矒住了,该如何继续写呢
已知我们接下来要选择数字进行相应的操作
那我们可以写一个分支语句,使1与0分别对应相应程序。
如此一来,我们只要写出函数game基本就完成小游戏了。
但在这之前,要完善一下menu与switch的连接,同时改善一下switch
已知玩家输入时不能只输入一次,有时会输错,有时想继续玩
则需要一个循环解决,do while可完美的解决问题
void menu()
{
printf("********************\n");
printf("******1.play ******\n");
printf("********************\n");
printf("******0.exit ******\n");
printf("********************\n");
}
void game()
{
}
int main()
{
int input;
do
{
menu();
scanf("%d",&input);
switch (input)
{
case 1:
game();
break;//switch中的break用来跳出switch
case 0:
printf("您已退出游戏\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);//input为0时,直接跳出循环
return 0;
}
如此便可以开始game函数的编写
game()的设计
既然是猜数字游戏,必然离不开随机数
随机数的生成(链接)
看完链接的内容,相信大家有所了解了,实在不会也没关系,可以先记住怎么用,后期会展开讲解
下图代码是随机数生成核心
srand((unsigned)time(NULL));//strsnd理解为种子,rand从中调用种子
int ret=rand()%100+1;//这里我们选用随机数范围是1到100,模100是因为任何数模100结果为0到99,故+1
最后我们只差一个判断就将猜数字大功告成
int guess;
while (1)
{
printf("输入猜的数字\n");
scanf("%d", &guess);
if (guess > ret)
{
printf("猜大了\n");
}
else if (guess < ret)
{
printf("猜小了\n");
}
else
{
printf("猜对了\n");
break;
}
}
}
完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("********************\n");
printf("******1.play ******\n");
printf("********************\n");
printf("******0.exit ******\n");
printf("********************\n");
}
void game()
{
//1.设置随机数;
int ret=rand()%100+1;//利用随机数种子创建1到100的随机数,因为任何数模100结果为0到99.
//2.进行比较;
int guess;
while (1)
{
printf("输入猜的数字\n");
scanf("%d", &guess);
if (guess > ret)
{
printf("猜大了\n");
}
else if (guess < ret)
{
printf("猜小了\n");
}
else
{
printf("猜对了\n");
break;
}
}
}
int main()
{
srand((unsigned)time(NULL));//随机数种子,strand在主函数中是语法规则哦,不用过于深究
//猜数字
int input;//不能设置在循环内部,否则为局部变量,while出现未定义标识符
do
{
menu();//打印菜单
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("您已退出游戏\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
return 0;
}
如有错误,欢迎指出