本节作业: 选课系统

角色:学校、学员、课程、讲师
要求:
1. 创建北京、上海 2 所学校
2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
3. 课程包含,周期,价格,通过学校创建课程 
4. 通过学校创建班级, 班级关联课程、讲师
5. 创建学员时,选择学校,关联班级
5. 创建讲师角色时要关联学校, 
6. 提供两个角色接口
7. 学员视图, 可以注册, 交学费, 选择班级,
8. 讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员列表 , 修改所管理的学员的成绩 
9. 管理视图,创建讲师, 创建班级,创建课程

10. 上面的操作产生的数据都通过pickle序列化保存到文件里

程序为B+,做个标记,后期对程序做调整

已经对程序重新做了一遍,查看请移步-》》http://www.cnblogs.com/lianzhilei/p/5985333.html

程序:

1、最最重要的readme:

  1. ### 作者介绍:
  2. * authorlzl
  3. ### 博客地址:
  4. * http://www.cnblogs.com/lianzhilei/p/5813986.html
  5.  
  6. ### 功能实现
  7. 1. 创建北京、上海 2 所学校
  8. 2. 创建linux , python , go 3个课程 linux\py 在北京开, go 在上海开
  9. 3. 课程包含,周期,价格,通过学校创建课程
  10. 4. 通过学校创建班级, 班级关联课程、讲师
  11. 5. 创建学员时,选择学校,关联班级
  12. 5. 创建讲师角色时要关联学校,
  13. 6. 提供两个角色接口
  14. 6.1 学员视图, 可以注册, 交学费, 选择班级,
  15. 6.2 讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员列表 修改所管理的学员的成绩
  16. 6.3 管理视图,创建讲师, 创建班级,创建课程
  17. 7. 上面的操作产生的数据都通过pickle序列化保存到文件里
  18. (所有功能均实现)
  19.  
  20. ###程序需知
  21. 1. 当前数据库已建立好信息,可以直接进行查看增加
  22. 北京 课程:Python 讲师:金角大王 班级:S14 学员:我要学python
  23. 课程:Linux 讲师:银角大王 班级:L01 学员:我要学Linux
  24. 上海 课程:Go 讲师:天棚元帅 班级:G01 学员:我要学GO
  25. 2. 也可以把database下的两个数据库文件删除掉,数据清空,执行程序,数据库进行初始化,初始化只生成北京、上海学校名
  26. 3. 数据库结构main_dict 储存主要的逻辑结构:
  27. {学校名:{课程名1:{"teacher":讲师,"grade":班级},课程名2:{"teacher":讲师2"grade":班级2}},
  28. 学校名:{课程名3:{"teacher":讲师3"grade":班级3},课程名4:{"teacher":讲师4"grade":班级4}}}
  29. 存储的数据类型都为实例对象
  30. 数据库结构teacher_dict 存储讲师与班级的对应关系,用于方便讲师登录系统认证,结构为
  31. {讲师:{grade:班级}
  32. 两个数据库文件均可扩展
  33. 4. 程序实现了以下严格限制:
  34. ①一个学校里面不能出现同名的课程
  35. ②一个课程只能有一个讲师
  36. ③讲师被聘用后,不能再进行聘用,一个讲师也只能教一门课程(教python,就不能再教linux了)
  37. ④班级只能对应一门课程,班级名只能出现一次,不能重复(python班级s14linux的班级就不能再出现s14班级了)
  38.  
  39. ###后期扩展
  40. 程序没有定义学生类,后期可定义类,添加学生属性(年龄,成绩),对可学生成绩信息进行修改,把功能添加到教师中心,很显然
  41. 我没时间了。。。。。
  42. 程序按功能分出不同的模块,可以更简洁

Readme

2、程序目录结构

3、数据库:

main_dict和teacher_dict两个数据库文件可不创建,运行程序自动生成

  1. �}q (c__main__
  2. School
  3. q)�q}q(X nameqX 北京qX addrqX 北京市qub}q(c__main__
  4. Course
  5. q )�q
  6. }q(X priceqX 9900q
  7. hX PythonqX timeqX 7qub}q(X teacherqc__main__
  8. Teacher
  9. q)�q}q(X roleqX 讲师qX schoolqhhX 金角大王qX ageqX 33qX courseqX PythonqubX gradeqc__main__
  10. Grade
  11. q)�q }q!(hhX studentq"cbuiltins
  12. set
  13. q#]q$�q%Rq&hX Pythonq'hX S14q(ubuh )�q)}q*(hX 9000q+hX Linuxq,hX 8q-ub}q.(hh)�q/}q0(hhhhhX 银角大王q1hX 25q2hX Linuxq3ubhh)�q4}q5(hh1h"h#]q6�q7Rq8hX Linuxq9hX L01q:ubuuh)�q;}q<(hX 上海q=hX 上海市q>ub}q?h )�q@}qA(hX 8000qBhX GoqChX 9qDub}qE(X teacherqFh)�qG}qH(hX 讲师qIhh=hX 天蓬元帅qJhX 25qKhX GoqLubX gradeqMh)�qN}qO(hhJh"h#]qP�qQRqRhX GoqShX S01qTubusu.

main_dict

  1. �}q (c__main__
  2. Teacher
  3. q)�q}q(X roleqX 讲师qX schoolqX 北京qX nameqX 金角大王q X ageq
  4. X 33qX courseqX Pythonq
  5. ub}qX gradeqc__main__
  6. Grade
  7. q)�q}q(X teacherqh X studentqcbuiltins
  8. set
  9. q]qX 我要学pythonqaqRqhX PythonqhX S14qubsh)�q}q(hX 讲师qhX 北京qhX 银角大王q h
  10. X 25q!hX Linuxq"ub}q#X gradeq$h)�q%}q&(hh hh]q'X 我要学linuxq(a�q)Rq*hX Linuxq+hX L01q,ubsh)�q-}q.(hX 讲师q/hX 上海q0hX 天蓬元帅q1h
  11. X 25q2hX Goq3ub}q4X gradeq5h)�q6}q7(hh1hh]q8X 我要学go语言q9a�q:Rq;hX Goq<hX S01q=ubsu.

