高一上册信息技术 综合练习(二) 逐字稿-4,009字
师:同学们,今天我们一起来学习编程计算综合练习2。上一节课我们验证了两个数字猜想,这节课通过另外两个打印图形的实例,进一步掌握编程计算基本知识的应用。第一个任务是打印一棵如图的树,上面有三个三角形,分别是五行、七行、九行的星号,下面的树干是一列10个星号。大家能发现,这三个三角形是相似的。根据上节课的经验,只要编写一个函数,根据参数n打印n行三角形,就能通过调用三次画出这棵树。
师:我们先观察其中一个五行的等腰三角形。第一行是1个星号,第二行是3个星号,第三行是5个星号,第四行是7个星号,第五行是9个星号。大家思考一下,行号和每行的星号数量有关联吗?如果是i行,应该有多少个星号?
生:行号和每行星号的数量是2乘i减1的关系。
师:非常好。大家试着写打印一个三角形的代码。老师也编写了一段代码,大家思考一下,结合你们自己的代码,看看这样写是否合理。变量i的范围是1到n,表示行号;变量j通过循环控制每行打印的数量,比如i等于3时,j是0到4,打印5个星号。大家在自己电脑上编写一下,试一试。
生:老师,这个代码打印出来的是什么图形?
师:打印出来的图形不是我们想要的三角形。这是为什么呢?主要是因为我们用的print方法默认打印一次就自动换行。也就是说,代码中每次打印完一个星号就换行,所以星号都在一列里。那如何实现不换行呢?print方法有个参数end,用来设定以什么结尾,如果不写,默认值是换行符“\n”,我们可以换成其他字符串,比如用双引号空字符串来结尾,就能实现不换行。大家把代码改一下,看看能不能打印成三角形。
师:老师已经把代码改成这样了,你们改的也是这样吗?我们再来运行一下。但是运行后,所有星号都在一行里,这又是为什么呢?
生:因为每次打印都不换行,打印完一行后也没有及时换行。
师:对的。那这个代码还应该怎么改呢?
生:可以给程序增加一句只用来换行的print语句,print以换行符结尾。
师:非常好。那请问这个语句应该放在程序的哪一行呢?大家先在自己计算机上尝试一下。
生:每行打印结束就应该换行,所以这个语句应该和for j循环对齐,表示for j循环完,也就是一行星号打印完就换行。
师:没错。大家现在再试试这个代码,看看是不是我们要打印的三角形。大家可能会发现,虽然是三角形,每行的星号数量也符合要求,但它不是等腰三角形,为什么呢?
生:因为还需要每行打印一定的空格,这样才能保证星号的位置形成等腰三角形。
师:对。那要打印多少空格呢?大家会发现每行的空格不停地减少,而且每次减少一个。之前每行的星号和行号有关联,现在每行的空格和行号有没有关系呢?
生:行号每次增加1,空格每次减少1,可以用一个固定的值减去行号,就是空格数量。
师:老师用40减去i来表示空格数量。我们可以这样写代码,每行一开始先打印40减i个空格,注意这里打印不能换行,然后再打印2乘i减1个星号,最后再换行,这样就能打印出等腰三角形了。然后我们只要再调用两次函数打印出另外两个三角形,并运用循环语句打印出树干,整个图形就打印好了。这个图形打印起来不容易,大家需要控制每行的数量和换行的时机,希望大家多多练习。如果对打印的图形不熟悉,可以通过下面几个实例练习。第一个是打印平行四边形,特点是每行星号固定,主要控制好每行空格。第二个是打印菱形,难点在于找到行号和每行个数的关系。第三个是打印九九乘法表,特点是打印内容不只是星号,还有具体数值以及数值间的运算。通过打印图形,我们对如何控制打印有了了解,接下来看另外一个实例。老师希望大家能打印出一个日历,比如输入2020年8月,打印出对应的日历。对于这个综合问题,大家可能不知从何入手,我们先观察日历的组成。第一行打印周日到周六的文字,从第二行开始打印数字。2020年8月1号是周六,所以要先打印6个空白区域,再打印1号,后面依次打印日期,每行7个数字,因为本月有31天,所以要打印31个数字。观察好后,大家思考一下,要打印某年某月的日历,需要知道哪些信息呢?
生:首先需要知道该月有多少天,这决定了打印的数量;第二个需要知道该月第一天是周几,这决定了打印的起始位置。
师:非常好。那该月有多少天比较好确定,一三五七八十二月为31天,四六九十一月为30天,特殊的是二月,如果是闰年就是29天,如果不是就是28天。对于如何判断一个月是闰年,大家在分支语句里已经接触过。老师再给出闰年的概念:能够被4整除,但不能被100整除,或者能被400整除的年份为闰年。也就是说,决定一个月有多少天,有两个因素,月份和年份,主要在2月份起作用。对于第二个问题,该月1号是周几,怎么解决呢?大家思考一下。如果用数学思维,最好能推导出一个公式,根据日期算出对应的星期。历史上有很多数学家推导过,比如著名的吉米拉尔森公式,但推导对我们来说比较复杂。我们可以换个思路,利用计算机运算速度快的特点,从特定的某一天开始模拟经过的日子,来算对应的星期。我们找一些特殊日历观察,比如1900年1月,它特殊在1900年1月1日是周一。我们观察到1月1日开始的第7天、第14天、第21天、第28天都是周日,它们都是7的倍数。也就是说,如果第x天是7的倍数,那肯定是周日,我们可以用取模的形式,如果对7取模余数为0,那它就是周日。同理,我们观察周三的数据,有什么特点呢?