登录
首页 >  文章 >  python教程

设计多层决策系统来确定奖学金的资格标准

来源:dev.to

时间:2024-07-12 18:18:54 464浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《设计多层决策系统来确定奖学金的资格标准》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

设计多层决策系统来确定奖学金的资格标准

问题

使用 if-else 语句设计一个多层决策系统,可用于确定奖学金的资格标准。该系统应考虑多种因素,例如成绩、课外活动和财务需求。

思考过程

要设计一个多层决策系统来根据成绩、课外活动和财务需求确定奖学金资格,您需要一种结构化的方法来评估和分配奖学金金额。以下是如何使用 if-else 语句创建决策系统的逐步细分:

奖学金决定标准

  • 财务状况:确定学生的经济困难程度。
  • 课外活动:衡量学术之外的参与程度。
  • 成绩:反映学业表现。

奖学金决定逻辑

  • 确定财务需求:检查学生是否属于高、中或低财务需求类别。
  • 评估课外活动参与情况:在每个财务需求类别中,检查学生在课外活动中的活跃程度。
  • 评估成绩:最后评估学生的成绩,以决定确切的奖学金金额。

奖学金金额

  • 高需求,高课外活动,高成绩:最高奖学金。
  • 高需求,中等课外活动,中等成绩:中等奖学金。
  • 高需求,低课外活动,低成绩:奖学金很少。
  • 中等需求,高课外活动,高成绩:大量奖学金。
  • 中等需要,中等课外活动,中等成绩:中等奖学金。
  • 中等需求,低课外活动,低成绩:最低奖学金。
  • 低需求,高课外活动,高成绩:中等奖学金。
  • 低需求,中等课外活动,中等成绩:小额奖学金。
  • 低需求,低课外活动,低成绩:无奖学金。

解决方案

def scholarship(financial_cond, extra_act, grades):
    if financial_cond >=80:
        if extra_act >=80:
            if grades >=80:
                return 5000
            if grades>= 60 and grades <80:
                return 3000
            if grades>= 40 and grades <60:
                return 2000
        if extra_act >= 60 and extra_act < 80:
            if grades >=80:
                return 4000
            if grades>= 60 and grades <80:
                return 2000
            if grades>= 40 and grades <60:
                return 1000
        if extra_act >= 40 and extra_act <60:
            if grades >=80:
                return 3000
            if grades>= 60 and grades <80:
                return 1000
            if grades>= 40 and grades <60:
                return 000
    if financial_cond >=60 and financial_cond <80:
        if extra_act >=80:
            if grades >=80:
                return 4000
            if grades>= 60 and grades <80:
                return 2000
            if grades>= 40 and grades <60:
                return 1000
        if extra_act >= 60 and extra_act < 80:
            if grades >=80:
                return 3000
            if grades>= 60 and grades <80:
                return 1000
            if grades>= 40 and grades <60:
                return 0000
        if extra_act >= 40 and extra_act <60:
            if grades >=80:
                return 2000
            if grades>= 60 and grades <80:
                return 0000
            if grades>= 40 and grades <60:
                return 000
    if financial_cond >= 40 and financial_cond <60:
        if extra_act >=80:
            if grades >=80:
                return 3000
            if grades>= 60 and grades <80:
                return 1000
            if grades>= 40 and grades <60:
                return 000
        if extra_act >= 60 and extra_act < 80:
            if grades >=80:
                return 2000
            if grades>= 60 and grades <80:
                return 000
            if grades>= 40 and grades <60:
                return 000
        if extra_act >= 40 and extra_act <60:
            if grades >=80:
                return 1000
            if grades>= 60 and grades <80:
                return 000
            if grades>= 40 and grades <60:
                return 000
    else:
        return 0

financial_cond = float(input('enter financial condition in 1 to 100 '))
extrac_act = float(input('enter the extracurricular participation in 1 to 100 '))
grades= float(input('enter the grades of the student '))

print(scholarship(financial_cond, extrac_act, grades))

其他想法

1

financial_cond = float(input('enter financial condition in 1 to 100 '))
extrac_act = float(input('enter the extracurricular participation in 1 to 100 '))
grades= float(input('enter the grades of the student '))
def scholarship():
    if financial_cond >= 80 and extrac_act >= 80 and grades >= 80:
        return 10000
    elif financial_cond >= 80 and extrac_act >= 80 and grades >= 60 and grades <80:
        return 5000
    elif financial_cond >= 80 and extrac_act >= 80 and grades >= 40 and grades < 60:
        return 2000
    elif financial_cond >= 80 and extrac_act >= 60 and extrac_act < 80 and grades >= 80:
        return 5000
    elif financial_cond >=80 and extrac_act >=60 and extrac_act < 80 and grades >= 60 and grades < 80:
        return 2000
    elif financial_cond >= 80 and extrac_act >=50 and extrac_act < 60 and grades >= 60 and grades < 80:
        return 1000
    elif financial_cond >= 60 and financial_cond < 80 and extrac_act >= 80 and grades >=80:
        return 5000
    elif financial_cond >=60 and financial_cond < 80 and extrac_act >=60 and extrac_act < 80 and grades >= 80:
        return 2000
    elif financial_cond >=60 and financial_cond < 80 and extrac_act >= 60 and extrac_act < 80 and grades >= 60 and grades < 80:
        return 1000
    else:
        return 0

