下面代码出现错误,请你分析帮我纠错改正,但是不要改变代码变量:import random
import tkinter # 导入图形库
import math # 导入数学库
result=0
class Calculator:
# 类的构造函数
ans=result
def __init__(self):
myWindow = tkinter.Tk() # 创建窗体
myWindow.title("三角形面积") # 设置窗体的标题栏
# 变量初值为0
self.v1 = tkinter.StringVar(value='0')
self.v2 = tkinter.StringVar(value='0')
self.v3 = tkinter.StringVar(value='0')
self.v4 = tkinter.StringVar(value='0')
# 布局输入模块
myFrame1 = tkinter.Frame(myWindow)
myFrame1.grid(row=1, column=1, pady=10) # 放到窗体的1行1列,上下间隔10像素
tkinter.Label(myFrame1, text="数组长度").pack(side='left')
tkinter.Entry(myFrame1, width=5, textvariable=self.v1, justify='right').pack(side='left')
tkinter.Label(myFrame1, text="数组").pack(side='left')
tkinter.Entry(myFrame1, width=5, textvariable=self.v2, justify='right').pack(side='left')
tkinter.Label(myFrame1, text="第K小").pack(side='left')
tkinter.Entry(myFrame1, width=5, textvariable=self.v3, justify='right').pack(side='left')
# 布局输出模块
myFrame2 = tkinter.Frame(myWindow)
myFrame2.grid(row=2, column=1, pady=10) # 放到窗体的2行1列,上下间隔10像素
tkinter.Button(myFrame2, text="结果", command=self.calcArea).pack(side='left')
# 输出面积。因为Lable无法让用户复制运算结果,所以改用Entry文本框。
tkinter.Entry(myFrame2, width=20, textvariable=self.v4, justify='right').pack(side='right')
# 交换两个元素
def swap(self,a, b):
temp = a
a = b
b = temp
return a, b
# 选择排序
def select_sort(self,a, p, r):
for i in range(p, r):
index = i
for j in range(i + 1, r + 1):
if a[j] < a[index]:
index = j
a[i], a[index] = swap(a[i], a[index])
# 将x作为基准数将数组分割,返回x的位置
def partition(self,a, p, r, x):
i = p - 1 #i指向首元素的前一个位置
j = r + 1 #j指向尾元素的后一个位置
while True:
while a[i + 1] < x and i < r: #i从基准数右边的元素开始找,直到找到第一个大于等于基准数的元素
i += 1
while a[j - 1] > x and j > p: #j从尾元素开始找,直到找到第一个小于等于基准数的元素
j -= 1
if i >= j: #若i>=j,说明基准数的位置已找到,为j
break
a[i], a[j] = swap(a[i], a[j]) #交换两个元素,使得基准数左边的数均不大于它,右边的数均不小于它
return j #返回基准数的位置
# 找每组的中位数,返回中位数的位置i
def search_mid(self,a, p, r):
b = a[p:r+1] #建立与数组a同等大小的数组b,用数组b存放数组a(注意此时b的首地址为0,而a的首地址为p)
select_sort(b, 0, len(b) - 1) #将数组b排序,b[(r-p+1)/2]为中位数
mid = b[(r - p + 1) // 2]
for i in range(p, r + 1):
if a[i] == mid:
return i
return 0
# 线性划分
def select(self,a, p, r, k):
if r - p < 5:
select_sort(a, p, r)
return a[p + k - 1]
# 分成n/5组,每组5个,找到每组的中位数并将它放到数组首元素的位置
for i in range((r - p - 4) // 5 + 1):
mid = search_mid(a, p + 5 * i, p + 5 * i + 4)
a[p + i], a[mid] = swap(a[p + i], a[mid])
# 找到各组中位数的中位数
x = select(a, p, p + (r - p - 4) // 5, (r - p - 4) // 10 + 1)
# 按照中位数划分
i = partition(a, p, r, x)
#求较小数数组的长度
len_group = i - p + 1
#若较小数数组的长度小于等于k,说明第k小的元素在这个数组内,将其递归
if k <= len_group:
return select(a, p, i, k)
else: # //否则,说明第k小的元素在较大数数组,将其递归
return select(a, i + 1, r, k - len_group)
def calcArea(self):
n = eval(self.v1.get())
a = eval(self.v2.get())
k = eval(self.v3.get())
result = select(a, 0, n - 1, k)
self.v4=result
# 启动窗体,等待输入。
tkinter.mainloop()
if __name__ == "__main__":
Calculator()
最新发布