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 = 1for (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;
}

如有错误,欢迎指出