程序员

C语言循环语句笔记详解以及练习-折半查找算法、猜数字游戏

作者:admin 2021-06-28 我要评论

for循环 在while循环中打印1-10代码如下 int main ( ) { int i 1 ; //初始化 while ( i 10 ) //判断部分 { printf ( %d , i ) ; i ; //调整部分 } return 0 ; } ...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

for循环

在while循环中打印1-10,代码如下

int main()
{
    int i = 1;//初始化
    while(i <= 10)//判断部分
    {
        printf("%d",i);
        i++;//调整部分
    }
    return 0;
}

while循环中的初始化部分与判断部分和调整部分相离太远,而在for循环中语法如下:

语法

for(表达式1;表达式2;表达式3)
{
    循环语句;
}

表达式1为初始化部分;表达式2为条件判断部分;表达式3为调整部分

for循环在屏幕上打印1-10

int main()
{
    int i=0;
    for(i=1;i<=10;i++)
    {  //初始化;判断;调整
        printf("%d",i);
    }
    return 0;
}

我们可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹。 for循环使用的频率也最高。

for循环中的break

int main()
{
    int i=0;
    for(i=1;i<=10;i++)
    {
        if(i==5)
        break;
        printf("%d",i);//1234
    }
    return 0;
}

image-20210411172238202

break的作用与while循环一样,也是跳出整个循环。

for循环中的continue

int main()
{
    int i=0;
    for(i=1;i<=10;i++)
    {
        if(i==5)
        	continue;
        printf("%d",i);//1234 678910
    }
    return 0;
}

image-20210411172322950

在i=5时,continue,continue的作用跳过continue下面的语句,所以continue跳过了i=5时的打印,跳过后继续i++,所以有了后面的打印。

对于写for循环的建议

1.不要在调整循环体内修改循环变量的值,防止循环体失去控制

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

int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}
int main()
{
    int arr[10]={0};
    int i=0;
    for(i=0;i<10;i++)
    {
        printf("%d",arr[i]);
    }
    //两边都是闭区间
    /*for(i=0;i<=9;i++)
    {
        printf("%d",arr[i]);
    }*/
    return 0;
}

一些for循环的变种

判断部分的省略 - 判断部分恒为真

int main()
{
    for(;;)
    {
        printf("haha");//陷入死循环
    }
    return 0;
}

这是判断部分恒为真,所以陷入死循环

下面再看一个代码

int main()
{
    int i=0;
    int j=0;
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            printf("haha\n");//9个haha
        }
    }
    return 0;
}

image-20210411173055292

上面嵌套循环,当我们将i=0;j=0;初始化部分省略

int main()
{
    int i=0;
    int j=0;
    for(;i<3;i++)
    {
        for(;j<3;j++)
        {
            printf("haha\n");//3个haha
        }
    }
    return 0;
}

image-20210411173127678

这里只执行了i=0时的三个haha,当i=1时,此时j=3,j不小于3,进不去循环,以此类推,后面都进不去循环

笔试题

请问循环要循环多少次?

int main()
{
    int i=0;
    int k=0;
    for(i=0,k=0;k=0;i++,k++)
        k++;
    return 0;
}

答案是0次,注意判断区域是赋值号,判断为假,所以循环进不去。

do……while循环

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

do语句的特点

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

do while循环打印1-10:

int main()
{
    int i=1;
    do
    {
        printf("%d ",i);
        i++;
    }while(i<=10);
}

do while循环中的break和continue

int main()
{
    int i=1;
    do
    {
        if(i==5)
        {
            break;
        }
        printf("%d ",i);
        i++;
    }while(i<=10);
}

打印1 2 3 4,i==5时,break跳出循环

image-20210411200304979

int main()
{
    int i=1;
    do
    {
        if(i==5)
        {
            continue;
        }
        printf("%d ",i);
        i++;
    }while(i<=10);
}

continue跳过之后的语句,跳过了i++,所以打印了1 2 3 4 后陷入了死循环

image-20210411200457371

练习

1.计算n的阶乘

//计算n的阶乘
#include<stdio.h>
int  main()
{
	int n = 0;
	scanf("%d", &n);
	int temp = 1;
	for (int i = 1; i <= n; i++)
	{
		temp = temp * i;
	}
	printf("%d", temp);
	return 0;
}

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

