第四章 for循环(一)

循环

重复执行一个语句块,直到满足某个条件为止,这称为循环

循环的工作过程

递增和递减运算符

递增运算符: ++递减运算符: -- 会将储存在整数变量中的值递增或递减 1 假设定义一个整数变量number,他的当前值为6,使用以下语句个它加1.

++number;
number=number+1;
number+=1;
++number;
//这些变量都是给number加1,最后一种形式最简洁

执行完这个语句,number的值为7,同样可以用--number减一

--number;
number=number-1;
number-=1;
--number;
//这些变量都是给number减1,最后一种形式最简洁

for循环

假定要显示(1~10)之间的数字,不用编写十条printf语句,使用for语句如下:

for(int count=1; count<=10; ++count)
{
   printf("%d",count);
}

解剖:

  1. int count=1; 声明count,初始为1
  2. count<=10; 在每个循环开始时计算。如果结果为true,循环就继续,否则循环就停止
  3. ++count 在每次循环结束时执行。他递增count,每次加1

流程图

for循环的一般语法

for(starting_condition;continuation_condition;action_per_iteration)

   loop_statement;

next_statement;

starting_condition

这个位置通常设定循环控制变量的初始值,只执行一次 循环控制变量一般(但非必要)是一个计数器,用来追踪循环重复的次数 也可以在这里声明并初始化相同类型的多个变量,各个声明用逗号隔开 此时所有变量都是循环的本地变量,在循环结束后就不存在了

continuation_condition

在循环开始时开始测试,而不是在结束时测试 是一个结果为truefalse的逻辑表达式,用以决定循环是否继续执行 只要这个条件为true,循环就继续 它一般检查循环控制变量的值,但任何逻辑或算术表达式都可以放在这里,只要知道自己在做什么即可

action_per_iteration

在每次循环迭代结束时执行,通常(但不一定)是递增或递减一个或多个循环控制变量 修改多个变量的表达式用逗号隔开

loop_statement

在每次循环迭代时,都会执行 一旦continuation_condition是false,循环就结束,程序继续执行next_statement

递增的递减运算符的前置和后置形式

++i

//把++运算符放在变量前面,这叫做前置形式
i++

//把++运算符放在变量后面,这叫做后置形式

在表达式中使用前置和后置的效果大不相同,++i表示,i自增1后再参与其它运算;而i++ 则是i参与运算后,i的值再自增1。

int count=5;
total=++count+6;
total=12;

变量count会递增到6,在与右边的值计算,因此total的值为12,递减运算和递增完全相同

int count=5;
total=6+count++;
total=11

total的值为11,这是因为count的值在表达式中使用后才递加,递减运算和递增完全相同

没有参数的for循环

for循环最简洁的形式如下

for( ;;)
{
   /*statements*/
}

循环内的break语句

在switch语句中使用过break,他的作用是为了终止代码的执行,break语句在循环体内的作用和switch一样

这是一个无限循环,如果输入的字符是n或N,才会执行break语句结束循环

#include <stdio.h>
int main()
{
    char answer =0;
    for( ; ;)
    {
        printf("是否要再输入一些(y/n)");
        scanf("%c",&answer);
        if(tolower(answer)=='n')
        break;

    }
}

使用for循环限制输入

可以使用for循环限制用户的输入次数,这个程序要求用户猜测该程序挑选出的幸运数字。它使用了一个for循环和许多if语句。还加进了条件运算符,提醒读者不要忘记如何使用它

#include <stdio.h>
int main()
{     
      int chosen=15;  //幸运数字
      int guess=0;   //储存猜测
      int count=3;    //3次机会
      printf("这是个猜谜游戏");
      printf("选一个1和20之间的数字,你一定能猜到");
      for(;count>0;--count)
      {
           printf("你有%d次机会",count);
           printf("猜猜看");
           scanf("%d",&guess);
           if(guess==chosen)
           {
                printf("恭喜你猜对了"); 
                return 0;
            } 

            else if(guess<1||guess>15999)
            printf("请输入一个1-20的数字");

            else  
            printf("你输入的%d是不对的,你的数字 %s ",guess,chosen>guess?"小了":"大了");     
       } 

     printf("你尝试了3次都失败了幸运数字是%d",chosen);
     return 0;  
 } 

生成伪随机数

在C语言中,我们一般使用<stdlib.h>头文件中的 rand() 函数来生成随机数,它的用法为:

 int rand (void);  //void 表示不需要传递参数。

rand() 会随机生成一个位于 0 ~ RAND_MAX 之间的整数。RAND_MAX 是 头文件中的一个宏,它用来指明 rand() 所能返回的随机数的最大值。C语言标准并没有规定 RAND_MAX 的具体数值,只是规定它的值至少为 32767。在实际编程中,我们也不需要知道 RAND_MAX 的具体值,把它当做一个很大的数来对待即可。

#include <stdio.h>
#include <stdlib.h> //使用<stdlib.h>头文件中的 rand() 函数
int main()
{

      int chosen=0;  //幸运数字
      chosen=rand ();  //rand来生成随机数
      int guess=0;   //储存猜测
      int count=3;    //3次机会
      printf("这是个猜谜游戏");
      printf("选一个1和20之间的数字,你一定能猜到");
      for(;count>0;--count)
      {
           printf("你有%d次机会",count);
           printf("猜猜看");
           scanf("%d",&guess);
           if(guess==chosen)
           {
                printf("恭喜你猜对了"); 
                return 0;
            } 

            else if(guess<1||guess>15999)
            printf("请输入一个1-20的数字");

            else  
            printf("你输入的%d是不对的,你的数字 %s ",guess,chosen>guess?"小了":"大了");




       } 

     printf("你尝试了3次都失败了幸运数字是%d",chosen);
     return 0;

 } 

乍看之下,这似平并没有让猜数游戏改变多少,因为每次执行程序时,必须产生个不同的种子值。此时可以使用另一个库函数:在<time.h>头文件中声明的函数 timeo。timeo!函数会把自1970年1月1日起至今的总秒数返回为一个整数,因为时间永不停歇,所以每次执行程序时,都会得到不同的值。imeO函数需要一个参数NULL,NUL是在< stdlib.h>中定义的符号,表示不引用任何内容。NULL的用法和含义详见第7章因此,要在每次执行程序时得到不同的伪随机序列数,可以使用以下的语句:

#include <stdio.h>
#include <stdlib.h> 
#include <time.h>
int main()
{

      srand(time(NULL));  //使用时钟值作为起始种子
      int limit=20;      //伪随机值上限
      int chosen=0;
      chosen=rand()% limit;  // 0到限制-1(含)
      int guess=0;   //储存猜测
      int count=3;    //3次机会
      printf("这是个猜谜游戏");
      printf("选一个1和20之间的数字,你一定能猜到");
      for(;count>0;--count)
      {
           printf("你有%d次机会",count);
           printf("猜猜看");
           scanf("%d",&guess);
           if(guess==chosen)
           {
                printf("恭喜你猜对了"); 
                return 0;
            } 

            else if(guess<1||guess>15999)
            printf("请输入一个1-20的数字");

            else  
            printf("你输入的%d是不对的,你的数字 %s ",guess,chosen>guess?"小了":"大了");




       } 

     printf("你尝试了3次都失败了幸运数字是%d",chosen);
     return 0;

 }