teacher_dict

4、程序main.py

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. #-Author-Lian
  4.  
  5. import pickle,os
  6. BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  7. #数据地址
  8. __db_main = BASE_DIR + r"\database\main_dict"
  9. __db_teacher = BASE_DIR + r"\database\teacher_dict"
  10.  
  11. class School(object):
  12. #创建学校
  13. def __init__(self,name,addr):
  14. self.name = name
  15. self.addr = addr
  16.  
  17. def cat_school(self):
  18. print("学校名:【%s】\t地址:【%s】"%(self.name,self.addr))
  19.  
  20. def hire_teacher(self,dict,course,teacher,file):
  21. #数据库添加讲师信息
  22. dict[self][course] = {"teacher":teacher}
  23. file_oper(file,"wb", dict)
  24.  
  25. def create_course(self,dict,course,file):
  26. # 数据库添加课程资料
  27. dict[self][course]={}
  28. file_oper(file,"wb", dict)
  29.  
  30. def create_grade(self,dict,teacher_dict,course,grade,teacher,file1,file2):
  31. #数据库添加班级信息
  32. dict[self][course]["grade"] = grade
  33. file_oper(file1, "wb", dict)
  34. teacher_dict[teacher] = {"grade":grade}
  35. file_oper(file2, "wb", teacher_dict)
  36.  
  37. class Course():
  38. #创建课程
  39. def __init__(self,name,price,time):
  40. self.name = name
  41. self.price = price
  42. self.time = time
  43.  
  44. def cat_course(self):
  45. #查看课程信息
  46. print("课程:【%s】\t价格:【¥%s】\t周期:【%s个月】"
  47. %(self.name,self.price,self.time))
  48.  
  49. class Grade():
  50. # 创建班级
  51. def __init__(self,name,course,teacher):
  52. student = set([])
  53. self.name = name
  54. self.course = course
  55. self.teacher = teacher
  56. self.student = student
  57.  
  58. def cat_grade(self):
  59. #查看班级信息
  60. print("班级:【%s】\t课程:【%s】\t讲师:【%s】"
  61. %(self.name, self.course, self.teacher))
  62.  
  63. def add_student(self,student_name,dict,teacher,file):
  64. self.student.add(student_name)
  65. dict[teacher]={"grade":self}
  66. file_oper(file, "wb", dict)
  67.  
  68. class People():
  69. def __init__(self,name,age):
  70. self.name = name
  71. self.age = age
  72.  
  73. class Teacher(People):
  74. # 创建讲师
  75. def __init__(self,name,age,school,course,role="讲师"):
  76. super(Teacher,self).__init__(name,age)
  77. self.role = role
  78. self.school = school
  79. self.course = course
  80.  
  81. def cat_teacher(self):
  82. #查看老师资料和课程
  83. print('课程【%s】\t讲师【%s】'%(self.course,self.name))
  84.  
  85. def file_oper(file,mode,*args):
  86. #数据库写入、读取操作
  87. if mode == "wb":
  88. with open(file, mode) as f:
  89. dict = args[0]
  90. f.write(pickle.dumps(dict))
  91.  
  92. if mode == "rb":
  93. with open(file, mode) as f:
  94. dict = pickle.loads(f.read())
  95. return dict
  96.  
  97. def information(dict,mode,*args):
  98. '''通过匹配mode模式,打印相应的输出信息'''
  99. if args:
  100. dict_info, set_info = {}, args[0]
  101. else:
  102. dict_info,set_info = {},set([])
  103. if dict:
  104. for key in dict:
  105. if mode == "course":
  106. key.cat_course()
  107. if mode == "main":
  108. key.cat_school()
  109. if mode == "teacher" and key == "teacher":
  110. dict[key].cat_teacher()
  111. # dict_info[key] = dict[key]
  112. set_info.add(dict[key].name)
  113. if mode == "grade" and key == "grade":
  114. dict[key].cat_grade()
  115. set_info.add(dict[key].name)
  116. if mode == "teacher_center":
  117. pass
  118. if type(key) != str: #key值不是字符串
  119. dict_info[key.name] = key
  120. return dict_info,set_info
  121.  
  122. def school_center():
  123. #学校管理中心
  124. Flag = True
  125. while Flag:
  126. dict_main = file_oper(__db_main,"rb") #主字典
  127. res_dict = information(dict_main,"main")[0] #打印学校信息
  128. school_name = input("\33[34;0m输入要选择的学校名\33[0m:").strip()
  129. if school_name in res_dict:
  130. school = res_dict[school_name] #匹配选择的学校
  131. while Flag:
  132. print("\33[32;1m欢迎进入【%s】学校\33[0m".center(50, "*")%school.name)
  133. choice = options(list_school) #打印当前选项
  134. if choice == "1":
  135. while True:
  136. print("\33[32;0m学校【%s】目前已经有的班级信息\33[0m".center(40, "-")%school.name)
  137. teacher_dict = file_oper(__db_teacher,"rb")
  138. res_course = information(dict_main[school], "None")[0]
  139. set_info = set([])
  140. if res_course: # 打印课程与讲师对应关系
  141. for i in res_course:
  142. k = res_course[i]
  143. res_grade = information(dict_main[school][k], "grade",set_info)[1]
  144. if_cont = input("\n\33[34;0m是否要创建班级 【y】创建 【b】退出\33[0m:")
  145. if if_cont == "y":
  146. grade_name = input("\33[34;0m输入要创建班级的名称\33[0m:").strip()
  147. course_name = input("\33[34;0m输入要班级要上的课程\33[0m:").strip()
  148. if course_name in res_course:
  149. course = res_course[course_name]
  150. if dict_main[school][course]:
  151. teacher = dict_main[school][course]["teacher"]
  152. if grade_name not in res_grade:
  153. grade = Grade(grade_name, course_name, teacher.name)
  154. school.create_grade(dict_main, teacher_dict, course, grade, teacher, __db_main,
  155. __db_teacher)
  156. else:
  157. print("\33[31;0m错误:当前班级已经存在\33[0m")
  158. else:
  159. print("\33[31;0m错误:当前课程还没有讲师\33[0m")
  160. else:
  161. print("\33[31;0m错误:课程【%s】不存在,请先创建课程\33[0m" % course_name)
  162. if if_cont == "b":
  163. break
  164.  
  165. if choice == "2":
  166. #招聘讲师
  167. while True:
  168. print("\33[32;0m学校【%s】目前已经有的课程与讲师\33[0m".center(40, "-")%school.name)
  169. res_course = information(dict_main[school],"None")[0]
  170. set_info = set([])
  171. if res_course: #打印课程与讲师对应关系
  172. for i in res_course:
  173. k = res_course[i]
  174. res_teacher = information(dict_main[school][k], "teacher",set_info)[1]
  175. if not res_teacher:
  176. print("课程【%s】\t讲师【None】" %(i))
  177. if_cont = input("\n\33[34;0m是否要招聘讲师 【y】招聘 【b】退出\33[0m:")
  178. if if_cont == "y":
  179. teacher_name = input("\33[34;0m输入要招聘讲师的名字\33[0m:").strip()
  180. teacher_age = input("\33[34;0m输入要招聘讲师的年龄\33[0m:").strip()
  181. course_name = input("\33[34;0m输入讲师【%s】要授课的课程\33[0m:"%teacher_name).strip()
  182. if course_name in res_course:
  183. course = res_course[course_name] #创建讲师并写入数据库
  184. if teacher_name not in res_teacher:
  185. teacher = Teacher(teacher_name,teacher_age,school.name,course_name)
  186. school.hire_teacher(dict_main, course, teacher, __db_main)
  187. else:
  188. print("\33[31;0m错误:教师【%s】已经被聘用\33[0m" %teacher_name)
  189. else:
  190. print("\33[31;0m错误:课程【%s】不存在,请先创建课程\33[0m" %course_name)
  191. if if_cont == "b":
  192. break
  193.  
  194. if choice == "3":
  195. #创建课程
  196. while True:
  197. print("\33[32;0m学校【%s】目前已经有的课程\33[0m".center(40,"-")%school.name)
  198. res_dict = information(dict_main[school],"course")[0] #打印课程信息赋值给字典course_dict
  199. if_cont = input("\n\33[34;0m是否要创建课程 【y】创建 【b】退出\33[0m:")
  200. if if_cont == "y":
  201. course_name = input("\33[34;0m输入要创建的课程\33[0m:").strip()
  202. if course_name not in res_dict: #课程不存在,创建
  203. price = input("\33[34;0m输入课程 【%s】 的价格\33[0m:" % (course_name))
  204. time = input("\33[34;0m输入课程 【%s】 的周期(月)\33[0m:" % (course_name))
  205. course = Course(course_name, price, time) #创建课程course
  206. school.create_course(dict_main,course, __db_main) #关联学校和课程
  207. else: #课程存在
  208. print("\33[31;0m错误:当前课程 【%s】 已经存在\33[0m" % (course_name))
  209. if if_cont == "b":
  210. break
  211.  
  212. if choice == "4":
  213. Flag = False
  214. if Flag:
  215. print("\33[31;0m错误:输入的学校 【%s】 不存在\33[0m"%(school_name))
  216.  
  217. def teacher_center():
  218. #讲师中心
  219. print("\33[32;1m欢迎进入讲师中心\33[0m".center(50, "*"))
  220. teacher_dict = file_oper(__db_teacher, "rb")
  221. dict_info = information(teacher_dict,"teacher_center")[0] #验证登录
  222. teacher_name = input("\n\33[34;0m输入要登录讲师的名字\33[0m:").strip()
  223. if teacher_name in dict_info:
  224. while True:
  225. print("\33[32;1m欢迎进入讲师【%s】的管理中心\33[0m".center(40, "*")%teacher_name)
  226. choice = options(list_teacher)
  227. teacher = dict_info[teacher_name]
  228. grade = teacher_dict[teacher]["grade"]
  229. if choice == "1":
  230. print("\33[32;0m讲师【%s】的班级信息\33[0m".center(40,"-")%teacher.name)
  231. print("学校【%s】\t课程【%s】\t班级【%s】\t"%(teacher.school,teacher.course,grade.name))
  232. any = input("\n\33[34;0m输入任意键退出当前\33[0m:")
  233. if choice == "2":
  234. print("\33[32;0m讲师【%s】的班级学员列表\33[0m".center(40, "-") % teacher.name)
  235. print("班级【%s】\n学员【%s】"%(grade.name,grade.student))
  236. any = input("\n\33[34;0m输入任意键退出当前\33[0m:")
  237. if choice == "3":
  238. break
  239. else:
  240. print("\33[31;0m错误:讲师【%s】 不存在\33[0m"%(teacher_name))
  241.  
  242. def student_center():
  243. #学员中心
  244. print("\33[32;1m欢迎进入学员中心中心\33[0m".center(50, "*"))
  245. while True:
  246. choice = options(list_student) #打印学生中心选项
  247. if choice == "1":
  248. student_name = input("\33[34;0m输入学员的名字\33[0m:")
  249. dict = file_oper(__db_main, "rb")
  250. teacher_dict = file_oper(__db_teacher,"rb")
  251. school_dict = information(dict,"main")[0] #打印当前可选的学校
  252. school_name = input("\33[34;0m输入要选择的学校名\33[0m:").strip()
  253. if school_name in school_dict:
  254. school = school_dict[school_name]
  255. if dict[school]:
  256. course_dict = information(dict[school],"course")[0] # 打印当前学校下的课程
  257. course_name = input("\33[34;0m输入要选择的课程\33[0m:").strip()
  258. if course_name in course_dict:
  259. course = course_dict[course_name]
  260. if dict[school][course].get("grade"):
  261. for i in teacher_dict:
  262. if course.name == i.course:
  263. teacher = i
  264. grade = teacher_dict[teacher]["grade"]
  265. print("课程【%s】的费用为【%s】"%(course.name,course.price))
  266. if_pay = input("\33[34;0m是否支付当前费用 支付【y】\33[0m:")
  267. if if_pay == "y": #上面全部匹配成功,选课成功
  268. grade.add_student(student_name,teacher_dict,teacher,__db_teacher)
  269. print("\33[31;0m选课成功\33[0m")
  270. any = input("\n\33[34;0m输入任意键退出当前\33[0m:")
  271. else:
  272. print("\33[31;0m错误:课程没有班级\33[0m")
  273. else:
  274. print("\33[31;0m错误:课程不存在\33[0m")
  275. else:
  276. print("\33[31;0m错误:当前学校没有课程\33[0m")
  277. if choice == "2":
  278. break
  279.  
  280. def options(list):
  281. #打印可选择的操作模式,并返回选择值
  282. for i, v in enumerate(list):
  283. print(i+1, v)
  284. choice = input("\33[34;0m选择要进入模式\33[0m:")
  285. return choice
  286.  
  287. def start():
  288. '''程序开始'''
  289. while True:
  290. print("\33[35;1m欢迎进入选课系统\33[0m".center(50, "#"))
  291. choice = options(list_main) #打印选项
  292. if choice == "1":
  293. student_center() #学生中心
  294. if choice == "2":
  295. teacher_center() #教师中心
  296. if choice == "3":
  297. school_center() #学校中心
  298. if choice == "4":
  299. break
  300.  
  301. def init_database():
  302. '''数据库初始化,不存在则创建,存在跳过'''
  303. bj = School("北京","北京市")
  304. sh = School("上海","上海市")
  305. if not os.path.exists(__db_teacher):
  306. dict = {bj:{},sh:{}}
  307. file_oper(__db_main,"wb",dict)
  308. if not os.path.exists(__db_teacher):
  309. dict = {}
  310. file_oper(__db_teacher,"wb",dict)
  311.  
  312. if __name__ == '__main__':
  313. init_database() #初始化数据库
  314. list_main = ["学生中心", "讲师中心", "学校中心","退出"]
  315. list_school = ["创建班级", "招聘讲师", "创建课程","返回"]
  316. list_teacher = ["查看班级", "查看班级学员列表","返回" ]
  317. list_student = ["学员注册","返回"]
  318. start()

