あなたのグレードは最も短い木材によって決まりますか? 傾斜した状態での体積の計算(ソースコード付き)

バレル理論と呼ばれる次のような有名な理論があります。

バケツにどれだけの水を入れることができるかは、バケツの最も短い木材によって決まります。木製の樽に水を入れるには、各板が均等に水平で損傷がない必要があり、樽の板の 1 つが平らでなかったり、特定の板の下に穴があったりすると、樽に水を入れることができません。

樽にどれだけの水を入れることができるかは、最も長い木片ではなく、最も短い木片によって決まります。ショートボード効果とも言えます。どのような組織でも直面する可能性のある共通の問題は、組織を構成するさまざまな部分に異なる利点と欠点があり、不利な部分が組織全体のレベルを決定することがよくあるということです。したがって、社会全体、そして私たち一人ひとりが自分の「ショートボード」について考え、できるだけ早くそれを補う必要があります。

(内容は事典より抜粋)

ここで疑問が生じますが、この理論にはバグがあるようです。バレルを傾けることができる可能性はありますか?

(インターネットからの抜粋です、ドージ) 

0e4593500314243e30dcff778d7df70d.jpeg

 えー、試してみてもいいようなのでこんなコードを書いてみました

'''
程序计算你学习情况,将八科组成一个木桶,计算木桶中可装的水
可能并不是最大值,因为木桶只会像向某一科目倾斜
标准输入最大为100
科目排列情况:
    语文
历史    政治
地理    生物
物理    化学
    数学
'''
#Yourouchour制作
import tkinter
from math import pi
class yyshu():
    def __init__(self):
        self.shu = '''
程序计算你学习情况,将八科组成一个木桶,计算木桶中可装的水
可能并不是最大值,因为木桶只会像向某一科目倾斜
标准输入最大为100
你的打分不是学分,而是根据学情和主观判断所打的分
不然语文数学天然偏高,语文扣的分天然多
科目排列情况:
    语文
历史      政治
地理      生物
物理      化学
    数学
'''
        
    def 排列(self,wd,line):
        tkinter.Label(self.ck, text=f' 请输入你的{wd}情况:').grid(row=line, column=0)
        a = tkinter.Entry(self.ck)
        a.grid(row=line,column=1)
        return a
    
    def 帮助(self):
        b = tkinter.Tk()
        b.title('帮助')
        tkinter.Label(b,text=self.shu).pack()

    def 输出(self,wd):
        text=f'''你最大可装的水有{round(wd,3)}
是{round(wd/(100*pi),3)}个学霸
是{round(wd/(80*pi),3)}个学生
是{round(wd/(60*pi),3)}个学渣
继续努力哦'''
        b = tkinter.Tk()
        b.title('计算结果')
        b.geometry('200x120')
        tkinter.Label(b,text=text).pack()

    
    def 窗口(self):
        self.ck = tkinter.Tk()
        self.ck.title('计算你的木桶')

        f = tkinter.Frame(self.ck)
        tkinter.Button(f,text='帮助',command=self.帮助).pack(side='left',anchor='nw',expand=True,fill='x')
        tkinter.Button(f,text='计算',command=self.计算).pack(side='left',anchor='nw',expand=True,fill='x')
        f.grid(row=0,column=0,columnspan=2)
        self.语文 = self.排列('语文',1)
        self.数学 = self.排列('数学',2)
        self.历史 = self.排列('历史',3)
        self.地理 = self.排列('地理',4)
        self.生物 = self.排列('生物',5)
        self.政治 = self.排列('政治',6)
        self.物理 = self.排列('物理',7)
        self.化学 = self.排列('化学',8)
        tkinter.mainloop()
        
    def 计算(self):
        try:
            语文 = int(self.语文.get())
            数学 = int(self.数学.get())
            历史 = int(self.历史.get())
            地理 = int(self.地理.get())
            生物 = int(self.生物.get())
            物理 = int(self.物理.get())
            化学 = int(self.化学.get())
            政治 = int(self.政治.get())
            fuzhu = [i>=0 for i in (语文, 数学, 历史, 地理, 生物, 物理, 化学, 政治)]
            if all(fuzhu):
                jieguo = [self.计算辅助(语文, 数学, (历史, 政治), (地理, 生物), (物理, 化学))]
                jieguo.append(self.计算辅助(历史,化学,(语文,地理),(政治,物理),(生物,数学)))
                jieguo.append(self.计算辅助(地理,生物,(历史,物理),(数学,语文),(政治,化学)))
                jieguo.append(self.计算辅助(物理,政治,(地理,数学),(历史,化学),(语文,生物)))
                print(jieguo)
                self.输出(max(jieguo))
        except Exception as e:
            print(e)

    def 计算辅助(self,shu1,shu3,list1,list2,list3):
        zuixiao = []
        if shu1 < shu3:
            xiao = (0.1464466094067262*(shu3-shu1))+shu1
            zhong = (shu1+shu3)/2
            da = (0.8535533905932737*(shu3-shu1))+shu1
            zuixiao.extend(xiao-i for i in list1 if i < xiao)
            zuixiao.extend(zhong-i for i in list2 if i < zhong)
            zuixiao.extend(da-i for i in list3 if i < da)
        elif shu1 > shu3:
            xiao = (0.1464466094067262*(shu1-shu3))+shu3
            zhong = (shu1+shu3)/2
            da = (0.8535533905932737*(shu1-shu3))+shu3
            zuixiao.extend(xiao-i for i in list3 if i < xiao)
            zuixiao.extend(zhong-i for i in list2 if i < zhong)
            zuixiao.extend(da-i for i in list1 if i < da)
        else:
            zuixiao.extend(shu1-i for i in list3 if i < shu1)
            zuixiao.extend(shu1-i for i in list2 if i < shu1)
            zuixiao.extend(shu1-i for i in list1 if i < shu1)
        zx = max(zuixiao, default=0)
        return (pi/2)*(shu1+shu3-2*zx)
if __name__ == '__main__':
    yyshu().窗口()

 このプログラムでは、仮想バレル (モデリングなし) を作成し、8 つの科目の成績を計算しました。

多くの浮動小数点数が表示されます。これは、データが手動で計算されているためです (したがって、間違っている可能性があります。8 つの主題は計算が簡単なので、9 つの代わりに 8 つの主題を選択したのはそのためです)。 2 の平方根に似た数値を区切る電卓

もちろん、インターフェイスは非常に醜く、名前は非常に不規則で、プログラムはわかりにくいので、使用できる限り、二次開発は期待していません...

実際、これら 8 つの主題の配置が合理的であるかどうかは特に明確ではなく、プログラムはどの主題が最良であるかを返しませんが、コンソールは 4 つのケースの計算である 4 つのデータを出力します。計算補助の最初の 2 つのパラメータ

おすすめ

転載: blog.csdn.net/2301_77245958/article/details/130041604