python练习7——PTA

Posted ~晚风微凉~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python练习7——PTA相关的知识,希望对你有一定的参考价值。

7-1 jmu-python-异常-学生成绩处理专业版 (25 分)

小明在帮助老师统计成绩,老师给他的是一组数据。数据的第1行代表学生数n,后面
的n行代表每个学生的成绩。成绩是整数类型。小明编写了一个程序,该程序可以批量
处理数据,统计所有学生的平均分。当数据没有任何错误时,提示’All OK’,当数据有
一些错误(某行是浮点数、某行是非整数字符)时,可以提示哪些数据出错,并最后提示
第几行出错,出错的原因,共出错多少行。对于另一些小错误,如某行虽然是整数,但
是左右有多余的空格,可以将空格去除掉进行正常统计。

在最后输出:
共处理多少行数据,几行正确,几行错误,平均成绩(保留两位小数)。

进阶要求:
有可能碰到要求输入n行,后面的数据却小于n行。要求处理这种情况。碰到这种情况。
输出end of files,并统计现有行数。见样例3

输入格式:
第1行为n
接下来输入<=n行数据进行测试

输出格式:
见样例输出。输出错误原因的时候,需要将整行输出(如果该行有左右空格,需要将左右空格也输出)

输入样例1:
3
1
2
3
结尾无空行
输出样例1:
Total: 3
OK: 3
Error: 0
avg grade = 2.00
结尾无空行
输入样例2:
5
1
2
a
b 5
3
结尾无空行
输出样例2:
line 3 error for input " a "
line 4 error for input " b 5"
Total: 5
OK: 3
Error: 2
avg grade = 2.00
结尾无空行
输入样例3:
5
a
2
3
结尾无空行
输出样例3:
line 1 error for input " a"
end of files
Total: 3
OK: 2
Error: 1
avg grade = 2.50
结尾无空行
提示:对于样例3,如果是在IDLE中进行测试,可在输入最后一行并回车后,按’Ctrl+D’结束输入。

此题代码后补

7-2 jmu-分段函数l (20 分)

本题目要求计算以下分段函数的值(x为从键盘输入的一个任意实数):

1.png

如果输入非数字,则输出“Input Error!”

输入格式:
在一行中输入一个实数x。

输出格式:
在一行中按”y=result”的格式输出,其中result保留两位小数。

输入样例:
-2
结尾无空行
输出样例:
在这里给出相应的输出。例如:

y=3.00
结尾无空行

try:
        x=float(input())
        if x<=-2:
            ans=(-2*x)-1
        elif x>-2 and x<=1:
            ans=3
        elif x>1:
            ans=2*x+1
        print("y=:.2f".format(ans))
        exit(0)
except Exception as result:#这个加域不加,以及break在try里是否能用
        print("Input Error!")

7-3 jmu-python-简单计算器 (20 分)

输入一个表达式字符串,计算其结果

输入格式:
行1:输入字符串数目
下面分别输入要计算的表达式
输出格式:
输出计算结果,结果保留2位小数。对于异常数据能输出相应异常信息。

输入样例1:
4
1+1
56-23
5/3
5*3.5
结尾无空行
输出样例1:
2.00
33.00
1.67
17.50
结尾无空行
输入样例2:
3
ab+23
2/0
23+36f
结尾无空行
输出样例2:
NameError
ZeroDivisionError
SyntaxError
结尾无空行

times = int(input())
for _ in range(times):
    exp = input()
    try:
        result = eval(exp)
    except NameError:
        print("NameError")
    except ZeroDivisionError:
        print("ZeroDivisionError")
    except SyntaxError:
        print("SyntaxError")
    else:
        print("%.2f"%result)

7-4 JMU-Python-分段函数 (20 分)

本题目要求根据以下分段函数的定义,计算输入的x对应的y值,输出结果保留两位小数;如果输入的x是非数值型数据,输出’Input Error’。注意:使用math库

Snap5.bmp

输入格式:
在一行中输入x的值。

输出格式:
按“f(x) = result”的格式输出,其中x与result都保留两位小数,注意’='两边有空格。

如果输入的x是非数值型数据,输出:Input Error

输入样例1:
1.5
结尾无空行
输出样例1:
f(1.50) = 4.55
结尾无空行
输入样例2:
-4
结尾无空行
输出样例2:
f(-4.00) = 0.00
结尾无空行
输入样例3:
abc
结尾无空行
输出样例3:
Input Error
结尾无空行

import math as m
def demo1(x):
    if x > 0:
        y = m.cos(x) + m.exp(x)
    elif x==0:
        print("0.00")
    else:
        y = 0
    print("f(%.2f) = %.2f" %(x,y))
try:
    x = float(input())
    demo1(x)
except Exception as result:
    print("Input Error")#居然是这个!感叹号,我要注意细节啊!

