c语言知识小清单(3)之速通期末考点(循环)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文主要讲解循环的重难点知识:

难点:折半查找


提示:以下是本篇文章正文内容,下面案例可供参考

一、循环初阶

非常简单,字面意思来讲,循环就是一个圈,不同于直线,一进一出,在圈里要做多次,知道不满足条件。和学习一个道理,你只要持续努力,大一学好专业课,打基础,提升软实力。大二打各种竞赛,嘎嘎得奖,大三直接剑指offer,你能力越来越强,自然当前的环境是配不上你,即不满足条件,方可跳出循环,翻越浪浪山,奔赴下一场山海。

1.计算n的阶乘

  • 阶乘是啥?
  • 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。
//计算n的阶乘
		int n = 0;
		int ret = 1;
		for ( n = 1; n <= 5; n++)
		{
			ret *= n;

		}
		printf("%d", ret);

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

  • 刚刚我们已经学会了算一个数的阶乘,现在要把十个数的阶乘相加
  • 挠挠头,左思右想
  • 灵光一闪
  • 计算一个数的阶乘,算十次,即使用循环,再相加
  • 代码实现
int sum = 0;
	int n = 0;
	int ret = 1;

	     
	
	
		for (n = 1; n <= 10; n++)
		{
			ret *= n;//算阶乘
			sum += ret;//相加

		}
		printf("%d", sum);

二.循环进阶

1.折半查找法

问题引出:在一个有序数组如何查找具体的某个数字n的下标

	int arr[] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14 };
	假设10是要查找的数字

在这里插入图片描述

	中间值arr[mid]<10,那就把左边一半不管了,专注右边一半
	即left=mid+1=7,rigth不变
	mid=(left+right)+/2=10

在这里插入图片描述

	arr[mid]>10,显而易见,中间值都比我们要找的要大,右边一半抛弃
	left不变,right=mid-1=9,mid=(7+9)/2=8

在这里插入图片描述

	arr[mid]<9,此时right不变,left=mid+1
	巧了,left=right,即我们要找到元素10的下标就为此时的left和right
	代码实现
int arr[] = { 1,2,3,4,5,6,7,8,9,1011121314 };
		int k = 9;//假设k是要查找的数字
		i = 0;
		int sz = sizeof(arr) / sizeof(arr[0]);
		//折半查找
		int left = 0;
		int right = sz-1;
		int mid = left + (right - left) / 2;
		int flag = 0;
		while (left <= right)
		{

			int mid = left + (right - left) / 2;
			if (arr[mid] < k)
			{
				left = mid + 1;
			}
			else if (arr[mid] > k)
			{
				right = mid - 1;
			}
			else
			{
				printf("找到了,下标是%d\n",mid);
				flag = 1;
				break;
			}

	
		}
		if (flag == 0)
		{
			printf("找不到");
		}

2.演示多个字符从两端向中间汇聚

	什么意思呢?(ps:欢迎大家到大美江财游玩)
	welcome to jufe!!!
	******************
	w****************!
    we**************!!
    wel************!!!

思路:先来俩数组,一个arr1[]存放welcome to jufe!!!
一个arr2[]存放******************
然后arr1[left]交给arr2[left]
arr2[right]交给arr2[right]
以上为一次,加之以循环,问题解决
代码实现

#include<stdio.h>
#include<string.h>
#include<windows.h>

int main()
{

	char arr1[] = "welcome to jufe!!!";
	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); //间隔1000ms打印
			system("cls");//清空屏幕
			left++;
			right--;
		}
		return 0;
}		

3.strcpm的简单运用

例题:编写代码实现,模拟用户登录场景,只能登录三次
提示登录成功,如果三次都输入错误,则退出程序
假设正确的密码为123456
比较字符串使用strcpm,如果相等返回0:

 int i = 0;
	int flag = 0;
	char password[10] = {0};
	for ( i = 0; i < 3; i++)
	{
		printf("请输入密码\n");
		scanf("%s", password);
		if (strcmp(password, "123456") == 0)//两个字符串比较大小
		{
			flag = 1;
			printf("密码正确");
			break;
		}
		else
			printf("密码错误");
	}
	if (flag==0)
	{
		printf("三次均密码错误,退出程序");
	}

总结

例如:本文重点讲解了循环与折半查找法,希望读者朋友能好好消化,如有疑惑或者错误欢迎后台私信及评论区交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江财菊圃路彭家桥C++一霸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值