入门C语言第一话:分支与循环(下)——你真的知道循环吗?我敢打赌你不太知道。

前言:
每天都有许多重复的事情,使我们的生活变得琐粹,使我们心烦意乱,而循环的出现恰巧可以帮助我们的生活变得简便和丰富,下面我们来了解一下它们吧!
在这里插入图片描述

1.do while

基本语法

名片:干就完了,别想后果,先干,再想后果!——至少执行一次do语句(是优点也是缺点)

执行逻辑:

在这里插入图片描述

伪代码举例:

int main()
{
   初始化部分;
	do
	{
	循环体语句;
	条件控制语句;
	}while(条件判断语句);//表达式结果为假,跳出循环,反之继续。
	return 0;
}

伪代码:不是真正的代码,但可以辅助进行理解。

代码举例:
打印1到10

#include<stdio.h>
int main()
{
    int n = 1;//初始化部分
	do
	{
	 printf("%d ",n);///循环体语句
	 n++;//条件控制语句
	}while(n<=10);//条件判断语句
	return 0;
}

注意:这里的n必须在do while的外面不能在里面,否则条件判断语句无法执行!

实现开始菜单与退出菜单

int main()
{
    int n = 0;
	do
	{
	 printf("****************************\n");
	 printf("******** 1.开始菜单 *********\n");
	 printf("******** 2.退出菜单 *********\n");
	 printf("****************************\n");//可单独放在一个函数中
	 scanf("%d",&n);
	 switch(n)
	 {
	  case 1:
	  printf("开始游戏\n");
	  break;
	  case 2:
	  break;
	  default:
	  printf("输入错误,重新输入\n");
	  break;
	 }
	}while(n!=2);//条件判断语句
	return 0;
}

do while 中的break与continue

1.break——打破,终止之意。

代码举例:

  1. 打印1到5
#include<stdio.h>
int main()
{
    int n = 1;
	do
	{
	 if(5==n)
	 {
	   break;//当n等于5时执行语句,跳出循环
	 }
	 printf("%d ",n);
	 n++;
	}while(n<=10);
	return 0;
}
2.continue——跳过(后面的语句)
  1. 死循环打印 5
#include<stdio.h>
int main()
{
	int n = 1;
	do
	{

		printf("%d ", n);
		if (5 == n)
		{
			continue;//当n等于5时执行语句,跳过条件控制语句,不跳过条件判断语句。
		}
		n++;
	} while (n <= 10);//条件判断语句
  return 0;
}

2.while

基本用法

引入:
当我们还是一个菜鸡的时候,我们可以继续选择当菜鸡,也可以选择踏上卷王之路——一条漫长且艰难的旅程,如果坚持下去,终将会成为一方大佬!
那如何描述卷的过程呢?这里就要用到while循环了。

逻辑流程图:
在这里插入图片描述

伪代码理解:

int main()
{
  //初始化部分
  while(条件判断语句)
  {
    循环体语句;
    条件控制语句;
  }
  return 0;
}

代码实现:

int main()
{
  int bit = 1;//菜鸡就懂一点————初始化部分
  while(bit<=10000)//条件判断语句
  {
    printf("持续学习了%d天\n"&bit);//每天不断的学习————循环体语句
  }
  if(bit==10000)//成为大佬的条件
  {
   printf("大佬\n");
  }
  return 0;
}

注意:判断条件所需的变量在循环体的外面!

break的使用:

int main()
{
  int bit = 1;//菜鸡就懂一点
  while(bit<=10000)
  {
    if(500==bit)//成为大佬的路上,要面临许多诱惑。
    {
    printf("谈恋爱了,不想学了");
    break;//终止,不再进行循环
    }
    
    printf("持续学习了%d天\n"&bit);//每天不断的学习
  }
  if(bit==10000)//成为大佬的条件
  {
    printf("大佬\n");
  }
  else
  {
    printf("没成为大佬\n");
  }
  return 0;
}

continue的使用:

int main()
{
  int bit = 1;//菜鸡就懂一点
  int count = 0;//记录没学习的天数
  while(bit<=10000||count<=100)
  {
     if(500==bit)
     {
       printf("明天再学\n");//三天打鱼两天晒网
       count++;
       continue;//跳过循环体语句
     }
    printf("持续学习了%d天\n"&bit);//每天不断的学习
  }
  if(bit==10000)//成为大佬的条件
  {
   printf("大佬\n");
  }
  else
  {
    printf("没成为大佬\n");
  }
  return 0;
}