7-5 JMU-Python-分段函数 (20 分)

本题目要求根据以下分段函数的定义,计算输入的x对应的y值,输出结果保留两位小数;如果输入的x是非数值型数据,输出’Input Error’。注意:使用math库

Snap6.bmp

输入格式:
在一行中输入x的值。

输出格式:
按“f(x) = result”的格式输出,其中x与result都保留两位小数,注意’='两边有空格。

如果输入的x是非数值型数据,输出:Input Error

输入样例1:
4
结尾无空行
输出样例1:
f(4.00) = 3.39
结尾无空行
输入样例2:
-6
结尾无空行
输出样例2:
f(-6.00) = 0.00
结尾无空行
输入样例3:
x
结尾无空行
输出样例3:
Input Error
结尾无空行

import math as m
try:
    x=float(input())
    if x<=0:
        ans=0
    else:
        ans=m.log(x)+m.sqrt(x)
    print("f(:.2f) = :.2f".format(x,ans))
except Exception as result:
    print("Input Error")

7-6 jmu-python-查成绩 (10 分)

从键盘输入一个学生所有课程的成绩,输入格式为”课程名:成绩“,每门课占一行,以空行结束。随后提示”请输入要查询的课程:“,用户从键盘输入课程名,查询并输出该课程的成绩,要求进行异常处理,对不存在的课程进行捕捉处理。

输入格式:
输入学生所有课程的成绩,每门课占一行,格式为”课程名:成绩“,以空行结束 在提示后输入课程名

输出格式:
如果课程存在,直接输出成绩,否则提示”没有该门课程“

输入样例1:
数学:96
英语:82
计算机:76
思政:90

计算机
结尾无空行
输出样例1:
请输入要查询的课程:
76
结尾无空行
输入样例2:
数学:96
英语:82
计算机:76
思政:90

数学a
结尾无空行
输出样例2:
请输入要查询的课程:
没有该门课程
结尾无空行

zd=
while True:
    try:
        tmp=input()
        if len(tmp)==1:
            break
        m,n=map(str,tmp.split(":"))
        zd[m]=n
    except:
        break
ask=input("请输入要查询的课程:\\n")
if ask in zd.keys():
    print(zd[ask])  
else:
    print("没有该门课程")
        

7-7 竞赛排名 (10 分)

某循环赛的比赛规则是胜者得3分,和者得1分,败者不得分。请根据各人总得分从高到低进行排名。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试先输入一个整数n(2≤n≤100),表示参赛人数,然后输入n*(n-1)/2行,每行一个比赛结果。每行比赛结果由A、B、f构成,A和B为参赛人名(不含空格),f=1表示A胜B,f=0表示A与B打和。由于总是将胜者排在前面,所以不存在A败于B的情况。

输出格式:
对于每组测试,按名次分行输出,名次与名字之间以一个空格间隔,并列名次的名字在同一行输出,按字典序以一个空格隔开。

输入样例:
2
3
Jack Smith 0
Smith Bob 1
Jack Bob 1
6
a b 1
c a 0
a d 0
a e 1
f a 1
b c 1
d b 0
e b 0
f b 0
c d 1
c e 1
c f 1
d e 0
f d 0
e f 0
输出样例:
1 Jack Smith
3 Bob
1 c
2 a
3 b f
5 d
6 e
出处:
ZJUTOJ 1330

t=int(input())
for T in range(t):
    n=int(input())
    A=set()
    f=[]
    defen=
    num=(n*(n-1))/2
    num=int(num)
    for N in range(num):
        s=map(str,input().split())
        s=list(s)
        A.add(s[0])
        A.add(s[1])
        f.append(int(s[2]))
        if int(s[2])==1:
            if s[0] in defen.keys():
                defen[s[0]]+=3
            else:
                defen[s[0]]=3
        elif int(s[2])==0:
            if s[0] in defen.keys():
                defen[s[0]]+=1
            else:
                defen[s[0]]=1
            if s[1] in defen.keys():
                defen[s[1]]+=1
            else:
                defen[s[1]]=1
#     print(A)
    A=list(A)
    A.sort()
    # print("我要的")
#     print(A)
    num=len(A)
    ans=[]
    for N in range(num):
        if A[N] not in defen.keys():
            defen[A[N]]=0
#     print(ans)
    defent=sorted(defen.items(),key=lambda d:(-d[1],d[0]))
#     print(defent)
    ans=
    dexm=0
    indexn=0
    for i in range(n):
        indexn=i+1
        tmp = defent[i][0]
#         print("tmp来了"+tmp,dexm)
        if i>=1 and defent[i][1] == defent[i - 1][1] and defent[i][1]!=0:#一样的分数,要使排名相同

                ans[dexm].append(tmp)
#                 print(tmp,dexm)
        else:#出现不一样的分数
                dexm=indexn
