【C语法学习】while循环语句

1 语法结构

while语句的语法结构如下图所示:

while(循环条件表达式)
	循环语句;

循环执行流程图
在这里插入图片描述
循环执行过程

  1. 对表达式求值;
  2. 如果表达式为假,则退出整个循环;
  3. 如果表达式为真,则执行循环语句,然后跳到第1步;
  4. 如果循环语句中有break,则退出整个循环;
  5. 如果循环语句中有continue,则跳过continue后面的所有语句,然后跳到第1步继续执行。

2 示例

2.1 示例1

希望打印数字1-10,代码如下图所示:

int main()
{
   int i = 1;

   while (i <= 10)
   {
      printf("i = %d\n", i);
      i++;
   }

   return 0;
}

代码执行结果如下图所示:
在这里插入图片描述

如果希望打印数字1-4,可在循环语句中加入break,代码如下图所示:

int main()
{
   int i = 1;

   while (i <= 10)
   {
      if (5 == i)
      {
         break;
      }
      printf("i = %d\n", i);
      i++;
   }

   return 0;
}

代码执行结果如下图所示:
在这里插入图片描述

如果希望跳过打印数字5,在循环语句中加入continue,代码如下图所示:

int main()
{
   int i = 1;

   while (i <= 10)
   {
      if (5 == i)
      {
         continue;
      }
      printf("i = %d\n", i);
      i++;
   }

   return 0;
}

代码执行结果如下图所示:
在这里插入图片描述
光标一直在闪动,程序无法正常结束。循环中遇到continue,则跳过continue后边的语句,继续对循环条件表达式求值。本例中,i++在continue的后面,当遇到continue时跳过i++语句,导致循环变量i的值无法继续更新,始终等于5,程序进入死循环。

修改上面的代码,挪动i++语句的位置,如下图所示:

int main()
{
   int i = 1;

   while (i <= 10)
   {
      i++;
      if (5 == i)
      {
         continue;
      }
      printf("i = %d\n", i);
   }

   return 0;
}

代码执行结果如下图所示:
在这里插入图片描述
程序正常结束,跳过打印数字1和5,斗多余打印数字11,不符合预期。

继续修改代码,i++语句位置保持不动,在continue语句前面增加一条i++语句,如下图所示:

int main()
{
   int i = 1;

   while (i <= 10)
   {      
      if (5 == i)
      {
         i++;
         continue;
      }
      printf("i = %d\n", i);
      i++;
   }

   return 0;
}

代码执行后,跳过打印数字5,符合预期,打印结果如下图所示:
在这里插入图片描述

2.2 示例2

while循环用于清空stdin缓冲区,代码如下图所示:

int main()
{
   char password[20] = { 0 };

   // 输入abcde+空格+fgh+空格+回车
   printf("请输入密码 : ");
   scanf("%s", password);
   //清空stdin缓冲区
   int ch = 0;
   while ((ch = getchar()) != '\n')
   {
      ;
   }
   //
   printf("请确认密码(Y/N) : ");
   int ret = getchar();
   if('Y' == ret)
   {
      printf("Yes\n");
   }
   else
   {
      printf("No\n");
   }


   return 0;
}

代码执行结果如下图所示:
在这里插入图片描述
使用scanf(0函数从标准输入流stdin中读取字符时,往往会有残留字符,会导致下次读取stdin时发生错误。所以,在使用scanf()函数之后,需要清空stdin。较新版本的vs开发工具不再支持使用fflush()函数清空stdin的方法,需要用户来实现清空stdin的功能,而while循环语句+getchar()函数的方法可以很好的实现此功能。

2.3 示例3

需求:只打印数字字符,跳过其他字符,代码如下图所示:

int main()
{
   int ch = '\0';

   //输入a1+空格+b2+空格+c3+空格+d4+空格+e5+空格+回车 
   while ((ch = getchar()) != '\n')
   {
      if (ch < '0' || ch > '9')
         continue;
      putchar(ch);
   }
   printf("\n");

   return 0;
}

代码执行结果如下图所示:
在这里插入图片描述

2.4 示例4

需求:在一个有序数组中查找某个具体的数字n;
方法:二分法;
实现:代码如下图所示:

int main()
{

   int arr[] = {1,2,3,4,5,6,7,8,9,10};
   int k = 0;
   int sz = sizeof(arr) / sizeof(arr[0]);

   int l_index = 0;
   int r_index = 0;
   int m_index = 0;

   for (k = 1; k < 12; k++)
   {
      printf("请查找数字%d\n", k);
      l_index = 0;
      r_index = sz - 1;
      while (l_index <= r_index) //注意循环条件
      {
         m_index = (l_index + r_index) / 2;

         if (arr[m_index] < k)
         {
            l_index = m_index + 1;
         }
         else if (arr[m_index] > k)
         {
            r_index = m_index - 1;
         }
         else
         {
            printf("Number is found, index is %d\n", m_index);
            break;
         }
      }
      if (l_index > r_index)
      {
         printf("Number is not found.\n");
      }
   }

   return 0;
}

代码运行结果如下图所示:
在这里插入图片描述

2.5 示例5

需求:编写代码,演示多个字符从两端移动,向中间汇聚;
实现:代码如下图所示:

int main()
{
   char arr1[] = "welcome to bit!!!!";
   char arr2[] = "##################";

   int left = 0;
   int right = strlen(arr1) - 1;//注意字符串结束符'\0'的存在

   while (left <= right)
   {
      arr2[left] = arr1[left];
      arr2[right] = arr1[right];
      puts(arr2);
      Sleep(1000);//等待1000ms = 1s
      //清空屏幕
      system("cls");//system是一个库函数,可以执行系统命令
      left++;
      right--;
   }
   puts(arr2);

   return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值