5、程序运行过程的简略图

*********************学校中心***********************

*********************学生中心***********************

*********************讲师中心***********************

Python开发程序:选课系统的更多相关文章

  1. Python开发程序:选课系统-改良版

    程序名称: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...

  2. python面向对象编程小程序- 选课系统

    选课系统 花了一晚上写的,可能还存在不足 1.程序框架 2.文件夹建立 D:/选课系统 |___api | |___common_api.py |___bil | |___common.py |___ ...

  3. [ python ] 作业:选课系统

    功能代码实现源地址:https://www.cnblogs.com/lianzhilei/p/5832691.html    如有侵权,立即删除 本文主要是分析 选课系统 实现思路及上面代码的实现过程 ...

  4. python实现学生选课系统 面向对象的应用:

    一.要求: 选课系统 管理员: 创建老师:姓名.性别.年龄.资产 创建课程:课程名称.上课时间.课时费.关联老师 使用pickle保存在文件 学生: 学生:用户名.密码.性别.年龄.选课列表[].上课 ...

  5. python day 12: 选课系统

    目录 python day 12 1. 通过类来创建选课系统 1.1 类库models.py 2. 配置文件setting.py 3. administrator.py 4. student.py p ...

  6. Python全栈开发:选课系统实例

    程序目录: bin文件夹下为可执行文件:administrator,students config文件夹下为设置文件,涉及系统参数配置:setting db文件夹为数据类文件,涉及系统的输入输出数据: ...

  7. Python开发程序:生产环境下实时统计网站访问日志信息

    日志实时分析系统 生产环境下有需求:要每搁五分钟统计下这段时间内的网站访问量.UV.独立IP等信息,用直观的数据表格表现出来 环境描述: 网站为Nginx服务,系统每日凌晨会对日志进行分割,拷贝到其他 ...

  8. Python开发程序:FTP程序

    作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp se ...

  9. (转)Python开发程序:支持多用户在线的FTP程序

    原文链接:http://www.itnose.net/detail/6642756.html 作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ...

