zl程序教程

您现在的位置是:首页 >  前端

当前栏目

分支与循环语句 - 练习题

循环 语句 分支 练习题
2023-09-27 14:21:00 时间

目录

一、分支语句

1. 判断一个数是否为奇数

2. 输出1-100之间的奇数

法1:遍历1-100所有的数字,判断是否为奇数,再输出

法2:奇数从1开始,等差为2,所以循环+2

二、循环语句

1. 计算 n的阶乘。

2. 计算 1!+2!+3!+……+10!

法1:算出每个数阶乘,然后相加

法2:优化,n!=(n-1)!*n

​编辑

3. 在一个有序数组中查找具体的某个数字n。(讲解二分查找)

4. 编写代码,演示多个字符从两端移动,向中间汇聚。

5. 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则 提示登录成,如果三次均输入错误,则退出程序。

三、综合题(猜数字游戏)


一、分支语句

1. 判断一个数是否为奇数

     if (n % 2 == 1)
    {
        printf("奇数\n");
    }

2. 输出1-100之间的奇数

法1:遍历1-100所有的数字,判断是否为奇数,再输出

int main()
{
int i = 0;
	while (i <= 100)
	{
		if (i % 2 == 1)
		{
			printf("%d ", i);
		}
		i++;
	}
return 0;
}

法2:奇数从1开始,等差为2,所以循环+2

这个循环只需要循环50次,而上面的就要100次

int main()
{
//这个循环只需要循环50次,而上面的就要100次
    int i = 1;
    while (i <= 100)
    {
        printf("%d ", i);
        i=i + 2;
    }

return 0;
}

二、循环语句

1. 计算 n的阶乘。

//n的阶乘
//5! = 5*4*3*2*1
//5! = 1*2*3*4*5
//1~5的数字 累积相乘

 

int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = 1;
	int i = 1;

	for (i = 1; i <=n; i++)//计算n的阶乘
	{
		ret *= i;
	}

	printf("%d\n", ret);

	return 0;
}

2. 计算 1!+2!+3!+……+10!

法1:算出每个数阶乘,然后相加

int main()
{
	int n = 0;
	int ret = 1;
	int i = 1;
	int sum = 0;

	//1!+2!+3!= 1+2+6 = 9
	for (n = 1; n <= 3; n++)//循环1-3
	{
		ret = 1;
		for (i = 1; i <= n; i++)//对每个数字求阶乘
		{
			ret *= i;
		}
		//将每个数的阶乘加起来
		sum += ret;
	}
	
	printf("%d\n", sum);

	return 0;
}

法2:优化,n!=(n-1)!*n

这样每次算完前一个数的阶乘,就可以直接乘了,不用从1再开始乘一遍,便捷


int main()
{
	int n = 0;
	int ret = 1;
	int i = 1;
	int sum = 0;

	//1!+2!+3!= 1+2+6 = 9
	for (n = 1; n <= 3; n++)//循环1-3
	{
		ret *= n;
		sum += ret;
	}

	printf("%d\n", sum);

	return 0;
}

3. 在一个有序数组中查找具体的某个数字n。(讲解二分查找)

1)二分法的的思想:想想现在有只笔(7块),告诉我10块以内,那么范围就出来了0-10块,然后我直接从中间开始猜,5块?不是,小了(现在的范围6-10)。
我继续猜8块?不是,高了(现在范围6-7)。再猜6块?不是,小了(现在就只有7了)。最后猜7块?对了!!
这样只用猜4次就出结果了,而不是从1,2,3这样开始猜,便捷了很多。

2)二分法的好处是:不用遍历数组,省去了一个一个查找的繁琐;二分法每次查找可以砍掉一半的范围,便捷很多;
3)折半法的前提是:必须是有序的数组,否则这样查找就无意义了

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 7;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz - 1;
	int count = 0;

	int flag = 0;
	while (left<=right)
	{
		count++;
		//这样求mid的会有个问题,如果left和right都特别大,他俩的和超过了整型的最大值,越界了,会丢失某些位,再除以2就会有误差
		//int mid = (left + right) / 2;
		

		//这个方式就会好一些,先求出最右值与最左值的差,那么它的一半加上最左值就是,两者的平均值(mid)
		int mid = left + (right - left) / 2;
		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else
		{
			printf("找到了!!下标为%d,找了%d次\n", mid,count);
			flag = 1;
			break;
		}
		
	}
	if(flag==0)
	{
		printf("找不到\n");
	}
	return 0;
}

4. 编写代码,演示多个字符从两端移动,向中间汇聚。

编写代码,演示多个字符从两端移动,向中间汇聚
welcome to Ameris's world!
 
**************************
w************************!
we**********************d!
...
welcome to Ameris's world!

#include<string.h>
#include<Windows.h>
int main()
{
	char arr1[] = "welcome to Ameris's world!";
	char arr2[] = "**************************";
	int left = 0;
	int right = strlen(arr1) - 1;
	
	while (left <= right)
	{
		//arr1的元素替换arr2的元素
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);

		//windows系统命令
		Sleep(1000);//休眠1秒,1000ms=1s
		system("cls");//清屏(只在一行显示变化)

		left++;
		right--;
	}
	printf("%s\n", arr2);

	return 0;
}

代码效果展示(演示多个字符从两端移动,向中间汇聚)

5. 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则 提示登录成,如果三次均输入错误,则退出程序。

比较密码这种字符串需要用strcmp()函数
int main()
{
	int i = 0;
	char psw[] = { 0 };
	int flag = 0;

	for (i = 0; i < 3; i++)
	{
		printf("请输入密码:>");
		scanf("%s", psw);

		if (strcmp(psw, "123456") == 0)//比较密码这种字符串需要用strcmp()
		{
			flag = 1;
			printf("密码正确\n");
			break;
		}
		else
		{
			printf("密码错误\n");
		}
	}
	if (flag == 0)
	{
		printf("三次密码均错误,退出程序!\n");
	}
}

三、综合题(猜数字游戏)

void menu()
{
	printf("***************************\n");
	printf("*********  1.play  ********\n");
	printf("*********  0.exit  ********\n");
	printf("***************************\n");
}

#include<stdlib.h>
#include<time.h>
void game()
{
	//1.生成随机数
	// 库函数,rand()会返回一个0-32767之间的随机数,在使用rand之前要调用srand()
	
	int ret = rand()%100+1;//因为随机数太大了,不在1-100里,所以模100+1,0-99+1-->1-100
	//printf("%d", ret);
	//2.猜数字
	int guess = 0;
	while (1)
	{
		printf("请猜数字:>");
		scanf("%d", &guess);
		if (guess < ret)
		{
			printf("> > 猜小了~~\n");
		}
		else if (guess > ret)
		{
			printf("> >猜大了哦~\n");
		}
		else
		{
			printf("> >真棒!一下子就被你猜到了呢~\n");
			break;
		}
	}
}

int main()
{
	int input = 0;
	srand((unsigned)time(NULL));//time()函数返回一个时间戳//需要调用一次就够了,放在主函数里,不用放在game()里
	do 
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("*****   开始游戏  *****\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:printf("选择错误!!!\n");
		}
	} while (input);
	return 0;
}