程序设计中,必不可少的就是循环。今天我们介绍一个最基本的实现循环的算法。
下面这幅图就是用for循环写出的效果。
一、为什么需要循环?
程序设计中,很常用的功能就是实现各种重复性工作。计算机最大的强项就是快速地完成重复性动作。
比如说,我们需要在屏幕上打印100行“Hello World”,应该怎么做呢?当然,如果在代码里写100行printf("Hello World\n")也是可以的,但相信没有人愿意这么干。于是,实现重复执行一段代码的方法诞生了。
二、for语句
简单的for循环程序如下:
for (表达式1; 表达式2; 表达式3)
{
循环体
}
这段代码大家也许看着有些不解,它主要分为5部分:
- 关键字for
这个关键字告诉计算机后面是一段for循环代码,它后面跟着一个小括号和一个大括号
- 循环体
循环体就是需要多次执行的n行代码
- 表达式1
这个表达式只被执行一次,是for语句中第一个执行的表达式。一般用于给循环控制变量赋初值
- 表达式2
每次执行循环体之前,会执行一次表达式2,执行结果为真时进入执行循环体,如果结果为假则跳出for循环
- 表达式3
每次执行循环体后,都会执行一次表达式3。一般用于循环控制变量的修改。
注意:表达式1和表达式3可以根据需要省略,但两个“;”不能省略。
具体流程如下:
下面我们看看如何打印100次"Hello World",代码如下:
int main()
{
int i;
for (i = 0; i < 100; i++)
{
printf("%d : ", i + 1);
printf("Hello World!\n");
}
return 0;
}
是不是很简单呢?它的执行步骤是:
- 1、i = 0 初始化之前定义的变量i;
- 2、进行条件判断i是否小于100,如果条件为真,则继续执行;
- 3、两个printf语句,第一个打印当前执行的次数i + 1,第二个打印"Hello World!"并换行;
- 4、执行i++使变量i自增一次;
- 5、回到第2步继续判断。
- 6、一直循环,直到第2步判断结果为假, 之后退出循环,结束。
这里需要注意的是i的值是从0到99,一共执行了100次。所以打印次数时应该是i + 1。当然也可以这样写:
for (i = 1; i <= 100; i++)
这样也是执行100次,i的值从1到100。大家自己试试。
三、break语句
在执行过程中,如果因为一些特殊的要求,需要强行退出循环时,需要使用break语句。使用时,将break写在循环体的任何一个位置,一旦执行到这条语句,程序直接跳转到for语句大括号结束后执行后面的代码。
修改一下之前的需求,我们这次需要这样一个程序,从键盘输入数字,输入“1”打印一行“Hello World”,输入其他字符程序退出。
这个程序的设计需要注意下面几点:
- 循环体部分需要能够无限循环的执行,如果一直输入1就一直打印
- 循环体内有三个动作:从键盘读入一个数字、判断输入数字、执行打印功能
- 一旦出现需要退出的情况(输入了其他数字),需要使用break退出
代码如下:
int main()
{
int i;
int flag;
for (i = 0; 1; i++)
{
scanf("%d", &flag);
if (flag == 1)
{
printf("%d : ", i + 1);
printf("Hello World!\n");
}
else
{
break;
}
}
return 0;
}
执行结果:
当输入1时,打印一行Hello World!。最后输入了一个6,跳出循环,程序结束。
四、continue语句
continue的用法与break完全相同,只是作用稍微有些变化。执行到continue语句时,程序会放弃本次循环后面的语句,直接进入for语句的下一次循环。
我们依然是用例子来说明这个问题。
有一道最基础的题目是在屏幕上打印出从1~100。代码很简单。
int main()
{
int i;
for (i = 0; i < 100; i++)
{
printf("%d ", i + 1);
}
return 0;
}
执行结果:
很简单吧,我们加点难度,每行打印10个数,这样看的比较清楚。你知道怎么实现吗?
int main()
{
int cnt = 1;
int i;
for (i = 0; i < 100; i++)
{
printf("%d ", i + 1);
if (cnt++ % 10 == 0)
{
printf("\n");
}
}
return 0;
}
执行结果:
这段代码大家能看懂吗?
下面进入正题,我们新的需求是,在这100个数中,不打印能被10整除的数,每行打印9个数字。该怎么做呢?
我们只要在上面的代码中进行简单的修改,就是当需要打印能被10整除的数时自动跳过,直接执行下一次循环,这就轮到continue语句出厂了。
请看代码:
int main()
{
int i;
for (i = 0; i < 100; i++)
{
if ( (i + 1) % 10 == 0)
{
printf("\n");
continue;
}
printf("%d ", i + 1);
}
return 0;
}
执行结果:
前面讲的代码你们看懂了吗?下面我们就来看看用今天学到的知识能够做些什么。
五、练习题
我们设计一个程序来计算n的阶乘。
功能:任意输入一个数,打印出这个数的阶乘。
分析:
简单来说,这个程序应该分为三个部分:
- 从键盘输入一个整数
- 循环执行依次计算成绩
- 打印出计算结果
第一步和第三步大家应该已经很熟悉了,如果不清楚可以查看之前的文章。下面重点说一下第二步。请看下图:
这就是计算阶乘的流程,我们要做的就是利用循环的方法反复执行计算乘积这个动作。最终跳出循环时的结果就是计算出的阶乘。
逻辑如下:
从这张流程图我们很容易写出下面这段代码:
** 在看下面的代码之前,请先自己试着设计 **
int main()
{
int n, i;
int ret = 1;
printf("---- Calculate n! ----\n");
printf("Please input a number:\n");
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
ret *= i;
}
printf("%d! = %d", n, ret);
return 0;
}
输入4,执行结果如下:
看懂了这段程序,我们看看有没有其他的方式实现这个功能。请看这段代码:
int main()
{
int n, i;
int ret = 1;
printf("---- Calculate n! ----\n");
printf("Please input a number:\n");
scanf("%d", &n);
for (i = n; i > 0; i--)
{
ret *= i;
}
printf("%d! = %d", n, ret);
return 0;
}
同样实现了计算阶乘的功能,你能看懂这个逻辑吗?
今天就聊到这里,例子中的每段代码都要反复练习,达到熟练掌握。如果在这里领悟的不透后面就会学习得很吃力。
最后留一个作业。本文中最前面的那张图片(用*组成的三角形)你知道是如何打印出来的吗?请大家自己实现一下。
关于今天讲的内容,有任何问题欢迎mail讨论。
我是天花板,让我们一起在软件开发中自我迭代。
如有任何问题,欢迎与我联系。
上一篇:C语言从零开始(九)-选择结构
下一篇:C语言从零开始(十一)-循环while语句