#                 print(str(tmp),indexn)
                tmp=str(tmp)
                ans[indexn]=[]
                ans[indexn].append(tmp)
                # 记录那个变化的排序数

#         print(ans)
    for key,value in ans.items():
        print("".format(key),end="")
        for i in value:
            print(" ".format(i),end="")
        print()

7-8 进步排行榜 (10 分)

假设每个学生信息包括“用户名”、“进步总数”和“解题总数”。解题进步排行榜中,按“进步总数”及“解题总数”生成排行榜。要求先输入n个学生的信息;然后按“进步总数”降序排列;若“进步总数”相同,则按“解题总数”降序排列;若“进步总数”和“解题总数”都相同,则排名相同,但输出信息时按“用户名”升序排列。

输入格式:
首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据先输入一个正整数n(1 < n < 50),表示学生总数。然后输入n行,每行包括一个不含空格的字符串s(不超过8位)和2个正整数d和t,分别表示用户名、进步总数和解题总数。

输出格式:
对于每组测试,输出最终排名。每行一个学生的信息,分别是排名、用户名、进步总数和解题总数。每行的各个数据之间留一个空格。注意,进步总数和解题总数都相同的学生其排名也相同。

输入样例:
2
6
usx15131 21 124
usx15101 27 191
usx15113 31 124
usx15136 18 199
usx15117 27 251
usx15118 21 124
10
usx15131 21 124
usx15101 27 191
usx15107 24 154
usx15113 31 124
usx15117 25 251
usx15118 21 124
usx15119 22 117
usx15121 43 214
usx15128 21 124
usx15136 28 199
输出样例:
1 usx15113 31 124
2 usx15117 27 251
3 usx15101 27 191
4 usx15118 21 124
4 usx15131 21 124
6 usx15136 18 199
1 usx15121 43 214
2 usx15113 31 124
3 usx15136 28 199
4 usx15101 27 191
5 usx15117 25 251
6 usx15107 24 154
7 usx15119 22 117
8 usx15118 21 124
8 usx15128 21 124
8 usx15131 21 124

#会用那个多个比较规则就好写多了
t=int(input())
for T in range(t):
    n=int(input())
    name=[]
    d=[]
    t=[]
    zd=
    for N in range(n):
        s=map(str,input().split())
        s=list(s)
        # print(s)
        zd[N]=s
    # print(zd)
    # print(zd.values())
    zdt=sorted(zd.values(),key=lambda x:(-int(x[1]),-int(x[2]),x[0]))
    # print(zdt)#nice可以做到
    indexn=0
    indexm=0
    for i in range(n):
        indexn=i+1
        if  i>=1 and zdt[i][1]==zdt[i-1][1] and zdt[i][2]==zdt[i-1][2]:#出现相同的
            zdt[i].append(indexm)
        else:
            indexm=indexn
            zdt[i].append(indexn)
#     print(zdt)#nice
    for N in range(n):
        print("   ".format(zdt[N][3],zdt[N][0],zdt[N][1],zdt[N][2]))


7-10 成绩排序 (10 分)

输入n个学生的姓名及其3门功课成绩(整数),要求根据3门功课的平均成绩从高分到低分输出每个学生的姓名、3门功课成绩及平均成绩,若平均分相同则按姓名的字典序输出。

输入格式:
测试数据有多组,处理到文件尾。每组测试数据首先输入一个正整数n(1<n<100),表示学生人数;然后是n行信息,分别表示学生的姓名(长度不超过10且由英文字母构成的字符串)和3门课成绩(正整数)。

输出格式:
对于每组测试,输出排序后的学生信息,每行一个学生信息:姓名、3门课成绩、平均成绩(保留2位小数)。每行数据之间留一个空格。

输入样例:
3
zhangsan 80 75 65
lisi 65 52 56
wangwu 87 86 95
输出样例:
wangwu 87 86 95 89.33
zhangsan 80 75 65 73.33
lisi 65 52 56 57.67

while True:
    try:
        n = int(input())
        zd = 
        for N in range(n):
            s = map(str, input().split())
            s = list(s)
            # print(s)
            zd[N] = s
            zd[N].append((int(s[1]) + int(s[2]) + int(s[3])) / 3)
        # print(zd)
        zdt = sorted(zd.values(), key=lambda x: (-int(x[1]), -int(x[2]), -int(x[3]), -x[4]))
        for i in range(n):
                    print("    :.2f".format(zdt[i][0], zdt[i][1], zdt[i][2], zdt[i][3], zdt[i][4]))
    except:
        break

以上是关于python练习7——PTA的主要内容,如果未能解决你的问题,请参考以下文章

PTA的Python练习题-第4章-7 统计学生平均成绩与及格人数

Python练习四——PTA

python练习五——PTA

python练习6——PTA

[PTA]练习7-7 矩阵运算

[PTA]练习7-9 计算天数