int main()
{
int a = 0;
for (a = 1; a <= 10; a++)//记得在()中的表达式之间加;
printf("%d ", a);
return 0;
}
记得要在三个表达式之间加“;”。
int i = 0;
for (i = 0; i < 10; i++)
前闭后开的写法。
for (i = 0; i <= 9; i++)
两边都是闭区间。
int i = 0;
for (i = 100; i <= 200; i++)
推荐使用前闭后开的写法,有时会更加直观,10即循环了10次。
但也有例外,例如我要输出100-200之间的数字,这样就比i = 100;i < 200要好。
int main()
{
for (;;)
printf("hehe\n");
return 0;
}
//即使省略表达式也要保留;
//for循环的判断部分省略意味着判断条件会恒成立
//初始化部分也可以省略,但不建议省略,例如:
int main()
{
int a = 0;
int b = 0;
for (a = 0; a < 3; a++)
{
for (b = 0;b < 3; b++)
printf("hehe\n");
}
return 0;
}
这个结果是打印9个hehe,即每次进入b的循环b都会初始化,如果去掉b的初始化,b变成3之后就不会初始化,就不会打印hehe所以结果为3个hehe。
for还可以用多个变量来控制循环
int main()
{
int i = 0;
int k = 0;
for (i = 0, k = 0; k = 0; i++, k++)
k++;
return 0;
}
一道练习题:请问循环几次?
。
。
。
。
循环0次,因为k被赋值为0,0为假,所以不循环。
练习:
1. 计算 n的阶乘。
2. 计算 1!+ 2!+ 3!+ …… + 10!
3. 在一个有序数组中查找具体的某个数字n。(讲解二分查找)
4. 编写代码,演示多个字符从两端移动,向中间汇聚。
5.编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则
提示登录成功,如果三次均输入错误,则退出程序。
1.
错误答案:
int main()
{
int a = 0;
scanf("%d", &a);
while (a != 1)
a--;
//printf("%d", a * (a--));
return 0;
}
思路:
n 的阶乘,就是1*2*3*4*...*n,所以就要有一个数去不断递增,直到增加为n。
想要将所有递增的数字相乘,就要有一个地址去储存计算之后的结果。
这时只能创建新的变量。
最后当那个数增加到 > n 的时候,退出循环。
正确答案(for语句):
int main()
{
int a = 0;//这个变量用来储存输入的数字
int b = 0;//这个变量用来与 a 比较并递增
int c = 1;//这个变量用来与 b 相乘并储存计算结果
scanf("%d", &a);
for (b = 1; b <= a; b++)
c = c * b;//多次改变 c 的值
printf("%d\n", c);
return 0;
}
while语句的答案:
int main()
{
int a = 0;
int b = 1;
int c = 1;
scanf("%d", &a);
while (b <= a)
{
c = c * b;
b++;
if (b > a)//这两句都多余了
break;//包括这句
//当打印处于这里时,结果错误
}
printf("%d\n", c);//当打印在这里时,结果正确
return 0;
}
要找好printf的位置,避免多次打印甚至循环次数减少
记得加空格或者\n,不然容易看错数据,不好修改
反向计算:
int main()
{
int a = 0;
int b = 0;
int c = 1;
scanf("%d", &a);//这里的思路是使b由a的值减小到1
for (b = a; b >= 1; b--)//这里循环判断表达式不能是b==1,也不能是b==a
//要记住,这里的表达式含义为循环的条件,不满足条件就不进入循环
c = c * b;
printf("%d\n", c);
return 0;
}
这里的思路是使b由a的值减小到1
2.
int main()
{
int a = 0;
int b = 0;
int c = 1;
int sum = 0;
for (a = 1;a <= 10;a++)
{
int c = 1;//当没有这行代码,每次循环c的值会被保留,导致结果出错
for (b = 1; b <= a; b++)
c = c * b;
sum = sum + c;
}
printf("%d\n",sum );
return 0;
}
3的阶乘为1*2*3
4的阶乘为1*2*3*4*
每次计算都要重新算一遍已有的结果,浪费时间
优化:
int main()
{
int a = 0;
int c = 1;
int sum = 0;
for (a = 1; a <= 10; a++)
{
c = c * a;
sum = sum + c;
}
printf("%d\n", sum);
return 0;
}
3.
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]) - 1;//这里减一是因为数组下标比实际值小一
int key = 0;
int mid = 0;
scanf("%d", &key);
while (left <= right)
{
mid = (left + right) / 2;//这里不能加int,这里括号要加在/前面
if (key < arr[mid])//这里应该是arr[mid],不能只写mid
right = mid - 1;
else if (key > arr[mid])//这里记得是else if,不要写成if
left = mid + 1;
else
break;
}
if (left <= right)
printf("找到了,它的下标是:%d\n", mid);
else
printf("找不到\n");
return 0;
}
补充:
整形可以表达的最大的量为42亿多,现在有left和right两个值相加
有可能会溢出,数据就会出错
所以可以改为left+(right-left)/2
思路:
要在有序数组中找一个数 n ,最快的方法是二分查找。
即先找中间值,然后在用中间值和 n 比较,看大还是小。
求中间值的方法,要把最左边的序号与最右边的序号相加处除2
如果中间值大,就将右边的值减一,继续比较。然后循环。
4.
#include<stdlib.h>//sysytem语句需要使用
#include<windows.h>//Sleep语句需要使用
int main()
{
char arr1[] = "welcome to bit" ;
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(500);//s要大写
system("cls");//清理屏幕的作用
left++;
right--;
}
printf("%s\n", arr1);
return 0;
}
5.
#include<string.h>//strcmp语句需要使用
int main()
{
int a = 0;
char password[20] = { 0 };
for (a = 0; a < 3; a++)//最多输入三次密码
{
printf("请输入密码:");
scanf("%s", password);
if (strcmp(password, "abcdef") == 0)//设置密码为abcdef
{
printf("登录成功\n");
break;
}
else
printf("密码错误\n");
}
if (a == 3)
printf("三次密码均输入错误,退出程序\n");
return 0;
}
如果比较两个字符串是否相等,不能使用==,而应该使用一个库函数:strcmp
如果返回值是0,表示两个字符串相等