第二次作业

计算器软件设计与开发报告

2021级计科1班 张鑫 J201903210115

 

一、软件设计

(一) UI设计

张鑫设计的计算器软件将包含两个主要界面:登录界面和计算器界面。登录界面包含用户名和密码输入框以及登录按钮。计算器界面包含数字键、运算符键、等号键、清除键和历史记录按钮。

 

(图一:简易设计的计算机界面)

 

(图二:简易设计的计算机登陆界面)

 

(二) 流程图设计

使用Visio设计软件,我们可以设计出以下流程图:

  1. 登录流程图:用户输入用户名和密码,点击登录按钮,系统验证用户名和密码,如果验证成功,进入计算器界面;如果验证失败,提示错误信息。

(图一:计算器登录部分流程图)

2.计算流程图:用户输入数字和运算符,点击等号键,系统进行计算并显示结果;用户可以点击清除键清除当前输入,点击历史记录按钮查看历史计算记录。

 

(图二:计算器运算部分流程图)

(三)功能测试

针对设计功能,分别进行测试:

1.加减运算

 (图为加法运算功能测试)

 (图为减法运算功能测试)

2.乘除运算

(图为乘法运算功能测试) 

 (图为除法运算功能测试) 

3.开方运算

 (图为正数开方运算功能测试)

  (图为负数开方运算功能测试)

4.历史记录

历史记录功能测试先进行运算,随后进行归零操作,后点击历史按钮即可。

 (图为历史记录功能测试)

5.登录功能

 

(图为错误用户名和密码登录功能测试)

(图为正确用户名和密码登录功能测试)

  

二、软件开发

(一)开发环境和工具

我们选择 Python作为开发语言,使用 IDEA作为集成开发环境,使用MySQL作为数据库管理系统。

(二)关键代码

以下是登录功能的关键代码:

def login():

    username = entry_username.get()

    password = entry_password.get()

    if username == "张鑫" and password == "nb666":

        print("登录成功")

    else:

        print("用户名或密码错误")

以下是计算功能的关键代码:

def click(self, key):
if key == '=':
try:
result = eval(self.entry.get())
self.entry.delete(0, tk.END)
self.entry.insert(tk.END, str(result))
self.history.append(self.entry.get())
except:
self.entry.delete(0, tk.END)
self.entry.insert(tk.END, '错误')
elif key == '归零':
self.entry.delete(0, tk.END)
elif key == '历史':
self.entry.delete(0, tk.END)
if self.history:
self.entry.insert(tk.END, self.history[-1])
elif key == '开方':
try:
result = sqrt(float(self.entry.get()))
self.entry.delete(0, tk.END)
self.entry.insert(tk.END, str(result))
self.history.append(self.entry.get())
except:
self.entry.delete(0, tk.END)
self.entry.insert(tk.END, '错误')
else:
self.entry.insert(tk.END, key)

三、软件测试

我们将对软件进行功能测试和性能测试。功能测试主要测试登录功能和计算功能是否正常工作,性能测试主要测试软件在大量计算和大量用户登录时的性能。

 

四、 实验报告

本次实验我们设计并开发了一个计算器软件,该软件包含登录功能和计算功能,可以保存用户的历史计算记录。我们使用Python作为开发语言,使用IDLE作为集成开发环境,使用MySQL作为数据库管理系统。在测试过程中,我们发现并修复了一些问题,提高了软件的质量。

 

五、结论

通过本次实验,我们学习了软件设计和开发的基本流程,掌握了Python编程和数据库操作的基本技能,提高了我们的实践能力和解决问题的能力。

六、附录

登录器完整代码:

from tkinter import *
# 创建登录窗口
login_window = Tk()
login_window.title("登录张鑫的计算器")
# 创建用户名和密码的标签和输入框
label_username = Label(login_window, text="用户名:")
label_username.grid(row=0, column=0)
entry_username = Entry(login_window)
entry_username.grid(row=0, column=1)
label_password = Label(login_window, text="密码:")
label_password.grid(row=1, column=0)
entry_password = Entry(login_window, show="*")
entry_password.grid(row=1, column=1)
# 定义登录按钮点击事件
def login():
username = entry_username.get()
password = entry_password.get()
if username == "张鑫" and password == "nb666":
print("登录成功")
else:
print("用户名或密码错误")
# 创建登录按钮
button_login = Button(login_window, text="登录", command=login)
button_login.grid(row=2, column=0, columnspan=2)
# 运行登录窗口
login_window.mainloop()

计算器完整代码:

import tkinter as tk
from math import sqrt
import pickle
class Calculator:
def __init__(self, master):
self.master = master
self.master.title('张鑫的计算器')
self.history = []
# Load history if exists
try:
with open('history.pkl', 'rb') as f:
self.history = pickle.load(f)
except:
pass
self.entry = tk.Entry(master)
self.entry.grid(row=0, column=0, columnspan=4)
buttons = [
'7', '8', '9', '/',
'4', '5', '6', '*',
'1', '2', '3', '-',
'0', '.', '=', '+',
'开方', '归零', '历史'
]
for i, button in enumerate(buttons):
tk.Button(master, text=button, command=lambda button=button: self.click(button)).grid(row=i//4+1, column=i%4)
def click(self, key):
if key == '=':
try:
result = eval(self.entry.get())
self.entry.delete(0, tk.END)
self.entry.insert(tk.END, str(result))
self.history.append(self.entry.get())
except:
self.entry.delete(0, tk.END)
self.entry.insert(tk.END, '错误')
elif key == '归零':
self.entry.delete(0, tk.END)
elif key == '历史':
self.entry.delete(0, tk.END)
if self.history:
self.entry.insert(tk.END, self.history[-1])
elif key == '开方':
try:
result = sqrt(float(self.entry.get()))
self.entry.delete(0, tk.END)
self.entry.insert(tk.END, str(result))
self.history.append(self.entry.get())
except:
self.entry.delete(0, tk.END)
self.entry.insert(tk.END, '错误')
else:
self.entry.insert(tk.END, key)
def save_history(self):
with open('history.pkl', 'wb') as f:
pickle.dump(self.history, f)
if __name__ == '__main__':
root = tk.Tk()
calculator = Calculator(root)
root.mainloop()

posted @ 2023-11-14 11:42  yuhaui  阅读(165)  评论(0)    收藏  举报