CSCI 1100 - 作业 1 - 计算与字符串处理

概述

本次作业总分为100分,将计入你的总作业成绩,截止日期为2023年9月14日 ( 星期四 ) 晚上11:59:59。三个部分需分别提交。所有部分必须在截止日期前提交,否则你的程序将被视为迟交。

在开始本次作业之前,请仔细阅读提交指南文档。它将详细说明我们的期望,并回答一些常见问题,包括你需要通过 Submitty 提交程序,以及 Submitty 将在2023年9月11日 ( 星期一 ) 之前开放。

请记住,你的输出格式必须与 hw01_files.zip 文件中的示例运行结果完全一致。这样做的目的是简化测试过程,同时教会你如何使用我们提供的工具进行精确编程。我们欣赏创造力,但不要体现在作业的输出格式上!

第1部分:Mad Libs 文字游戏 ( 40分 )

在这一部分,你将编写一个 Python 程序来构建下面的 Mad Libs 文字游戏:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Good morning <proper name>!

  This will be a/an <adjective1> <noun1>! Are you <verb1> forward to it?
  You will <verb2> a lot of <noun2> and feel <emotion1> when you do.
  If you do not, you will <verb3> this <noun3>.
  
  This <season> was <adjective2>. Were you <emotion2> when <team_name> won
  the <noun4>?
  
  Have a/an <adjective3> day!

你需要使用 input 函数请求程序用户提供缺失的单词,即那些用 < > 括起来的单词。然后,你将获取所有用户指定的输入,并构建上面的 Mad Libs 文字游戏。确保你的输出看起来像上面的段落,只是缺失的信息被用户输入所填充。

文件 hw1 part1 output.txt 中提供了程序运行的示例 ( 你需要从 Submitty 的课程材料部分下载 hw01_files.zip 文件,并将其解压到你的作业1目录中 )。

我们提供了合理的输入示例,但 Mad Libs 的乐趣在于输入随机的词,看看结果有多搞笑。不妨试试看!

当然,你编写的程序只适用于我们上面提供的特定 Mad Libs 文本。一个更具挑战性的问题是,编写一个程序来读取任意的 Mad Libs 文本,弄清楚要问用户什么,询问用户并读取输入,最后生成完整的 Mad Libs。不过这需要我们学完整个学期的内容,你才能解决。

请充分测试你的代码,确保其正常工作后,将其作为 hw1_part1.py 文件提交到 Submitty,作为作业的第1部分。

第2部分:速度计算 ( 40分 )

许多运动类 App 会记录用户在步行、跑步、骑自行车或游泳时的时间和距离。有些用户想知道他们每英里的平均配速 ( 以分钟和秒为单位 ),而另一些人想知道他们每小时的平均速度 ( 以英里为单位 )。在很多情况下,我们还想知道特定距离的预计时间。例如,如果我用53分30秒跑了6.3英里,我的平均配速是每英里8分29秒,平均速度是每小时7.07英里,而跑2.7英里的预计时间是22分55秒。

在本次作业的第2部分,你需要编写一个程序,要求用户输入一次锻炼的时间 ( 分钟和秒 )、跑过的距离 ( 英里 ) 和目标距离 ( 英里 ),并计算平均配速和平均速度。

文件 hw1 part2 output.txt 中提供了程序运行的示例 ( 可以在 hw01_files.zip 文件中找到 )。

你可以假设分钟和秒都是整数,但跑过的距离和目标距离是浮点数。所有的分钟和秒必须保持整数形式,因此请使用整数除法和取模运算。例如:

1
2
3
4
>>> x = 29.52
>>> y = int(x)  
>>> print(y)
29

速度的输出应为浮点数,保留2位小数。另外请注意,我们的参考答案在输出计算结果之前会先输出一个空行。

我们将用示例中的值以及各种不同的值来测试你的代码。请充分测试你的代码,确保其正常工作后,将其作为 hw1_part2.py 文件提交到 Submitty,作为作业的第2部分。

第3部分:带框文本框 ( 20分 )

编写一个程序,要求用户输入一个作为边框的字符,以及文本框的高度和宽度,然后输出一个指定大小的文本框,并用指定的字符作为边框。此外,在文本框内水平垂直居中输出文本框的尺寸。如果无法完美垂直居中,尺寸文本应输出在靠上的位置,即上方留白行数比下方少一行。如果无法完美水平居中,尺寸文本的左侧空格应比右侧少一个。

你可以假设用户输入的值都是有效的:宽度是一个正整数 ( 7或更大 ),高度是一个正整数 ( 4或更大 ),边框字符是一个单个字符。

文件 hw1 part3 output 01.txthw1 part3 output 02.txt 中提供了程序运行的两个示例 ( 可以在 hw01_files.zip 文件中找到 )。

你需要先将文本框尺寸放入一个字符串中,然后利用字符串的长度来确定尺寸文本所在行的长度。如果你有编程经验,可能会想用循环来生成完整的边框,但 Python 提供的字符串操作功能 ( 第3课内容 ) 使得这没有必要。你不能在程序中使用任何 if 语句或循环。我们还没学过它们,而且本题并不需要,使用它们也不会让你的解决方案更优雅。

我们将用示例中的值以及各种不同的值来测试你的代码。请充分测试你的代码,确保其正常工作后,将其作为 hw1_part3.py 文件提交到 Submitty,作为作业的第3部分。

支持文件

HW1.zip /zh-cn/csci-1100-hw-1/HW1.zip