这告诉了我们要持续的学习,不断的进步,才能走向成为大佬之路!

经典例题:二分查找/升序/降序查找/折半查找

基本思路:
在这里插入图片描述

#include<stdio.h>
int main()
{
    int a = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int left = 0;//最左边数组下标,通过下标找数组中的数
	int right = 9;//最右边数组下标
	int mid = (left + right) / 2;
	int c = 0;
	scanf("%d",&a);//要查找的数
	while (left <= right)
	{
		if (a > arr[mid])//说明a在数组的右边,a大了
		{
			left = ++mid;//砍掉一半数组(左边)
			mid = (left + right) / 2;
		}
		else if (a < arr[mid])
		{
			right = --mid;//砍掉一半数组(右边)
			mid = (left + right) / 2;
		}
		else//详细的话应该是else(a == arr[mid])
		{
			printf("找到了,下标为:%d", mid);
			c = 1;
			break;
			
		}
	}
    //条件不符合时也会跳出来这时我们须标记不找到的情况,也就是c不为1那找不到即为c=0
	if (c == 0 )
	{
		printf("找不到");
	}
	return 0;
	
}

缺点:有局限性,只能查找升序或降序的序列
到这里相信聪明的你已经对while的用法有了更深一步的了解!

比较while循环和do while

在这里插入图片描述

3.for循环

基本语法

看了while与dowhile的比较,我们应该知道它们有一个共同的缺点:改动相对比较繁琐,为了更好的修改循环体,我们就需要用到将初始化部分,条件判断部分,条件控制语句融为一体的——for循环语句。

逻辑执行图:
在这里插入图片描述
伪代码:

int main()
{
 for(初始化语句; 条件判断语句; 条件控制语句)
 { 
  循环体语句;
 }
 return 0;
}

代码:

#include<srdio.h>
int main()
{
 //第一种写法(建议)
  int i = 0;
  //  初始化 条件判断 条件控制(语句)
  for(i=1; i<11; i++)
  {
   printf("%d ",i);
   if(5==i)
   {
    continue;
   }
  }
  //第二种写法
  for(int j=1; j<11; j++)
  {
   printf("%d ",j);
  }
  for(int j=1; j<11; j++)
  {
   printf("%d ",j);
  }
  //这样初始化两次j写代码有问题吗?
 return 0;
}
思考: 这里的 i 为啥平常要初始化在外面,再在for里赋值呢,这样有什么好处吗? 解释: 在里面初始化的话(第二种写法)写一次需要初始化一次,因为初始化语句是在for循环内部,而不在外部,故作用域与生命周期只在for循环内部,外部无法使用!如果初始化for外部的话,直接赋值就可以使用了,并且可以在多个for循环中使用。

注意:
1.for循环括号中所用变量,不建议在循环体语句中使用!稍有不慎便会使循环无法正常进行!
2.for循环的初始化部分在for循环的整个过程中只进入一次!
3.在循环体语句的变量只能在for里面使用,除非在for循环外面初始化所要用的变量。
4.for括号内可以使用多个变量

举例:
打印1到1000中所有的位数之和

#include<stdio.h>
int main()
{
 int i = 0;
 int sum = 0;
 int count = 0;
 for(i=1; i<1001; i++)//产生1到1000的数
 {
   int tmp = i;//防止i被修改影响循环的正常进行
   count = 1;//个位数
  while(tmp>9)//十位数以上进入循环
  {
    tmp/=10;
    count++;
  }
  sum+=count;
 }
  printf("%d",sum);
  return 0;
}

for中的continue和break

代码举例:

continue

打印1到4

#include<stdio.h>
int main()
{
  int i = 0;
  for(i=1; i<11; i++)//产生1到10的数
  {
   if(5==i)
   {
    continue;//跳过后面的循环体语句。
   }
    printf("%d ",i);
    //continue跳到这里
  }
  //打印1 2 3 4 
  return 0;
}

break

