C语言从零开始(十)-循环基础for

程序设计中,必不可少的就是循环。今天我们介绍一个最基本的实现循环的算法。

下面这幅图就是用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可以根据需要省略,但两个“;”不能省略。

具体流程如下:

for循环流程

下面我们看看如何打印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;
}

执行结果:

1~100

很简单吧,我们加点难度,每行打印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,执行结果如下:

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语句

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容