随机推荐

  1. BZOJ4584 : [Apio2016]赛艇

    首先将值域离散化成$O(n)$个连续段. 设$f[i][j][k]$表示第$i$个学校派出的数量在第$j$个连续段,在第$j$个连续段一共有$k$个学校的方案数.用组合数以及前缀和转移即可. 时间复杂 ...

  2. mysql建表建索引

    建表: CREATE TABLE `sj_projects` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL ...

  3. android service 如何弹出dialog

    在service中弹出toast,需要使用handler, handler.post(new Runnable() { @Override public void run() { Toast.make ...

  4. Leetcode Sqrt(x)

    参考Babylonian method  (x0  越接近S的平方根越好) class Solution { public: int sqrt(double x) { ) ; , tolerance ...

  5. Button 设置适应不同版本 旋转以后大小相应的改变

    很多时候对于不同的版本,随设备的旋转以后,相应的Button的大小如果不做相应的改变,这很影响视图的美观和布局:下面是小编的个人看法  UIButton *button = [[UIBtton all ...

  6. Jquery实现下拉联动表单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 【POJ】2420 A Star not a Tree?

    http://poj.org/problem?id=2420 题意:给n个点,求一个点使得到这个n个点的距离和最短,输出这个最短距离(n<=100) #include <cstdio> ...

  8. BZOJ3636: 教义问答手册

    Description “汉中沃野如关中,四五百里烟蒙蒙.黄云连天夏麦熟,水稻漠漠吹秋风.”——摘自 黄裳<汉中行>“泉岭精神不朽,汉中诸球永生.”——摘自<泉岭精神创立者语录> ...

  9. 创建 maven 本地仓库

    在 pom.xml 添加依赖包的时候,有时候会提示无法从 http://repo1.maven.org/maven2/ 获取的情况,这时可配置个本地仓库: 从网上下载 maven 仓库网站源码包 Ne ...

  10. Ohana Cleans Up

    Ohana Cleans Up Description Ohana Matsumae is trying to clean a room, which is divided up into an n  ...