第四章 for循环(一)
循环
重复执行一个语句块,直到满足某个条件为止,这称为循环
循环的工作过程
/20200623045754070.png)
递增和递减运算符
递增运算符: ++和递减运算符: --会将储存在整数变量中的值递增或递减 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);
}
解剖:
- int count=1; 声明count,初始为1
- count<=10; 在每个循环开始时计算。如果结果为true,循环就继续,否则循环就停止
- ++count 在每次循环结束时执行。他递增count,每次加1
流程图/20200709082950072.png)
for循环的一般语法
for(starting_condition;continuation_condition;action_per_iteration)
loop_statement;
next_statement;
starting_condition
这个位置通常设定循环控制变量的初始值,只执行一次 循环控制变量一般(但非必要)是一个计数器,用来追踪循环重复的次数 也可以在这里声明并初始化相同类型的多个变量,各个声明用逗号隔开 此时所有变量都是循环的本地变量,在循环结束后就不存在了
continuation_condition
在循环开始时开始测试,而不是在结束时测试 是一个结果为
true或false的逻辑表达式,用以决定循环是否继续执行 只要这个条件为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;
}