C语言学习记录——循环结构

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,表示两个字符串相等

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值