参考答案

hw1_part1.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#Prepare variables

proper_name = ""
adjective1 = ""
noun1 = ""
verb1 = ""
verb2 = ""
noun2 = ""
emotion1 = ""
verb3 = ""
noun3 = ""
season = ""
adjective2 = ""
emotion2 = ""
team_name = ""
noun4 = ""
adjective3 = ""

template= """
Good morning <proper name>!

  This will be a/an <adjective1> <noun1>! Are you <verb1> forward to it?
  You will <verb2> a lot of <noun2> and feel <emotion1> when you do.
  If you do not, you will <verb3> this <noun3>.
  
  This <season> was <adjective2>. Were you <emotion2> when <team_name> won
  the <noun4>?
  
  Have a/an <adjective3> day!"""
output = ""

#Get user's input

print("Let's play Mad Libs for Homework 1")
print("Type one word responses to the following:\n")

proper_name = input("proper_name ==> ").strip()
print(proper_name)
adjective1 = input("adjective ==> ").strip()
print(adjective1)
noun1 = input("noun ==> ").strip()
print(noun1)
verb1 = input("verb ==> ").strip()
print(verb1)
verb2 = input("verb ==> ").strip()
print(verb2)
noun2 = input("noun ==> ").strip()
print(noun2)
emotion1 = input("emotion ==> ").strip()
print(emotion1)
verb3 = input("verb ==> ").strip()
print(verb3)
noun3 = input("noun ==> ").strip()
print(noun3)
season = input("season ==> ").strip()
print(season)
adjective2 = input("adjective ==> ").strip()
print(adjective2)
emotion2 = input("emotion ==> ").strip()
print(emotion2)
team_name = input("team-name ==> ").strip()
print(team_name)
noun4 = input("noun ==> ").strip()
print(noun4)
adjective3 = input("adjective ==> ").strip()
print(adjective3)

#Construct the Mad Lib

output = template.replace("<proper name>", proper_name)
output = output.replace("<adjective1>", adjective1)
output = output.replace("<noun1>", noun1)
output = output.replace("<verb1>", verb1)
output = output.replace("<verb2>", verb2)
output = output.replace("<noun2>", noun2)
output = output.replace("<emotion1>", emotion1)
output = output.replace("<verb3>", verb3)
output = output.replace("<noun3>", noun3)
output = output.replace("<season>", season)
output = output.replace("<adjective2>", adjective2)
output = output.replace("<emotion2>", emotion2)
output = output.replace("<team_name>", team_name)
output = output.replace("<noun4>", noun4)
output = output.replace("<adjective3>", adjective3)

#Print the Mad Lib

print("\nHere is your Mad Lib...")
print(output, end="")

hw1_part2.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#Perpare Variables

minutes = 00
seconds = 00
miles = 00.00
target_miles = 00.00

pace_seconds_per_mile = 00.00
pace_seconds = 00
pace_minutes = 00

speed_mph = 00.00

target_time_total_seconds = 00.00
target_time_seconds = 00
target_time_minutes = 00

#Get User Input

minutes = str(input("Minutes ==> "))
print(minutes)
seconds = str(input("Seconds ==> "))
print(seconds)
miles = str(input("Miles ==> "))
print(miles)
target_miles = str(input("Target Miles ==> "))
print(target_miles)

#Calculate Pace

pace_seconds_per_mile = (int(minutes) * 60 + int(seconds)) / float(miles)
pace_seconds = int(pace_seconds_per_mile % 60)
pace_minutes = int(pace_seconds_per_mile // 60)

#Calculate Speed

speed_mph = float(miles) / (int(minutes) / 60 + int(seconds) / 3600)

#Calculate Target Time

target_time_total_seconds = float(target_miles) * pace_seconds_per_mile
target_time_seconds = int(target_time_total_seconds % 60)
target_time_minutes = int(target_time_total_seconds // 60)

#Print Results

print("\nPace is " + str(pace_minutes) + " minutes and " + str(pace_seconds) + " seconds per mile.")
print("Speed is {0:.2f} miles per hour.".format(float(speed_mph)))
print("Time to run the target distance of {0:.2f} miles is {1} minutes and {2} seconds.".format(float(target_miles), int(target_time_minutes), int(target_time_seconds)), end="")

hw1_part3.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#Prepare Variables
frame_character = ""
height = 0
width = 0
free_space = 0.0

#Get user input
frame_character = input("Enter frame character ==> ").strip()
print(frame_character)
height = int(input("Height of box ==> ").strip())
print(height)
width = int(input("Width of box ==> ").strip())
print(width, "\n")

#Calculate dimensions line
dimensions = str(width) + "x" + str(height)
free_space = width - 2 - len(dimensions)

#Calculate the left and right padding considering odd/even width
left_space = free_space // 2
right_space = free_space // 2 + (free_space % 2)

#Prepare rows
top_bottom_row = frame_character * width
empty_row = frame_character + " " * (width - 2) + frame_character
dimension_row = frame_character + " " * left_space + dimensions + " " * right_space + frame_character

#Calculate the number of rows before and after the dimensions row
before_rows = ((height - 2) // 2) - ((height - 1) % 2)
after_rows = height - 3 - before_rows

#Output box
print("Box:")
print(top_bottom_row)
print((empty_row + '\n') * before_rows, end="")
print(dimension_row)
print((empty_row + '\n') * after_rows, end="")
print(top_bottom_row)

相关内容

0%