吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1499|回复: 3
收起左侧

[Python 转载] 新人小白用Python写的调价工具

[复制链接]
KDME 发表于 2021-11-12 18:31
之前有人在做标书中碰到这样的问题,简化问题,假设报价表中有4项材料,每项材料的单价和数量都有,每项材料的单价乘以数量等于总价,每项材料的总价之和即合价,现在老板的报价低于合价,要求调整每项材料的单价,使之算出来的目标合价等于老板的报价。目的是求出每项材料的报价。
举例,材料=[甲,乙,丙,丁],单价=[11,22,3,44],数量=[1,2,3,4],总价=[11*1,22*2,3*3,44*4]=[11,44,9,176],合价=sum(总价)=11+44+9+176=240,老板的报价=200,目标单价=[11,22,3,34]。验证11*1+22*2+3*3+34*4=200=报价。所以[11,22,3,34]就是我需要的一组目标单价。
小工具的几点说明。输入数据时,两项之间可以用空格,逗号,句号等分割;几组答案是指需要几组目标单价;材料没有项数的限制,可以是4项,也可以是40项,等等;每项材料的单价设置的下浮范围是1/3.
半年都没有动它了,当时搞出来这个小工具,是非常激动地,也封装成exe文件,10M大小,小白新人,向大佬学习!




[Python] 纯文本查看 复制代码
#mbdj-0.3.py,目标单价小小程序0.2版,简化了得到的结果,减少了多余不必要的工作,并进行了包装工作,用到tkinter包。
import tkinter as tk
from tkinter.scrolledtext import ScrolledText
import re

master = tk.Tk()
tk.Label(master, text="各项数量:").grid(row=0)##################标尺
tk.Label(master, text="各项单价:").grid(row=1)
tk.Label(master, text="目标总价:").grid(row=2)
tk.Label(master, text="几组答案:").grid(row=3)
 
e1 = tk.Entry(master,width=66)
e2 = tk.Entry(master,width=66)
e3 = tk.Entry(master,width=66)
e4 = tk.Entry(master,width=66)

e1.grid(row=0, column=1, padx=10, pady=5)
e2.grid(row=1, column=1, padx=10, pady=5)
e3.grid(row=2, column=1, padx=10, pady=5)
e4.grid(row=3, column=1, padx=10, pady=5)
 
def mbdj(sl,dj,mbj,jzmbdj):#目标单价
	n = len(sl)
	xin_dj = [0]*n
	break_signal = False
	counter = 0
	result = []
	fin_result = None

	def digui(k):#递归
		nonlocal break_signal,counter
		if k >= n:
			dxhj = list(map(lambda x,y : x*y , sl, xin_dj))#单项合价
			if int(sum(dxhj)) == mbj*100:
				hy_xin_dj = [i/100 for i in xin_dj]
				result.append(hy_xin_dj)
				counter += 1
				if counter >= jzmbdj:
					fin_result = result
					text = ScrolledText(master, width=80, height=32)
					text.insert("insert",fin_result)
					text.grid(row=4,column=0,columnspan=2)
					
					break_signal = True
		else:
			for i in range(int(dj[k]*100),int(dj[k]*66.7),-1):
				xin_dj[k] = i
				if break_signal:
					break
				digui(k+1)
	digui(0)
	return fin_result

def show():
    sl = [float(i) for i in re.split('[,, ;;\t、/。\\\\]',e1.get())]
    dj = [float(i) for i in re.split('[,, ;;\t、/。\\\\]',e2.get())]
    mbj = float(e3.get())
    jzmbdj = float(e4.get())

    mbdj(sl,dj,mbj,jzmbdj)

    e1.delete(0, "end")
    e2.delete(0, "end")
    e3.delete(0, "end")
    e4.delete(0, "end")

tk.Button(master, text="获取答案", width=10, command=show).grid(row=5, column=0, sticky="w", padx=10, pady=5)
tk.Button(master, text="退出", width=10, command=master.quit).grid(row=5, column=1, sticky="e", padx=10, pady=5)
 
master.mainloop()

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| KDME 发表于 2021-11-12 21:34
本帖最后由 KDME 于 2021-11-12 21:41 编辑

工具运行图片
2021-11-12_175624.png
2021-11-12_181316.png
2021-11-12_181342.png
xinqihenyouxiu 发表于 2021-11-12 22:32
lyffer 发表于 2023-3-15 16:19
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-13 20:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表