scholarship()

拒绝原因:

  1. 范围和冗余:scholarship()函数不带参数,因此它依赖于直接输入的全局变量(financial_cond、extrac_act、grades)。这种设计模块化程度较低,可能会导致代码维护和测试方面出现问题。
  2. 重叠和歧义:某些条件重叠或冗余。例如,多个 elif 分支检查相似的条件,但阈值或范围略有不同,这可能会使逻辑混乱且容易出错。
  3. 逻辑复杂性:使用具有重叠条件的多个 elif 语句会产生难以理解的复杂结构。目前尚不清楚哪种情况为真以及在各种情况下最终结果会是什么。

2

def scholarship(financial_cond, extra_act, grades):
    if financial_cond >= 80:
        return high_financial(extra_act, grades)
    elif financial_cond >= 60:
        return medium_financial(extra_act, grades)
    elif financial_cond >= 40:
        return low_financial(extra_act, grades)
    else:
        return 0

def high_financial(extra_act, grades):
    if extra_act >= 80:
        if grades >= 80:
            return 5000
        elif grades >= 60:
            return 3000
        elif grades >= 40:
            return 2000
    elif extra_act >= 60:
        if grades >= 80:
            return 4000
        elif grades >= 60:
            return 2000
        elif grades >= 40:
            return 1000
    elif extra_act >= 40:
        if grades >= 80:
            return 3000
        elif grades >= 60:
            return 1000
        elif grades >= 40:
            return 0

def medium_financial(extra_act, grades):
    if extra_act >= 80:
        if grades >= 80:
            return 4000
        elif grades >= 60:
            return 2000
        elif grades >= 40:
            return 1000
    elif extra_act >= 60:
        if grades >= 80:
            return 3000
        elif grades >= 60:
            return 1000
        elif grades >= 40:
            return 0
    elif extra_act >= 40:
        if grades >= 80:
            return 2000
        elif grades >= 60:
            return 0
        elif grades >= 40:
            return 0

def low_financial(extra_act, grades):
    if extra_act >= 80:
        if grades >= 80:
            return 3000
        elif grades >= 60:
            return 1000
        elif grades >= 40:
            return 0
    elif extra_act >= 60:
        if grades >= 80:
            return 2000
        elif grades >= 60:
            return 0
        elif grades >= 40:
            return 0
    elif extra_act >= 40:
        if grades >= 80:
            return 1000
        elif grades >= 60:
            return 0
        elif grades >= 40:
            return 0

financial_cond = float(input('enter financial condition in 1 to 100: '))
extra_act = float(input('enter the extracurricular participation in 1 to 100: '))
grades = float(input('enter the grades of the student: '))

print(scholarship(financial_cond, extra_act, grades))

拒绝原因:

  1. 代码冗余:确定奖学金的逻辑在不同的财务需求类别(high_financial、medium_financial、low_financial)中重复,导致代码冗余。这可以简化以避免重复并降低不一致的风险。
  2. 函数调用的复杂性:嵌套的函数调用和多层条件使代码更难以遵循和维护。分离成不同的函数有利于模块化,但由于嵌套条件的数量可能会过多且令人困惑。
  3. 奖学金金额不一致:不同经济需求水平之间的奖学金金额决定逻辑并不总是一致,这可能会导致人们对为什么要根据特定条件给予某些奖学金金额产生潜在的困惑。

3

grades = float(input("enter the applicant's gpa : "))
extracurriculars = int(input("enter the number of extracurricular activities: "))
financial_need = input("is there a financial need? (yes/no): ").strip().lower()

eligible = true

grade_thresholds = [3.5, 3.0, 2.5] 
scholarship_level = none

for threshold in grade_thresholds:
    if grades >= threshold:
        if threshold == 3.5:
            scholarship_level = "full scholarship"
        elif threshold == 3.0:
            scholarship_level = "partial scholarship"
        elif threshold == 2.5:
            scholarship_level = "basic scholarship"
        break
else:
    eligible = false
    print("applicant does not meet the minimum grade requirement.")

if eligible:
    extracurricular_threshold = 2  # minimum number of activities required
    if extracurriculars < extracurricular_threshold:
        eligible = false
        print("applicant does not meet the extracurricular activities requirement.")

if eligible:
    while financial_need not in ['yes', 'no']:
        financial_need = input("please enter 'yes' or 'no' for financial need: ").strip().lower()

    if financial_need == 'no':
        scholarship_level = "merit-based scholarship"  # adjust the scholarship type based on no financial need

if eligible:
    print(f"the applicant is eligible for the {scholarship_level}.")
