文章目录
- for循环
- do while 循环
- 二分查找
文章内容
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;
//}