人人都能学会的编程入门课
胡光
原百度高级算法研发工程师
立即订阅
953 人已学习
课程目录
已更新 15 讲 / 共 32 讲
0/2登录后,你可以任选2讲全文学习。
开篇词 (1讲)
开篇词 | 别闹了,学编程 ≠ 学语言
免费
语言基础篇 (13讲)
01 | 学习编程,我到底该选择哪门语言?
02 | 第一个程序:教你输出彩色的文字
03 | 判断与循环:给你的程序加上处理逻辑
04 | 随机函数:随机实验真的可以算 π 值嘛?
05 | 数组:一秒钟,定义 1000 个变量
06 | 字符串:彻底被你忽略的 printf 的高级用法
做好闭环(一):不看答案可能就白学了
07 | 指针系列(一):记住,指针变量也是变量
08 | 指针系列(二):记住,指针变量也是变量
09 | 函数:自己动手实现低配版 scanf 函数
10 | 预处理命令(上):必须掌握的“黑魔法”,让编译器帮你写代码
11 | 预处理命令(下):必须掌握的“黑魔法”,让编译器帮你写代码
做好闭环(二):函数是压缩的数组,数组是展开的函数
测试篇 (1讲)
期中测试 | 给语言基础篇交一份满分答卷,去迎接新的挑战!
人人都能学会的编程入门课
登录|注册

03 | 判断与循环:给你的程序加上处理逻辑

胡光 2020-01-09
你好,我是胡光,咱们又见面了。不知道上一讲的内容,你自己做练习了么?你是否还觉得 C 语言枯燥无味呢?不管你有没有练习,我都还要啰嗦下,学习编程,就像是学骑自行车,你只看别人怎么骑,你只看自行车的原理,那永远也不可能学会骑自行车,对于你来说,唯一的捷径就是多练习,多思考。在上一讲小试牛刀之后,今天我将带你领略一下算法和逻辑层面的小惊喜。

今日任务

先来看看今天这 10 分钟我们要完成的任务。日期这个概念你肯定不陌生,生日对你我来说都很重要,如果你身边有 2 月 29 号过生日的小伙伴,恐怕最少 4 年,才能为他 / 她办一次生日宴。今天我们的这个任务,就和日期有关系。如果我给你一个由年月日组成的日期,再给你一个数字 X,你能否准确地让程序输出 X 天后的日期呢?
例如下面这个数据:
1989 11 20
20
1989 12 10
数据中给出了 1989 年 11 月 20 日这个日期,然后问你 20 天后的日期是多少,你的程序应该输出 1989 年 12 月 10 日。特别需要注意的是,在这个任务中,你需要考虑到闰年中 2 月份的特殊性,闰年的 2 月有 29 天。今天我们就学习,如何用计算机解决这类任务吧。

必知必会,查缺补漏