else:
    print("the applicant is not eligible for the scholarship.")

拒绝原因

  1. 过于简单化:该方法过于简单化,因为它没有考虑一系列条件,而是使用单一的成绩阈值和财务需求的二进制检查。这可能会忽略确定资格和奖学金金额时的重要细微差别。
  2. 硬编码值:奖学金级别是根据 gpa 和财务需求的二进制检查进行硬编码的,而不考虑其他因素,例如课外参与程度或更细粒度的财务需求评估。
  3. 交互处理:如果用户不输入“是”或“否”,处理财务需求输入的循环可能会导致无限循环(尽管无限循环在实践中可能是一个罕见的问题,但它是一个潜在的缺陷)。

选择解决方案的原因及其潜在缺陷

让我们回顾一下所提出的解决方案并分析其选择的原因以及潜在的缺陷:

建议的解决方案

def scholarship(financial_cond, extra_act, grades):
    if financial_cond >=80:
        if extra_act >=80:
            if grades >=80:
                return 5000
            elif grades >= 60:
                return 3000
            elif grades >= 40:
                return 2000
        elif extra_act >= 60:
            if grades >=80:
                return 4000
            elif grades >= 60:
                return 2000
            elif grades >= 40:
                return 1000
        elif extra_act >= 40:
            if grades >=80:
                return 3000
            elif grades >= 60:
                return 1000
            elif grades >= 40:
                return 0
    elif financial_cond >=60:
        if extra_act >=80:
            if grades >=80:
                return 4000
            elif grades >= 60:
                return 2000
            elif grades >= 40:
                return 1000
        elif extra_act >= 60:
            if grades >=80:
                return 3000
            elif grades >= 60:
                return 1000
            elif grades >= 40:
                return 0
        elif extra_act >= 40:
            if grades >=80:
                return 2000
            elif grades >= 60:
                return 0
            elif grades >= 40:
                return 0
    elif financial_cond >= 40:
        if extra_act >=80:
            if grades >=80:
                return 3000
            elif grades >= 60:
                return 1000
            elif grades >= 40:
                return 0
        elif extra_act >= 60:
            if grades >=80:
                return 2000
            elif grades >= 60:
                return 0
            elif grades >= 40:
                return 0
        elif extra_act >= 40:
            if grades >=80:
                return 1000
            elif grades >= 60:
                return 0
            elif grades >= 40:
                return 0
    else:
        return 0

financial_cond = float(input('Enter financial condition in 1 to 100 '))
extra_act = float(input('Enter the extracurricular participation in 1 to 100 '))
grades = float(input('Enter the grades of the student '))

print(scholarship(financial_cond, extra_act, grades))

选择理由

  1. 结构化方法:该解决方案采用多层决策流程,系统地评估财务状况、课外活动和成绩。这种结构化方法可以采用清晰、有组织的方法来确定奖学金资格。

  2. 详细评估:该解决方案涵盖了一系列具有特定阈值的条件,包括经济需求、课外活动和学业成绩,为分配奖学金金额提供了详细的框架。

  3. 模块化:通过分离不同级别的财务需求并评估这些级别内的其他标准,该解决方案引入了更易于管理和更新的模块化结构。

  4. 清晰的决策路径:嵌套的 if-else 语句创建了清晰的决策路径,明确了哪些条件导致了哪些奖学金金额。

潜在缺陷

  1. 冗余和复杂性:代码包含大量冗余。例如,对成绩和课外活动的检查会重复多次。这种冗余增加了代码的复杂性,并使其更难以维护和理解。

  2. 代码重复:每个范围的financial_cond的决策逻辑都有相似的模式,但阈值略有不同。可以通过整合通用逻辑并减少重复的代码块来避免这种重复。

  3. 硬编码值:奖学金金额和阈值是硬编码的,这使得它不灵活。如果需要更改标准或金额,则必须手动更新代码。使用配置文件或常量可以提高灵活性。

  4. 缺乏输入验证:代码不会验证输入以确保它们在预期的范围或类型内。例如,financial_cond、extra_act 和grades 预计在 1 到 100 之间,但代码不会强制或验证这一点。

  5. 边缘情况:该解决方案不能稳健地处理边缘情况。例如,如果 financial_cond、extra_act 或 grades 正好位于边界值上(例如,正好 40、60 或 80),则处理有些不明确。更清晰地处理边界情况将使决策逻辑更精确。

  6. 没有反馈或解释:该解决方案仅提供奖学金金额,并没有解释为什么给予一定金额。添加反馈或解释可以提高用户理解和透明度。

您能根据现代标准改进建议的解决方案吗? [提示:重构冗余、实现输入验证、使用常量并增强用户反馈]

高级解决方案:https://insightshub.in/design-a-multi-tier-decision-making-system-to-define-the-eligibility-criteria-for-a-scholarship/#h-advanced-solution

今天关于《设计多层决策系统来确定奖学金的资格标准》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:dev.to 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>