【卡码网Python基础课 10.平均绩点】

题目描述与分析

题目描述:
每门课的成绩分为A、B、C、D、F五个等级,为了计算平均绩点,规定A、B、C、D、F分别代表4分、3分、2分、1分、0分。

输入描述:
有多组测试样例。每组输入数据占一行,由一个或多个大写字母组成,字母之间由空格分隔。

输出描述:
每组输出结果占一行。如果输入的大写字母都在集合{A,B,C,D,F}中,则输出对应的平均绩点,结果保留两位小数。否则,输出“Unknown”。

一、字符串的使用

在Python中,字符串既可以使用单引号’',也可以使用双引号""来创建,并且Python中没有字符类型,即便只有一个字符,也是作为一个字符串来使用。

str1 = "hello,world"
str2 = "a"

可以使用 + 操作符来拼接字符串:

s = "Hello" + " " + "World"
print(s)  # 输出 'Hello World'

可以通过索引获取字符串中的字符,或者进行切片操作来获取子字符串:

s = "Hello World"
print(s[0])     # 输出 'H'
print(s[-1])    # 输出 'd'
print(s[0:5])   # 输出 'Hello'

字符串遍历也是使用for循环

str1 = "Hello"
# 使用 for 循环遍历字符串中的字符
for char in str1:
      print(char, end = " ")
# 输出结果:H e l l o

切片操作和列表切片操作类似。

str1 = "Hello,World!"

# 使用切片操作获取子字符串
sub_string = str1[0:5]  # 获取从索引0到索引4的子字符串,不包括索引5的字符
print(sub_string)  # 输出结果:Hello

# 省略起始和结束索引来获取整个字符串
full_string = str1[:]
print(full_string)  # 输出结果:Hello,World!

# 使用步长来获取间隔字符
step_string = str1[0::2]  # 从索引0开始,每隔2个字符获取一个字符

此外,字符串也提供了一系列对字符串的操作方法,常见的有以下几种:
使用len()获取字符串的长度。

my_string = "Hello,World!"
length = len(my_string)  # 返回 12

split(): 将字符串分割成子字符串并返回一个列表,默认情况下,使用空格作为分隔符。
join(): 将列表中的字符串连接成一个新的字符串,你可以指定连接符号,比如下面的示例。

persons = ["tom", "jerry", "mike"]
text = " ".join(persons)
# 将列表中的字符串以空格连接在一起,相当于split的反向操作,"tom jerry mike"

replace(): 用于替换字符串中的指定子字符串。

str1 = "Hello, World!"
str2 = str1.replace("World", "Python")  # 替换 "World" 为 "Python"

二、代码编写

根据题目要求,有多组测试用例,每组输入数据占一行,也就是说要接收一行数据作为一个字符串,这需要使用input()来完成

while True:
    try:
        # 获取一行字符串作为输入
        s = input()
    except:
        break

想要计算平均绩点,我们需要计算一行数据的分数总和,再除以数据的个数,所以需要定义变量sum_grade表示分数总和,count表示数据的个数

sum_grade = 0 # 分数总和
count = 0 # 分数的个数

接着遍历字符串

for char in s:
      # 遍历字符串

如果是A则转换成4分,B转换成3分,C转换成2分,D转换成1分,F转换成0分,如果输入的内容不在{A, B, C, D, F}中,则输出Unknown, 对用不同的情况需要使用不同的代码进行处理,可以借助if-else进行解决。

for char in s:
    if char == 'A': # 如果输入的字符是A, 总分增加4,数据量 + 1
        sum_grade += 4
        count += 1
    elif char == 'B': #  如果输入的字符串是B, 总分增加3, 数据量 + 1
        sum_grade += 3
        count += 1
    elif char == 'C': #  如果输入的字符串是B, 总分增加3, 数据量 + 1
        sum_grade += 2
        count += 1
    elif char == 'D': # 如果输入的字符串是D, 总分增加1, 数据量 + 1
        sum_grade += 1
        count += 1
    elif char == 'F': # 如果输入的字符串是D, 总分增加1, 数据量 + 1
        count += 1
    elif char == ' ': # 如果输入的字符串是空格,则不对当前的字符串做任何处理,继续遍历下一个字符
        continue
    else: # 如果输入的字符串不在{A, B, C, D, F}中,则输出"Unknown", 并跳出执行这一行字符串
        print("Unknown")
        break

最后我们需要按照题目的输出格式输出,题目要求我们输出对应的平均绩点,结果保留两位小数,也就是说sum_grade / count的结果是浮点数,并且需要格式化为两位小数。

想要在Python中输出保留两位小数的数字,可以使用format()方法, format()方法通常用于字符串中的占位符替换,占位符通常用花括号 {} 表示。你可以将占位符插入到字符串中,然后使用 format() 方法来将实际值插入这些占位符。