根据对任务的理解,我们可以分成两步来思考这个问题:
第一步:我们来思考如何求解 1 天后的日期,在求解 1 天后日期的过程中,我们涉及到的核心问题就是判断日子是否跨月,月份是否跨年,即判断;
第二步:是要让计算机重复 X 次 1 天后日期的计算过程,即重复循环做这件事。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《人人都能学会的编程入门课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(7)

  • 徐洲更
    作业地址: https://github.com/xuzhougeng/learn-c-in-JKSJ/blob/master/jksj-c-03.c

    我今天写作业的时候,明明觉得自己的逻辑好像是对的,但是结果错了,应该如何debug呢? 特别是写了那么长的代码的时候。

    作者回复: 看到你的代码了,对于 switch...case 的整体结构理解很准确。debug 的话,可以尝试如下三种方式:
    1. 心算推理法,通过看代码找 bug,这个通常适用于经验丰富的老手。
    2. 关键步骤输出信息,在程序中,找到关键的位置,输出相关变量的值,通过程序输出找错误。
    3. 借助调试工具,IDE 一般都带有自己的单步调试工具,Linux 下面可以借助 gdb 进行调试。

    2020-01-09
    3
  • Paradise
    思路清晰,语言干练,通俗易懂,做了几年前端看老师的文章一样觉得很有收获!

    作者回复: d(^_^o)

    2020-01-13
    2
  • Geek_Andy_Lee00
    老师您好,我的没有输出。编译没有错误,也和老师的代码对比了,不知道哪里出错了,麻烦老师有时间帮忙看下,谢谢 代码如下:
    #include <stdio.h>

    int main() {
    int y, m, d, X;
    scanf("%d%d%d", y, m, d);
    scanf("%d", X);
    int i;
    for(i = 0; i < X; i++) {
    d += 1;
    switch (m) {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12: {
    if (d > 31) d = 1, m += 1;
    if (m == 13) m = 1, y += 1;
    }; break;
    case 2: {
    if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) {
    if (d > 29) d = 1, m += 1;
    if (m == 13) m = 1, y += 1;
    }
    else if (d > 28) {
    d = 1, m += 1;
    }
    } break;
    case 4:
    case 6:
    case 9:
    case 11: {
    if (d > 30) d = 1, m += 1;
    if (m == 13) m = 1, y += 1;
    } break;
    }
    }
    printf("%d%d%d", y, m, d);
    return 0;
    }

    作者回复: 读入的时候,变量前面需要加&符号

    2020-01-13
    1
  • 行问
    请教下,C 语言的编码规范有什么推荐的,专栏中的代码代码规范是如何进行的?

    作者回复: C语言的专门的编码规范在国内不太多,基本都是参考一些流行的C++的编码规范。

    2020-01-09
    1
    1
  • 凡眼看世界
    为什么我写出来的九九乘法表换行后,每一行各隔了5/4/3/2/1/0行?请老师帮忙指正

    #include<stdio.h>

    int main()
    {
    int a,b;
    for(b=1;b<=6;b++){

    for(a=1;a<=6;a++)
    if(a>b){
    printf("\n");
    }
    else printf("%d*%d=%d\t",a,b,a*b);
    }
    }

    作者回复: 看后面文章中我的参考答案。你的程序不管外层循环是多少,内层循环都执行6次,并且只要是不输出课件内容的时候,这6次你就输出换行,当然就会出现你所说的现象了。

    2020-02-05
  • sam
    #include <stdio.h>

    int main()
    {
    int y,m,d,x;
    scanf("%d%d%d", &y, &m, &d);
    scanf("%d", &x);

    for (int i = 0; i < x; i++)
    {
    d++;
    if ( 1 == m || 3 == m || 5 == m || 7 == m || 8 == m || 10 == m || 12 == m )
    {
    if ( 31 < d )
    {
    m++;
    d = 1;
    }

    if ( 13 == m )
    {
    m = 1;
    y++;
    }
    }
    else if ( 2 == m )
    {
    if ( ( y % 4 == 0 && y % 100 != 0 ) || y % 400 == 0 )
    {
    if ( 29 < d )
    {
    m++;
    d = 1;
    }
    }
    else
    {
    if ( 28 < d )
    {
    m++;
    d = 1;
    }
    }
    }
    else
    {
    if ( 30 < d )
    {
    m++;
    d = 1;
    }
    }
    }

    printf("%d%02d%02d\n", y, m, d);
    return 0;
    }

    作者回复: 正确,能改写成switch...case结构的程序就更好了!

    2020-02-02
  • rocedu
    还是从语法角度讲循环。我觉得可以从应用模式讲一下更好。循环应用有两类:
    1. 固定次数的
    2. 事件驱动的,会使用到条件语句

    这更体现编程不仅仅是语言。

    作者回复: 嗯,你说的这些内容,可以放到讲完循环基本语法以后的总结部分。d(^_^o)

    2020-02-02
收起评论
7
返回
顶部