Problem 1 问题描述: 一个简化的GPA分级描述如下: 成绩分数[90,100]=绩点4.0 成绩分数[80,90)=绩点3.0 成绩分数[70,80)=绩点2.0 成绩分数[60,70)=绩点1.0 成绩分数[0,60)=绩点0 现给定输入文件scores.txt,其中每行给出两个由空格分隔的正数,第一个数表示某门课 的成绩,第二个数表示这门课程的学分数。请编写程序,计算并打印总平均绩点,显示结果 保留两位小数。 总平均绩点计算公式为: ∑(绩点*学分) 总平均绩点= ∑学分 程序文件命名:1py 解析:这个题目比较简单,大家没有什么问题,只是需要注意输入文件不能有空行,即 使是最后一行也不能为空。 Problem 2 问题描述: 输入三个由空格分隔的正整数,分别代表年、月、日。输出为一个正整数,代表该日期 是一年中的第几天。 提示:闰年的判断标准:年数能够被4但不能被100整除,或者年数能够被400整除。 输入举例: 20001130 输出举例: 335 程序文件命名:2py 解析:问题的关键是如何存储平年和闰年中12个月份的天数,这里如果同学们不使用 数组结构,问题将会变得比较繁琐。比如 def yue(n): ifn=1: return 0 if n==2: return 31 ifn=3:
Problem 1 问题描述: 一个简化的 GPA 分级描述如下: 成绩分数[90,100] = 绩点 4.0 成绩分数[80, 90) = 绩点 3.0 成绩分数[70, 80) = 绩点 2.0 成绩分数[60, 70) = 绩点 1.0 成绩分数[0, 60) = 绩点 0 现给定输入文件 scores.txt,其中每行给出两个由空格分隔的正数,第一个数表示某门课 的成绩,第二个数表示这门课程的学分数。请编写程序,计算并打印总平均绩点,显示结果 保留两位小数。 总平均绩点计算公式为: * = (绩点 学分) 总平均绩点 学分 程序文件命名:1.py 解析:这个题目比较简单,大家没有什么问题,只是需要注意输入文件不能有空行,即 使是最后一行也不能为空。 Problem 2 问题描述: 输入三个由空格分隔的正整数,分别代表年、月、日。输出为一个正整数,代表该日期 是一年中的第几天。 提示:闰年的判断标准:年数能够被 4 但不能被 100 整除,或者年数能够被 400 整除。 输入举例: 2000 11 30 输出举例: 335 程序文件命名:2.py 解析:问题的关键是如何存储平年和闰年中 12 个月份的天数,这里如果同学们不使用 数组结构,问题将会变得比较繁琐。比如 def yue(n): if n == 1: return 0 if n == 2: return 31 if n == 3:
return(31+29) ifn==4: return(31*2+29) ifn==5: return(31*2+29+30) ifn==6: return(31*3+29+30) ifn==7: return(31*3+29+30*2) ifn==8: return(31*4+29+30*2) ifn==9: return(31*5+29+30*2) ifn==10 return(31*5+29+30*3) ifn ==11: return(31*6+29+30*3) ifn==12: return(31*6+29+30*4) 可以考虑使用一个循环来简化,如下: for i in range(1,month ) if i=1 or i=3 or i=5 or i=7 or i=8 or i=10 or i=12: num=num+31 elif i=2 and isLeepYear(year): num=num+29 elif i=2 and not isLeep Year(year): num=num+28 elif i=4 or i=6 or i=9 or i=11 num=num+30 num=num+day 在这里,也可以使用一个数组来记录每个月的天数,下面的做法将会使得程序大为简化 year,month,day分别表示输入的年、月、日 if isLeepYear(year): d=[31,29,31,30,31,30,31,31,30,31,30,31] else: d=[31,28,31,30,31,30,31,31,30,31,30,31] for i in range(month-1): num=num +d[i] num num day Problem 3
return (31+29) if n == 4: return (31*2+29) if n == 5: return (31*2+29+30) if n == 6: return (31*3+29+30) if n == 7: return (31*3+29+30*2) if n == 8: return (31*4+29+30*2) if n == 9: return (31*5+29+30*2) if n == 10: return (31*5+29+30*3) if n == 11: return (31*6+29+30*3) if n == 12: return (31*6+29+30*4) 可以考虑使用一个循环来简化,如下: for i in range(1,month ): if i=1 or i=3 or i=5 or i=7 or i=8 or i=10 or i=12: num=num+31 elif i=2 and isLeepYear(year): num=num+29 elif i=2 and not isLeepYear(year): num=num+28 elif i=4 or i=6 or i=9 or i=11 num=num+30 num=num+day 在这里,也可以使用一个数组来记录每个月的天数,下面的做法将会使得程序大为简化 #year,month,day 分别表示输入的年、月、日 if isLeepYear(year): d = [31,29,31,30,31,30,31,31,30,31,30,31] else: d = [31,28,31,30,31,30,31,31,30,31,30,31] for i in range(month - 1): num = num + d[i] num = num + day Problem 3
问题描述: 编写程序,输入一个奇数,打印出一个上底和下底的长度等于的由*构成的图形,见 下例: ***水* 米家水 水家水 米*水水米 n=5 程序文件命名:3.py 解析:这个问题可以有两种分析方法: 1、首先打印一个倒置的三角形,然后打印图形的剩下的部分,代码如下: def main(): n=input("enter an odd number:" for i in range(n/2): print''*i+"*"*(n-2*i) for i in range(n/2+1): print'*(n/2-i)+"*"*(2*i计1) main() 2、根据图形的具有的上下对称的特点,通过一个循环打印出整个图形,代码如下: from math import def main(): #根据图形具有的上下对称的特点,可以将循环的范围固定为[n/2*(-I),n/2] n=input("Please input an odd number:" nl=n/2*(-1) n2=n/2 for i in range(nl,n2+1): s=""*(n2-abs(①, #这里添加每行前面的n2-川个空格 s=s+"*"*(2*abs(①十l) #这里添加每行中(2*+1)个星号 print s main() Problem 4 问题描述: 从键盘输入两个数n、a,求s(n,a)=a+aa+aaa+…+aaa之值,其中a是一个不为零的 一位数,n代表相加的项数。例如:当n=5,a=2时,s(5,2)=2+22+222+2222+22222。 程序文件命名:4.py 解析:只要弄懂加数之间的关系,就很容易写出程序
问题描述: 编写程序,输入一个奇数,打印出一个上底和下底的长度等于 n 的由*构成的图形,见 下例: ***** *** * *** ***** n=5 程序文件命名:3.py 解析:这个问题可以有两种分析方法: 1、首先打印一个倒置的三角形,然后打印图形的剩下的部分,代码如下: def main(): n=input("enter an odd number : ") for i in range(n/2): print ' '*i + "*"*(n-2*i) for i in range(n/2+1): print ' '*(n/2-i) + "*"*(2*i+1) main() 2、根据图形的具有的上下对称的特点,通过一个循环打印出整个图形,代码如下: from math import * def main(): #根据图形具有的上下对称的特点,可以将循环的范围固定为[n/2*(-1),n/2] n = input("Please input an odd number:") n1 = n/2*(-1) n2 = n/2 for i in range(n1, n2+1): s = " "*(n2-abs(i)); #这里添加每行前面的 n2-|i|个空格 s = s + "*"*(2*abs(i)+1) #这里添加每行中(2*|i|+1)个星号 print s main() Problem 4 问题描述: 从键盘输入两个数 n、a,求 s(n,a)=a+aa+aaa+…+aa…a 之值,其中 a 是一个不为零的 一位数,n 代表相加的项数。例如:当 n=5,a=2 时,s(5,2)=2+22+222+2222+22222。 程序文件命名:4.py 解析:只要弄懂加数之间的关系,就很容易写出程序
Problem 5 问题描述: 编写程序画出回归直线(能够最佳拟合点集中点的直线)。绘制一个400×400像素的图 形窗口,并且在该窗口的左下角绘制一个标记为“Sto即”的长方形按钮。程序允许用户通过 点击图形窗口定义多个点,并在图形窗口中标出鼠标点击处的位置,当用户点击“Sto即”按 钮的时候,画出通过点击定义的点的回归直线。 回归直线满足以下的定义: y=y+m(x-x) 其中 m=∑y-n) 2 ∑x2-n 其中,x代表所有点的横坐标的平均值,y代表所有点的纵坐标的平均值。 提示:程序计算回归直线与图形窗口左边和右边边界上的交点坐标,然后使用两个交点 的坐标画出直线。 程序文件命名:5py 解析:这个题目大多数同学都做了出来,但是大家的答案都不完整。问题出在第一次点 击或者第二次点击就落在方块内的情况,这两种情况都不存在回归直线特别是第二种情况, 在求m的时候,分母的值永远是0,所以应该在程序中增加对于点的数目为0和1的情况的 分析
Problem 5 问题描述: 编写程序画出回归直线(能够最佳拟合点集中点的直线)。绘制一个 400400 像素的图 形窗口,并且在该窗口的左下角绘制一个标记为“Stop”的长方形按钮。程序允许用户通过 点击图形窗口定义多个点,并在图形窗口中标出鼠标点击处的位置,当用户点击“Stop”按 钮的时候,画出通过点击定义的点的回归直线。 回归直线满足以下的定义: _ _ y y m(x x) 其中 _ _ _ 2 2 i i i x y n x y m x n x 其中, _x 代表所有点的横坐标的平均值, _y 代表所有点的纵坐标的平均值。 提示:程序计算回归直线与图形窗口左边和右边边界上的交点坐标,然后使用两个交点 的坐标画出直线。 程序文件命名:5.py 解析:这个题目大多数同学都做了出来,但是大家的答案都不完整。问题出在第一次点 击或者第二次点击就落在方块内的情况,这两种情况都不存在回归直线。特别是第二种情况, 在求 m 的时候,分母的值永远是 0,所以应该在程序中增加对于点的数目为 0 和 1 的情况的 分析