#include<stdio.h>
int main()
{
  int i = 0;
  for(i=1; i<11; i++)//产生1到10的数
  {
   if(5==i)
   {
    break;//终止循环。
   }
    printf("%d ",i);
  }
  //break跳到这里
  //打印1 2 3 4 
  return 0;
}

例题

看到这里相信你对for循环有了一定的了解,下面我们来做几道题锻炼一下吧!

1.初始化部分的省略

思考 :打印几个hehe

#include<stdio.h>
int main()
{
 	int i = 0;
 	int j = 0;
 	int count = 0;//计数
 	for(; i<10; i++)
 	{
 	
 	 for(; j<10; j++)
 	 {
 	  count++;
 	  printf("%d:hehe\n",count);//可以看出第几个hehe被打印。
 	 }
 	}
	return 0;
}
注意:循环可嵌套使用!

答案:

在这里插入图片描述
解析:省略初始化部分,则i与j为0,进入第一层for循环再进入第二层循环,每次打印一次hehe,j就加1,直到10跳出循环,再进行第一层for的第二次循环,进入第一层for,再进入第二层for,注意 !此时j为10(未进行初始化),直接跳出循环,如此进行,直到i为10时循环停止,打印十个hehe。

2.判断部分

思考:代码的执行结果

#include<stdio.h>
int main()
{
  int i = 0;
  for(i=1; i=0; i++)
  {
   printf("hehe\n");
  } 
	return 0;
}
答案:

在这里插入图片描述
解析:这里的条件判断部分是将0赋给i,0为假,跳出循环!

3.多变量的使用

思考:代码打印几个hehe

#include<stdio.h>
int main()
{
   int i = 0;
   int j = 0;
   for(i=1,j=3; (i<2)&&(j<5); i++,j++)//回想一下&&的运行规则
   {
    printf("hehe\n");
   }
	return 0;
}

答案:
在这里插入图片描述
解析:初始化:将1赋给i,将3赋给j;判断部分:i<2为真并且j<5也为真因此判断部分为真,进入循环体语句打印hehe,再进入条件控制语句:i加1为2,j加1为4,进入判断部分:i<2为假直接跳出循环!

额外总结:

1.三种死循环(循环内没有break的情况)

1.do while
#include<stdio.h>
int main()
{
  do
  {
  }while(1);//判断部分为非0,一直为真————这里只是举个例子,像2也可以
	return 0;
}
2. while
#include<stdio.h>
int main()
{
 while(1)//判断部分为非0,一直为真————这里只是举个例子,像2也可以
 {
 
 }
	return 0;
}
3.for

{
int i = 0;
for( ; ; )//这里可证明for循环内的三个部分都可省略,这没有判断进行的语句因此可一直进行。
{
}
for( ; ; i=1 )//这里将1赋给i一直为真,一直进行循环
{
}
for( ; 1; )//这里1为真,一直进行循环
{
}
}
总结:只要判断部分恒为真,就会进入循环,除非内含break.

3.go to语句

1.基本逻辑

在这里插入图片描述

语法

伪代码:

 #include<stdio.h>
int main()
{
   设立标记点://冒号
   
   goto 标记点;//去标记点+分号
	return 0;
}

注意:这里go to语句只能在全局变量以内的范围中使用
名片:可死循环,也可不循环,更可跳过循环

1.死循环(不能用break结束!)

#include<stdio.h>
int main()
{
   again:
   printf("hehe\n");
   goto again;
	return 0;
}

2.正常使用

#include<stdio.h>
int main()
{
   
   printf("hehe\n");
   goto again;
   again:
   printf("hehe\n");
   return 0;
}

3.跳出循环

int main()
{
 for(exp;exp;exp)//exp是表达式
 {
  for(exp;exp;exp)
  {
   for(exp;exp;exp)
   {
    语句;
    goto extern;
   }
  }
 }
 extern:
 return 0;
}

注意:goto语句应该谨慎使用,把goto想象成闪电侠,去到过去,会影响甚至改变现在,所以尽量不要使用!

尾序

如果能认真看到这里,我坚信你能收获很多很多!也希望这篇文章能帮助到你,如果觉得不错,请点击一下不要钱的赞,如果有误请温柔的指出,在这里感谢大家了!
在这里插入图片描述

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值