C语言 循环结构 —— for循环、do while循环、练习

目录

 

for循环语法

一些for 循环的变种

do while() 循环

练习


while循环:初始化、判断部分、循环变量的调整部分,任一一个发生变化都会影响结果,随着代码越来越多,三个部分离得越来越分散,未来要改动循环的时候,就会比较麻烦。for循环就可以解决这个问题。

#include<stdio.h>
int main(void)
{                     
	int i = 1;        //初始化
	while (i <= 10)   //判断部分
	{
		printf("%d\n", i);
		i++;          //循环变量的调整部分
	}
	return 0;
}

for循环语法

特点:初始化只执行一次

举例:打印1-10的整数

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

break 和 continue 在for循环的用法:

break 终止整个循环

continue 终止本次continue后面的语句执行,跳到调整部分

for语句的循环控制变量,一些建议:

1,不可在for 循环体内修改循环变量,防止for循环失去控制。

2,建议for语句的循环控制变量的取值采用“前闭后开区间”写法。

循环体内改变变量举例:

#include<stdio.h>
int main(void)
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		printf("%d ", i);    //进入死循环
		i = 6;    
	}
	return 0;
}
#include<stdio.h>
int main(void)
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		printf("%d ", i);    
		int j = 6;  
		for (j = 0; j < 10; i++)
		{
			printf("haha\n");    //进入死循环
		}
	}
	return 0;

前闭后开举例:

#include<stdio.h>
int main(void)
{
	int arr[10] = { 0 };
	int i = 0;

	for (i = 0; i < 10; i++)    //前闭后开,一眼能看出循环了10次
	//for (i = 0; i <= 9; i++)  //前闭后闭
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

一些for 循环的变种

for 循环的初始化、判断和调整三个部分都可以省略,语法是支持的,但是判断部分的省略,判断部分就恒为真,代码进入死循环

//变种1
#include<stdio.h>
int main(void)
{
	for (;;)   
	{
		printf("哈哈\n ");  //进入死循环
	}
	return 0;
}

也不建议随便省略:  

//变种2
#include<stdio.h>
int main(void)
{
	int x, y;
	for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
	{
		printf("哈哈\n");
	}
	return 0;
}

思考:下面循环要循环多少次?

do while() 循环

do语句的语法:不管三七二十一,先执行完了,然后再判断,判断为真,然后再新的一轮执行。

循环至少执行一次,使用的场景有限。所以不是经常使用。

do
		循环语句;
	while (表达式);

举例:打印1-10

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

 break 在do while()循环里举例,如果多个循环嵌套,一个break只能跳出自己这层循环。

#include<stdio.h>
int main(void)
{
	int i = 1;
	do
	{
		if (i == 5)
			break;
		printf("%d ", i);   // 输出:1 2 3 4
		i++;
	} while (i <= 10);
	return 0;
}

continue 在do while()循环里举例

#include<stdio.h>
int main(void)
{
	int i = 1;
	do
	{
		if (i == 5)
			continue;
		printf("%d ", i);   // 输出:1 2 3 4 之后一直 i = 5 进入死循环
		i++;
	} while (i <= 10);
	return 0;
}

练习

1,计算 n 的阶乘。

while循环:

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
int main(void)
{
	int x = 1;
	int n;
	int sum = 1;
	scanf("%d", &n);
	while (x <= n)
	{
		sum *= x;
		x++;
	}
	printf("%d 的阶乘是:%d\n", n, sum);
	return 0;
}

 for循环:

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
int main(void)
{
	int x = 1;
	int n;
	int sum = 1;
	scanf("%d", &n);
	for (x = 1; x <= n; x++)
	{
		sum *= x;
	}
	printf("%d 的阶乘是:%d\n", n, sum);
	return 0;
}

do while循环:

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
int main(void)
{
	int x = 1;
	int n;
	int sum = 1;
	scanf("%d", &n);
	do
	{
		sum *= x;
		x++;
	} while (x <= n);

	printf("%d 的阶乘是:%d\n", n, sum);
	return 0;
}

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

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
int main(void)
{
	int x = 0;
	int y = 1;
	int sum = 0;
	for (x = 1; x <= 10; x++)
	{
		y *= x;  //算出每个数的阶乘
		sum += y;
	}
	printf("%d\n", sum);
	return 0;
}

3,在一个有序数组中查找具体的某个数字n。编写 int binsearch(int x, int v[], int n);功能:在v[0]<=v[1]<=v[2]<=……<=v[n-1]的数组中查找x。

解析:折半查找(二分查找),效率高。找出这组元组最中间元素的下标:((最左下标+最右下标)/  2)

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
int main(void)
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int k = 7;   //要查找的数字
	//在arr这个有序的数组中查找k(7)的值
	//首选确定最左下标和最右下标
	int sz = sizeof(arr) / sizeof(arr[0]); //数组的元素个数  

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

 4,编写代码,演示多个字符从两端移动,向中间汇聚。

解析:Sleep(1000):1000毫秒 = 1秒,睡眠1秒。

需要引用头文件 #include<windows.h>,Sleep() 的 S 要大写

 system("cls"):清空屏幕,代码会打一行清除(覆盖)一行。

#include<stdio.h>
#include<string.h>
#include<windows.h>
int main(void)
{
	char arr1[] = "Welcome to hangzhou!!!";
	char arr2[] = "######################";
	int left = 0;   //左下标
	int right = strlen(arr1) - 1;   //右下标,需要 #include<string.h>
	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		Sleep(1000);    //1000毫秒 = 1秒,睡眠1秒。需要 #include<windows.h>
		//Sleep() 的 S 要大写
		system("cls");  //清空屏幕,代码会打一行清除(覆盖)一行。
		left++;
		right--;
	}
	printf("%s\n", arr2);
	return 0;
}

 5,编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序。

解析:两个字符串比较,不能使用 ==,应该使用专门的“字符串比较函数”

strcmp(string1, string2):比较的是对应字符的ASCII码值

返回值 == 0 时,string1 = string2

返回值 < 0 时,string1 < string2

返回值 > 0 时,string1 > string2

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<string.h>
int main(void)
{
	//假设正确的密码是字符串“123456”
	char password[30];
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		printf("请输入密码:");
		scanf("%s", password);   //数组名本身就是地址,不需要加取地址符号&

		//if (password == "123456")   //错的,两个字符串比较不能用==
		
        //要用字符串比较函数strcmp(),返回0,说明两个字符串相等
		if (strcmp(password, "123456") == 0)   //需要头文件 #include<string.h>
		{
			printf("登录成功\n");
			break;
		}
		else
		{
			printf("密码错误,请重新输入\n");
		}
	}
	if (i == 3)
		printf("三次密码均输入错误,退出程序\n");
	return 0;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值