人人都能学会的编程入门课
胡光
原百度高级算法研发工程师
19410 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 38 讲
开篇词 (1讲)
人人都能学会的编程入门课
15
15
1.0x
00:00/00:00
登录|注册

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

你好,我是胡光,咱们又见面了。不知道上一讲的内容,你自己做练习了么?你是否还觉得 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/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了C语言中的判断与循环的基础知识,通过一个具体的任务引入,帮助读者快速了解了C语言中的条件判断语句和循环语句的使用方法。文章详细讲解了条件判断语句“if...else”的语法结构和条件表达式的概念,以及循环语句“while”和“for”的语法结构和使用方法。通过具体的代码示例,读者可以学习如何在C语言中实现逻辑判断和重复执行功能。此外,文章还提到了闰年的规则和如何将思路转换成程序过程。总体而言,本文通过实际任务的引入和具体的代码示例,帮助读者快速了解了C语言中判断与循环的基础知识,并展示了如何运用这些知识解决实际问题。值得注意的是,文章还强调了程序的执行顺序对于理解程序的重要性,为读者提供了重要的技术指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《人人都能学会的编程入门课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(58)

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

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

    2020-01-13
    10
  • Noya
    #include <iostream> using namespace std; int year, month, day; int x; bool isLeap() { if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) return true; return false; } int calcMonth() { switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 2: { if (isLeap()) return 29; else return 28; } default: return 30; } } void calc(int x) { int surplus = calcMonth() - day; if (surplus >= x) { printf("%d %d %d", year, month, day + x); return; } else { x -= surplus; day = 0; month++; if (month > 12) { year++; month = 1; } calc(x); } return; } int main(void) { printf("Please enter the start date!\n"); scanf("%d%d%d", &year, &month, &day); printf("Please enter the number of days!\n"); scanf("%d", &x); calc(x); return 0; }

    作者回复: 赞,你这种解答,倒是挺新鲜的。Y(^_^)Y

    2020-04-26
    9
  • 研发
    1.乘法表 #include <stdio.h> int main() { for(int i= 1;i<=6;i++){ for(int j=1;j<=i;j++){ if(j==i){ printf("%d*%d=%d",j,i,i*j); }else{ printf("%d*%d=%d\t",j,i,i*j); } } printf("\n"); } return 0; } 2.日期计算 #include <stdio.h> int main(){ int y,m,d; int x; scanf("%d%d%d",&y,&m,&d); scanf("%d",&x); for(int i=0;i<x;i++){ d+=1; switch(m) { case 1: case 3: case 5: case 7: case 8: case 10: if(d>31){ d=1; m+=1; } break; case 12:{ if(d>31){ d=1; m+=1; } if(m==13){ m=1; y+=1; } break; } case 6: case 9: case 11: if(d>30){ d=1; m+=1; } break; case 2: if(y%4==0&&y%100!=0||y%400==0){ if(d>29){ d=1; m+=1; } }else{ if(d>28){ d=1; m+=1; } } } } printf("%d-%d-%d\n",y,m,d); return 0; }

    作者回复: perfect!!完全正确!

    2020-03-03
    5
    5
  • 罗耀龙@坐忘
    茶艺师学编程 花了好几天才把这节课给消化完······ 在补全课文的例子时卡了很久,到了后来才发现,switch···case···语句的case是要把switch的情况给穷举了,对应与课文中的例子,switch(m),月的情况,对应就要有case1、case2、case3、······、case9、case10、case11、case12。 这里是补全的代码: #include <stdio.h> int main() { int y, m, d, X; // 定义存储 年月日 和 X 的变量 scanf("%d%d%d", &y, &m, &d); // 读入年月日 scanf("%d", &X); // 读入 X 值 for (int i = 0; i < X; i++) { // 循环 X 次,每次向后推一天 d += 1; switch (m) { //这里是以月(m)的情况做处理 ,一年有12个月,因此下面的Case要有12个(这里卡了我好久啊) case 1: case 3: case 8: case 7: case 10: case 12: case 5: { // 第一部分逻辑 31天的月份处理 if (d > 31) d = 1, m += 1; if (m == 13) m = 1, y += 1; }; break; case 4: case 11: case 9: case 6: { // 第二部分逻辑 30天的月份处理 if (d > 30) d = 1, m += 1; } break; case 2: { // 第三部分逻辑 2月的处理 if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) { if (d > 29) d = 1, m += 1; } else if (d > 28) { d = 1, m += 1; } } break; } } printf("%d %d %d\n", y, m, d); return 0; } 作业题,按照格式打印1-6的乘法表。我分阶段的遇到一下问题: 不知道如何生成乘法表 生成的乘法表有有重复的部分 生成的乘法表不懂得换行 每一道坎我都花了一天·······但还是出来了。 尤其是我想到用变量c来控制乘法表的换行,并真的实现的时候,真的很有成就感。 但不过1秒,我觉得这代码还得该:行的间距太大了····· 这是代码: #include <stdio.h> int main() { int a,b,c; //三个变量,第三个是用来控制格式的 for (b = 1 ; b <= 6 ; b++ ){ //这里处理乘法表(1-6)的部分 for (a=1;a<=b;a++)printf(" %d * %d = %d\t",a,b,a*b); for (c=1; c<=6;c++)printf("\n"); //这里处理展示格式的 } return 0; }

    作者回复: 很不错了!c循环内部,输出6个换行,着实没有必要。其实输出1和换行即可。

    2020-04-24
    3
  • Jinlee
    老师您好,我的没有输出。编译没有错误,也和老师的代码对比了,不知道哪里出错了,麻烦老师有时间帮忙看下,谢谢 代码如下: #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
    3
  • 徐洲更
    作业地址: 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
  • Never give up
    今天学习了if–else 分支语句,while 以及for 循环,虽然作业自己没有独立完成,在借鉴其他同学的答案后顺利运行了程序,一直觉得自己没有什么编程逻辑,尽管可能天赋不如别人,但努力学,敲代码,加理解,一步步来。

    作者回复: 加油!d(^_^o)

    2020-03-27
    2
  • 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
    1
  • rocedu
    还是从语法角度讲循环。我觉得可以从应用模式讲一下更好。循环应用有两类: 1. 固定次数的 2. 事件驱动的,会使用到条件语句 这更体现编程不仅仅是语言。

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

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

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

    2020-01-09
    2
    1
收起评论
显示
设置
留言
58
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部