关于循环语句的练习

1.计算n的阶乘

代码如下:

int main()
{
	
		int n = 0;
		int i = 1;
		int ret = 1;
		printf("请输入n:");
		scanf_s("%d", &n);

		for (i = 1;i <= n;i++)
		{
			ret = i * ret;

		}
		printf("%d\n", ret);
		return 0;
}

例如当n=10时,输出结果如下所示:

2.计算1!+2!+....+n!

代码如下:

int main()
{
	
		int n = 0;
		int i = 1;
		int ret = 1;
		int sum = 0;
		printf("请输入n:");
		scanf_s("%d", &n);

		for (i = 1;i <= n;i++)
		{
			ret = i * ret;
			sum = sum + ret;

		}
		printf("%d\n", sum);
		return 0;

当n=5时,1+2+6+24+120=153,如下所示的结果正确。 

 

 3.在一个有序数组中查找具体的某个数字n。

方法一:遍历整个数组

代码如下:

int main()
{
	int arr[] = { 1,3,5,7,9,10,14,16 };
	int n = 0;
	printf("请输入n:");
	scanf_s("%d", &n);
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;

	for (i = 0;i < sz;i++)
	{
		if (arr[i] == n)
		{
			printf("找到了,数组下标是:%d\n", i);
			break;
		}
	}
	if (i == sz)
	{
		printf("没有找到");
	}

	return 0;
}

 例如当输入n=7时,代码运行结果如下:

 方法2:二分法查找

二分法也称为二分查找,是一种在有序数组或有序列表中查找特定元素的算法。它的基本思想是:首先将数组(或列表)按照升序(或降序)排列,然后取数组中间位置的元素与目标元素进行比较,如果相等则返回该位置的索引,如果目标元素小于中间元素,则在数组的前半部分继续查找,如果目标元素大于中间元素,则在数组的后半部分继续查找。不断迭代这个过程,直到找到目标元素或者确定目标元素不存在为止。

代码如下:

int main()
{
	int arr[] = { 1,3,5,7,9,10,14,16 };
	int n = 0;
	printf("请输入n:");
	scanf_s("%d", &n);
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;

	int left = 0;//定义数组初始查找最左边的元素下标大小
	int right = sz - 1;//定义数组初始查找最右边的元素下标的大小

	while (left <= right)
	{
		int mid = (left + right) / 2;//定义初始查找中间元素下标的大小
//为了防止(left + right)的值非常大,超出int表示的范围造成溢出,也可以这样表达mid
//令 mid = left + (right - left)/2
		if (arr[mid] < n)
		{
			left = mid + 1;//重新定义查找的最左边元素下标的大小
		}
		else if(arr[mid]>n)
		{
			right = mid + 1;//重新定义查找的最右边元素下标的大小
		}
		else
		{
			printf("找到了,数组下标是:%d\n", mid);
			break;
		}

	}
	if (left > right)//当left > right说明查找结束
	{
		printf("没有找到");
	}
	return 0;
}

例如当输入n=10时,输入结果如下:

二分法的时间复杂度为 O(log n),非常高效。它通常用于在大量数据中查找某个特定的元素,比如在一个有序数组中查找指定的数值。但是它的前提是数组或列表必须是有序的,否则无法正确查找。

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

在讲解这题前,需要先介绍一下关于字符串的一个知识点,方便解题。

在C语言中,字符串的结束标志是一个空字符('\0')。空字符是一个特殊的字符,ASCII码为0,用来表示字符串的结束。字符串在内存中被存储为字符数组,以空字符作为结束标志。

在C语言中,字符串的长度是根据空字符来确定的。当访问一个字符数组时,程序会一直读取字符直到遇到空字符为止。因此,在定义字符数组时,需要保留足够的空间来存储空字符。例如,如果定义一个包含10个字符的字符串,那么需要定义一个长度为11的字符数组,其中最后一个字符用于存储空字符。

以下是一个示例代码,演示了字符串的结束标志:

#include <stdio.h>

int main() {
    char str[] = "Hello";
    printf("字符串长度:%d\n", sizeof(str)); // 输出:字符串长度:6

    char str2[] = {'H', 'e', 'l', 'l', 'o', '\0'};
    printf("字符串长度:%d\n", sizeof(str2)); // 输出:字符串长度:6

    return 0;
}

在上面的示例中,字符串"Hello"和字符数组{'H', 'e', 'l', 'l', 'o', '\0'}的长度都是6字节,因为空字符也会占用一个字节的空间。

对于str2来说,如果没有‘\0’,输出就会出现以下情况:

int main() {
	char str1[] = "Hello";
	//printf("字符串长度:%d\n", sizeof(str1)); // 输出:字符串长度:6
	printf("str1=%s\n", str1);

	char str2[] = { 'H', 'e', 'l', 'l', 'o' };
	//printf("字符串长度:%d\n", sizeof(str2)); // 输出:字符串长度:6
	printf("str2=%s\n", str2);
	return 0;
}

这是因为字符串的结束标志是一个空字符('\0'),str2会一直输出直到遇到 空字符('\0')为止。

接下来就可以编写代码求解第四题了。

#include<windows.h>
int main()
{
	char arr1[] = "I can do it!";
	char arr2[] = "############";

	int left = 0;
	int right = strlen(arr2) - 1;//也可表示为:right = sizeof(arr2) - sizeof(arr2[0])-2
	//注意:strlen()函数计算字符串的大小时,并没有算上'\0',所以只要减去1即可
	//而sizeof()函数计算字符串的大小时,是把'\0'一起算是了,所以要减去2

	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n",arr2);
		Sleep(1000);//延时函数,延时1000ms = 1s,需要引入头文件#include<windows.h>
		left++;
		right--;
	}
	return 0;
}

结果如下所示:

 

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

 代码如下:

int main()
{
	int i = 0;
	char password[20] = { 0 };
	//假设密码是字符串:abcdef
	for (i = 0;i < 3;i++)
	{
		printf("请输入密码:");
		scanf_s("%s", password);
		if (strcmp(password, "abcdef") == 0)
	//注意:比较两个字符串是否相等,不能这么表示:password=="abcdef",需要引入库函数strcmp()
	//当返回值为0时,表示两个字符串相等
		{
			printf("登陆成功\n");
			break;
		}
		else
		{
			printf("密码错误,请重新输入\n");
		}
			
	}
	if (i == 3)
	{
		printf("三次密码均输入错误。退出程序\n");
	}
	return 0;
}

结果如下所示:

 

  • 15
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值