number = 3.1415926
# {}是一个占位符,输出结果时会将format()参数里的内容替换在{}中,:.2f 表示保留两位小数
formatted_number = "{:.2f}".format(number)
print(formatted_number)

所以只需要在for循环之后加上下面的代码

for char in s:
    # {A, B, C, D, F}的条件判断
    # 循环结束后对 sum / count的结果进行格式化输出
print("{:.2f}".format(sum_grade / count))

这里还有个问题,当循环遇到{A, B, C, D, F}以及空格之外的字符时,会输出"Unknown", 然后退出for循环的执行,但是仍然会执行循环之后的语句,即print语句,实际上,这行代码不应该被执行,应该怎样做才能避免这行代码的执行呢?

我们知道if(条件)可以控制语句的执行,当条件为真的时候,if结构体中的代码可以执行,条件为假的时候则不用执行,所以我们可以联想到下面的形式:

if condition:
    print("{:.2f}".format(sum_grade / count))

也就是说,我们可以采用这样一种思路,事先给每一行字符串一个“真的令牌”,字符串遍历处理过程中,如果有哪一行字符串中有{A, B, C, D, F}以及空格之外的字符,则把“真令牌”替换成“假令牌”,这样当走出循环之后再进行输出处理时,就会因为不认识这个“假令牌”而不进行输出。

比如下面的示例:

# 初始化一个 "真令牌"
flag = True

# 在某种情况下真令牌被替换成假令牌
flag = False

# 无法执行下面的逻辑
if flag:
    # 在flag为True时执行的代码

不过我们经常使用0/1来代替布尔值。

flag = 1

# 在某种情况下 1 被修改为0

# flag为0,表示false, 无法执行下面的逻辑
if flag:

完整的代码如下:

while True:
    try:
        s = input()
        sum_grade = 0.0
        count = 0
        flag = 1

        for char in s:
            if char == 'A':
                sum_grade += 4
                count += 1
            elif char == 'B':
                sum_grade += 3
                count += 1
            elif char == 'C':
                sum_grade += 2
                count += 1
            elif char == 'D':
                sum_grade += 1
                count += 1
            elif char == 'F':
                count += 1
            elif char == ' ':
                continue
            else:
                flag = 0
                print("Unknown")
                break

        if flag:
            print("{:.2f}".format(sum_grade / count))

    except:
        break

三、字符串格式化输出

Python提供了多种字符串格式化的方式,其中包括百分比格式化、str.format() 方法和f-字符串(在Python 3.6及以上版本)。

使用%操作符进行格式化

name = "张三"
age = 20

formatted_string = "姓名:%s, 年龄:%d " % (name, age)
print(formatted_string)

使用%会将后面的变量name, age一一对应插入到对应的占位符上,其中%s表示字符串,%d表示整数, %f表示浮点数。

字符串format()方法
format()方法允许使用占位符{}来插入值,并使用format()方法的参数来提供要插入的值,和上面的操作符很类似。

name = "张三"
age = 20

formatted_string = "姓名:{}, 年龄:{}".format(name, age)
print(formatted_string)

f-字符串
Python3.6及以上的版本支持f-string, 以f开头,后面跟着字符串,字符串中的表达式用大括号 {} 包起来,它会将变量或表达式计算后的值替换进去。

name = "张三"
age = 20

formatted_string = f"姓名: {name},年龄:{age}"
print(formatted_string)
  • 11
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设你有一个学生类(Student),其中包含属性:姓名、学号、专业、课程成绩和学分,那么可以通过实例化方法来计算平均绩点。 以下是一个示例代码: ```python class Student: def __init__(self, name, id, major, scores, credits): self.name = name self.id = id self.major = major self.scores = scores self.credits = credits def calculate_gpa(self): total_credits = sum(self.credits) weighted_scores = sum([score * credit for score, credit in zip(self.scores, self.credits)]) gpa = weighted_scores / total_credits return round(gpa, 2) ``` 在上面的代码中,我们定义了一个学生类,其中包含了一些属性,如姓名、学号、专业、课程成绩和学分。我们还定义了一个实例化方法 `calculate_gpa()`,该方法计算并返回该学生的平均绩点。 具体来说,我们首先通过 `sum()` 函数计算出学生所修的总学分数,然后使用列表推导式计算每门课程的加权成绩(即成绩乘以学分),最后将加权成绩总和除以总学分数得到平均绩点。最后使用 `round()` 函数将平均绩点保留两位小数,然后返回结果。 使用示例: ```python # 创建一个学生对象 student = Student("张三", "20210001", "计算机科学与技术", [90, 80, 85], [3, 2, 4]) # 计算该学生的平均绩点 gpa = student.calculate_gpa() # 输出结果 print("学生姓名:", student.name) print("学号:", student.id) print("专业:", student.major) print("平均绩点:", gpa) ``` 输出结果: ``` 学生姓名: 张三 学号: 20210001 专业: 计算机科学与技术 平均绩点: 3.56 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值