分支和循环(二)及其 初识二分查找

文章目录

  1. for循环
  2. do while 循环
  3. 二分查找

文章内容

  1.for循环

    for循环的基本语法

    for(表达式1; 表达式2; 表达式3)
       循环语句;
    表达式1为初始化部分,用于初始化循环变量的。
    表达式2为条件判断部分,用于判断循环时候终止。
    表达式3为调整部分,用于循环条件的调整。

    for循环实例

#include <stdio.h>
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}

    break 和 continue在for循环

    for循环中也可以出现break和continue,他们的意义和在while循环中是一样的,但是还是有些差异。

//代码1
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ",i);
}
return 0;
}
//代码2
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
continue;
printf("%d ",i);
}
return 0;
}

  for 语句的循环控制变量

  建议:
  1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
  2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。

  3.for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题。

int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}

  小练习,请问循环要循环多少次?

#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for(i =0,k=0; k=0; i++,k++)
    k++;
return 0;
}

  答:是零次 ,因为在判断部分,k被赋值为零,零为假所以 就不进入循环了。


  2.do while 循环

   do语句的语法:

   do
     {

 循环语句;

   }while(表达式);

   do语句的特点
   循环至少执行一次,使用的场景有限,所以不是经常使用。(通俗来讲,先进程序弄完在判断。)

#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
    i=i+1;
}while(i<=10);
return 0;
}

  练习,

 1.计算 n的阶乘 ,5! = 1*2*3*4*5

 这个代码比较简单,我们使用for循环就可以

int main()
{
	int n = 0;
	scanf("%d", &n);
	int i = 0;
	int ret = 1;
	for (i = 1; i <= n; i++)
	{
		ret = ret * i;
	}
	printf("%d\n", ret);

	return 0;
}

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

int main()
{
	int n = 0;
	int i = 0;
	int ret = 1;
	int sum = 0;
	//1!+2!+3! = 1 + 2 + 6 = 9
	//1!
	//2! = 1*2
	//3! = 1*2*3
	//4! = 1*2*3*4
	for (n = 1; n <= 3; n++)
	{
		
		for (i = 1; i <= n; i++)
		{
			ret = ret * i;
		}
		sum += ret;
	}

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

	return 0;
}

  以上代码算出来是15 ,显然是不对的,每次运算ret的值残留下来啦,没有被初始化导致除了第一次第二次ret的值是1,其余时候ret的值都不是1,所以我们要将每次进入内循环的ret初始化为1。

   正确代码如下

int main()
{
	int n = 0;
	int i = 0;
	int ret = 1;
	int sum = 0;
	//1!+2!+3! = 1 + 2 + 6 = 9
	//1!
	//2! = 1*2
	//3! = 1*2*3
	//4! = 1*2*3*4
	for (n = 1; n <= 3; n++)
	{
		ret = 1;
		for (i = 1; i <= n; i++)
		{
			ret = ret * i;
		}
		sum += ret;
	}

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

	return 0;
}

  此种方法尤其弊端,例如算1!+2!+3!+4!在算4!的时候还需要吧前面三个阶乘再算一遍,造成空间上的浪费,基于此我们优化一下代码。

//int main()
//{
//	int n = 0;
//	int i = 0;
//	int ret = 1;
//	int sum = 0;
//	//1!+2!+3! = 1 + 2 + 6 = 9
//	//1!
//	//2! = 1*2
//	//3! = 1*2*3
//	//4! = 1*2*3*4
//	for (n = 1; n <= 10; n++)
//	{
//		ret = ret * n;
//		sum += ret;
//	}
//	printf("%d\n", sum);
//	return 0;
//}

  3. 二分查找 

        二分查找法的效率十分高,每次查找的都能消去一般的内容,前提是有序数组。

//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//升序



//	//printf("%d\n", sizeof(arr));//计算的数组的总大小,单位是字节
//	//printf("%d\n", sizeof(arr[0]));//4
//	//printf("%d\n", sizeof(arr) / sizeof(arr[0]));



//	int k = 7;//假设我们要找数组下标为七的元素
//	int i = 0;


//	int sz = sizeof(arr) / sizeof(arr[0]);//此处计算数组的长度是为了方便定义right


//	int left = 0;//数组的下标从零开始
//	int right = sz-1;//数组的长度减一便是最后一个元素的下标

//	int flag = 0;//flag的作用是标志是否找到了


//	while (left<=right)//左下标小于等于右下标是进入循环的前提
//	{
//		int mid = (left + right) / 2;
//      切记此处不能放到循环外边,因为left和right是动态的,所以mid也是动态的,放到循环外边无法给 
//      mid从新赋值了


//		if (arr[mid] == k)
//		{
//			printf("找到了,下标是:%d\n", mid);
//			flag = 1;
//			break;
//		}


//		else if (arr[mid] < k)
//		{
//			left = mid + 1;//因为arr[mid] < k,所以我们要将mid+1的值赋给left,
//                                              来更新搜索区间,反之则反
//		}



//		else
//		{
//			right = mid - 1;
//		}
//	}
//	//1 2
//	if (flag == 0)
//		printf("没找到\n");
//
//	return 0;
//}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值