[C语言]课堂小练习

第一个练习是计算阶乘的:

int main()
{
	int i = 0;
	int ret = 1;
	int n = 0;
	while (1)
	{
		scanf("%d", &n);
		if (0 == n)
		{
			printf("退出程序\n");
			break;
		}
		for (i = 1,ret = 1; i <= n; i++)
		{
			ret *= i;
		}
		printf("%d的阶乘是:%d\n", n, ret);
	}
	return 0;
}

对比课堂的做了一些改动,觉得每输入一次阶乘都要重新打开一次太麻烦,干脆搞个循环,想退出就直接输入0;代码讲解,阶乘各位都了解的吧,3!=1×2×3;4!= 1×2×3×4;以此类推……,而这里可以看出4的阶乘和3的阶乘是有重叠部分的;这里将ret变量作为阶乘值 ,i作为要乘积的数值,每执行一次乘积就给ret赋值一次,懂了for循环语句之后,就可以自行在脑中进行编译了,这里就不详细讲了,挺好理解的;

第二个练习是阶乘和:

int main()
{
	int i = 0;
	int n = 0;
	int ret = 1;
	int sum = 0;
	while (1)
	{
		scanf("%d", &n);
		if (0 == n)
		{
			printf("退出程序\n");
			break;
		}
		ret = 1; sum = 0;
		for (i = 1; i <= n; i++)
		{
			ret *= i;
			sum += ret;
		}
		printf("%d以内的阶乘和:%d\n", n, sum);
	}
	return 0;
}

阶乘和就是在阶乘的代码上做出一丢丢改变,将每次阶乘值加起来就可以了,一开始我直接咔了一个嵌套进去,结果发现有写法更简便,人外有人啊~;

第三个练习是有序数组中查找数值,运用了折半查找,也叫二分查找

int main()
{
	int arr[10] = { 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 mid = 0;
	while (left <= right)
	{
		mid = (left + right) / 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;
}

在有序数组中查找是否有需要的元素,折半查找字面意思就是从中间开始找,每一次的查找都会去掉一半的元素,left和right则表示我们查找的范围,范围是按数组元素个数来决定的;

这边while循环里用左下标<=右下标,这个数组是按从小到大的顺序进行排列的,我们每一次查找都是用中间下标进行比较,当left>right的时候就证明已经没有要查找的元素了,所以我们给while循环设定的判断条件就是在数组中还有需要查找的元素,如没有则跳出循环;

接着下面的查找过程,每一次以中间元素跟查找值进行比较,按情况进行缩小范围;比较的情况无非就三种“>、<、=”,当找到了的时候就将下标打印,并跳出循环;当我们跳出循环也没找到,则表示左下标已经大于右下标了,需要查找的都查找完了,仍未查到,那就说明数组中没有我们要查找的值,所以循环外头用了个if语句设定这个条件;

第四个练习,则是一个从两端往中间一一显示出来的代码;

int main()
{
	char arr1[] = "Nice to meet you!";
	char arr2[] = "#################";
	int left = 0;
	int right = strlen(arr1) - 1;
	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		Sleep(1000);
		system("cls");
		left++;
		right--;
	}
	printf("%s\n", arr2);
	return 0;
}

这个代码就是将第二个字符串两端元素一一跟第一个字符串相对应;直到打印到最中间为止,这个循环的判断条件是跟上面那个二分查找的一样的,left<=right说明还有要打印的内容,left>right的时候就不需要再继续打印了,这里学了两个命令,一个Sleep,还有一个是系统命令“cls”;Sleep是让代码输出时等待一段时间再继续执行下面的代码,cls是清空屏幕输出内容;挺炫酷的。

第五个,模拟限制输入密码次数的代码:

int main()
{
	int i = 0;
	char password[20] = { 0 };
	for(i = 0;i <3;i++)
	{
		printf("请输入密码:>");
		scanf("%s", password);
		if (strcmp(password, "123456") == 0)
		{
			printf("登录成功\n");
			break;
		}
		else
			printf("输入错误,请重新输入\n");
	}
	if (i == 3)
		printf("三次均输入错误,退出程序\n");
	return 0;
}

这里需要讲的就是两个字符串之间进行比较运用的一个关键字“strcmp”;不知道这个关键字的时候我们还想着以等号的方式进行两个字符串的对比,然而结果显然易见,有想法实现不出来,因为学的太少;这个strcmp关键词是用来比较字符串的,当两个字符串相同,返回0,不同的时候又有两种情况,strcmp比较字符串是以字符串的ASCII码值进行对比的,这边用arr表示字符串,当arr1的ASCII码值大于arr2,返回值>1,反之<1;一般来说返回值会以-1,0,-1的形式表示;

这就是本人所学的几个练习,请多多指教;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值