方法一:

//计算1!+……+10!
//方法一:
#include<stdio.h>
int  main()
{
	int n = 0;
	int temp = 1;
	int sum = 0;

	for (n=1;n<=10; n++)
	{
		temp = 1;//计算n的阶乘之前,把temp置为1
		for (int i = 1; i <= n; i++)
		{
			temp = temp * i;
		}
		sum = sum + temp;
	}
	printf("%d", sum);
	return 0;
}

方法二:

#include<stdio.h>
int main()
{
	int temp = 1;
	int sum = 0;
	for (int n = 1; n <= 3; n++)
	{
		temp = temp * n;
	//1*1   1*1*2  1*1*2*3//
		sum = sum + temp;
	}
	printf("%d", sum);
	return 0;
}
  1. 折半查找算法
#include<stdio.h>
int main()
{
	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", arr[mid]);
			break;
		}
	}
	if (left > right)
	{
		printf("找不到\n");
	}
		return 0;

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

    #include<stdio.h>
    #include<windows.h>
    #include<string.h>
    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(1000);//睡眠一秒
    		system("cls");//清空屏幕
    		left++;
    		right--;
    	}
    	return 0;
    }
    
    
  2. 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序。

    #include<stdio.h>
    #include<string.h>
    int main()
    {
    	int i = 0;
    	//假设正确密码"123456"
    	char password[20] = { 0 };
    	for (i = 0; i < 3; i++)
    	{
    		printf("请输入密码:>");
    		scanf("%s", password);
    		//if(password=="123456")//err-字符串比较不能使用==,需要使用strcmp
    		if (strcmp(password, "123456") == 0)//比较成功返回0
    		{
    			printf("登陆成功\n");
    
    		}
    		else
    		{
    			printf("密码错误,重新输入!\n");
    		}
    	}
    	if (i == 3)
    	{
    		printf("三次密码均错误,退出程序\n");
    	}
    	return 0;
    }
    
    

    6.猜数字游戏

    //猜数字游戏
    //1.自动产生一个1-100之间的随机数
    //2.猜数字
    //	a.猜对了,就恭喜你,游戏结束
    //	b.你猜错了,会告诉你猜大了,还是猜小了,继续猜,知道猜对
    //3.游戏一个一直玩,除非退出游戏
    #include<stdio.h>
    #include<time.h>
    void menu()
    {
    	printf("***************************\n");
    	printf("********  1.play  *********\n");
    	printf("********  0.exit  *********\n");
    	printf("***************************\n");
    }
    void game()
    {
    	//猜数字游戏的实现
    	//1.生成随机数
    	//rand函数返回了一个0-32767之间的数字
    	//一个时间对应一个时间戳
    	
    	int ret = rand()%100+1;//%100的余数是0-99,然后+1,就是0-100
    	//printf("%d\n", ret);
    	//2.猜数字
    	int guess = 0;
    	while (1)
    	{
    		printf("请猜数字:>");
    		scanf("%d", &guess);
    		if (guess < ret)
    		{
    			printf("猜小了\n");
    		}
    		else if (guess > ret)
    		{
    			printf("猜大了\n");
    		}
    		else
    		{
    			printf("恭喜你猜对了\n");
    			break;
    		}
    	}
    }
    int main()
    {
    	int input = 0;
    	srand((unsigned int)time(NULL));
    	do
    	{
    		menu();//打印菜单
    		printf("请选择:>");
    		scanf("%d", &input);
    		switch (input)
    		{
    		case 1:
    			game();
    			break;
    		case 0:
    			printf("退出游戏\n");
    			break;
    		default:
    			printf("选择错误,重新选择");
    			break;
    		}
    	} while(input);
    	return 0;
    }
    
;原文链接:https://blog.csdn.net/attemptendeavor/article/details/115614345

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • C语言循环语句笔记详解以及练习-折半查

    C语言循环语句笔记详解以及练习-折半查

  • 算法-连胜概率问题-如何上王者

    算法-连胜概率问题-如何上王者

  • 7道腾讯算法编程真题,你能做对几道?

    7道腾讯算法编程真题,你能做对几道?

  • Linux--信号

    Linux--信号

腾讯云代理商
海外云服务器