HNU计概课实训题代码日记(20230419)

今天这个一天四更多少有点离谱。

 实验2.5.2 Python 基础之字典

第1关:字典的使用:这份菜单可以修改

本关的编程任务是补全src/Step2/menu.py文件的代码,实现相应的功能。具体要求如下:

  • menu_dict字典中添加一道菜名lamb,它的价格是50

  • 获取menu_dict字典中的fish的价格并打印出来;

  • menu_dict字典中的fish的价格改为100

  • 删除menu_dict字典中noodles这道菜;

  • 输出新的menu_dict菜单。

先通过这关快速熟悉一下字典的基本操作。难度不大。

# 创建并初始化menu_dict字典
menu_dict = {}
while True:
    try:
        food = input()
        price = int(input())
        menu_dict[food]= price
    except:
        break

# 请在此添加代码,实现对menu_dict的添加、查找、修改等操作,并打印输出相应的值
########## Begin ##########
menu_dict['lamb']=50
print(menu_dict['fish'])
menu_dict['fish']=100
del menu_dict['noodles']
print(menu_dict)

########## End ##########

第2关:字典的遍历:菜名和价格的展示

本关的编程任务是补全src/Step3/key-values.py文件的代码,实现相应的功能。具体要求如下:

  • menu_dict菜单的键遍历输出;

  • menu_dict菜单的值遍历输出。

简单的字典遍历,页面左侧提示已经给足了。

# 创建并初始化menu_dict字典
menu_dict = {}
while True:
    try:
        food = input()
        price = int(input())
        menu_dict[food]= price
    except:
        break

# 请在此添加代码,实现对menu_dict的遍历操作并打印输出键与值
########## Begin ##########
for key in menu_dict.keys():
    print(key)
for value in menu_dict.values():   
    print(value)
########## End ##########


第3关:嵌套 - 菜单的信息量好大

本关的编程任务是补全src/Step4/menu_nest.py文件的代码,实现相应的功能。具体要求如下:

  • menu_total列表中初始时只包含menu1字典,menu1字典中包含两道菜和两道菜的价格;

  • 编程要求是向menu_total列表中添加另外一个菜单字典menu2menu2菜单中的菜名和menu1菜单一样,菜的价格是menu1菜的价格的2倍;

  • 输出新的menu_total列表。

这个答案不是最优解,但相对比较容易想到。

# 初始化menu1字典,输入两道菜的价格
menu1 = {}
menu1['fish']=int(input())
menu1['pork']=int(input())

# menu_total列表现在只包含menu1字典
menu_total = [menu1]

# 请在此添加代码,实现编程要求
########## Begin ##########
menu2={}
menu2['fish']=menu1['fish']*2
menu2['pork']=menu1['pork']*2
menu_total=[menu1,menu2]

第4关:字典遍历:菜价统计

本关的编程任务是补全src/Step2/menu2.py文件的代码,实现相应的功能。具体要求如下: 统计给定菜单menu_dict,计算菜单中菜价的平均值并输出

这个遍历和之前的没有什么区别,照着以前的做法做就可以。

# 创建并初始化menu_dict字典
menu_dict = eval(input())

# 请在此添加代码,实现对menu_dict平均菜价的计算,并打印输出
########## Begin ##########
s=0
count=0
for value in menu_dict.values():
    s+=value
    count+=1
print("平均菜价为:{:.2f}元".format(s/count))    
########## End #########

第5关:数字统计

给定一个字符串s,统计0-9每个数字在字符串s中出现的次数存储在字典count,并输出字典

我的做法也不是最优解,仅供参考。

首先把字符串转换成列表(方便排序并删掉小数点),然后对列表进行遍历。

如果数字i在字典count里还未出现过,就在字典里创建一个key用来表示数字i;如果已经出现过,就对其value+1。

from math import *
# 输入字符串
s=input()
# 创建并初始化字典
count={}        
# 请在此添加代码,统计0-9每个数字在字符串中出现的次数存储在字典count,并输出字典
########## Begin ##########
a=list(s)
a.remove('.')
a.sort()
for i in a:
    if int(i) in count:
        count[int(i)] += 1
    else:
        count[int(i)] = 1
print(count)
########## End ##########

第6关:列表嵌套字典:查找成绩

程序会输入一个查找姓名name,一个用字典嵌套列表scores存储学生的姓名和成绩,请查找姓名为name的同学的成绩,并统计显示平均成绩、最高最低成绩,按指定格式输出;如成绩表中没有该姓名,则输出‘没有该姓名’

同样仅供参考。我们遍历 scores 列表中的每个字典,如果字典的 'name' 键值等于输入的 name,我们就将其对应的 'score' 键值赋值给变量 score,并设置一个标志变量 found 为 True。如果遍历完列表后,found 变量仍为 False,那就说明这个人不在字典中。

平均分、最高分和最低分的计算就比较简单了。

# 输入查找姓名
name=input()
# 创建并初始化成绩字典列表
scores=eval(input())
found = False
for record in scores:
    if record['name'] == name:
        found = True
        score = record['score']

if found:
    print(f"姓名:{name},成绩:{score:.2f}")
    score_list = [record['score'] for record in scores]
    avg = sum(score_list) / len(score_list)
    max = max(score_list)
    min = min(score_list)
    print(f"平均成绩:{avg:.2f},最高成绩:{max:.2f},最低成绩:{min:.2f}")
else:
    print("没有该姓名")
########## End ##########

实验2.6.1 Python基础之之内置函数调用

第1关:内置函数 - 让你偷懒的工具

本关的编程任务是补全src/Step2/prime.py文件的代码,实现相应的功能。具体要求如下:

  • 定义一个函数,功能是判断一个数是否为素数;
  • 调用函数,对输入的整数进行判断。如果是素数则输出为True,否则输出为False

这关我没用到内置函数,用的还是常规的循环,总感觉不太对劲……不过能做就行。

n =  int(input())
if n < 2:
    print('False')
else:
    for i in range(2,n):
        if n%i == 0:
            print('False')
            break
    else:
        print('True')

第2关:函数正确调用 - 得到想要的结果

本关的编程任务是补全src/Step2/func_call.py文件的代码,实现相应的功能。具体要求如下:

  • 定义一个函数,实现对输入的数值列表进行从小到大的顺序排序;
  • 输出排序后的数值列表。

只要用一个函数就能解决。

# 输入数字字符串,并转换为数值列表
a = input()
num1 = eval(a)
numbers = list(num1)

# 请在此添加代码,对数值列表numbers实现从小到大排序
########## Begin ##########
numbers.sort()
print(numbers)
########## End ##########

第3关:函数与函数调用 - 分清主次

本关的编程任务是补全src/step3/func_ref.py文件的代码,实现相应的功能。具体要求如下:

  • 定义一个函数,要求实现圆的面积的计算;
  • 根据输入的不同整数值的半径,调用函数计算,并输出圆的面积,结果保留两位小数。

仍然是只要用两行代码就可以解决的简单题目。

from math import pi as PI
n = int(input())

# 请在此添加代码,实现圆的面积计算,并输出面积结果
########## Begin ##########
s = PI * n**2
print("{:.2f}".format(s))
########## End ##########

实验2.6.2 Python 基础之自定义函数

第1关:函数的参数 - 搭建函数房子的砖

迷惑的一关。

这关很简单,甚至只要写一行代码,但是题目要求看上去很奇怪。题干老长的我也不清楚在说什么。

# 创建一个空列表numbers
numbers = []

# str用来存储输入的数字字符串,lst1是将输入的字符串用空格分割,存储为列表
str = input()
lst1 = str.split(' ')

# 将输入的数字字符串转换为整型并赋值给numbers列表
for i in range(len(lst1)):
   numbers.append(int(lst1.pop()))

# 请在此添加代码,对输入的列表中的数值元素进行累加求和

########## Begin ##########
d=sum(numbers) #没错,就只要写这一行
########## End #########

print(d)

第2关:函数的返回值 - 可有可无的 return

本关的编程任务是补全src/step2/return.py文件的代码,实现相应的功能。具体要求如下:

  • 定义一个函数gcd,功能是求两个正整数的最大公约数;
  • 调用函数gcd,得到输入的两个正整数的最大公约数,并输出这个最大公约数。

计算最大公约数的题我们之前见过,相信这次再见到这题,难度已经降低了很多。

# 输入两个正整数a,b
a = int(input())
b = int(input())

# 请在此添加代码,求两个正整数的最大公约数
########## Begin ##########
def gcd(a,b):
    list=[]
    for i in range(1,min(a,b)+1):
        if max(a,b)%i == 0 and min(a,b)%i == 0:
            list.append(i)
    return(max(list))
########## End ##########

# 调用函数,并输出最大公约数
print(gcd(a,b))

第3关:函数的使用范围:Python 作用域

这关要求又是不知所云,从代码来看应该是要计算最小公倍数。这题比计算最大公约数还要简单一些。

# 输入两个正整数a,b
a = int(input())
b = int(input())

# 请在此添加代码,求两个正整数的最小公倍数
########## Begin ##########
def lcm(a,b):
    list=[]
    for i in range(max(a,b),a*b+1):
        if i % a == 0 and i % b == 0:
            return i
            break
########## End ##########

实验2.6.3 函数拓展练习

现在有点晚了,这一节比较简单,我们速战速决。

第1关:练习使用参数

解一元二次方程,利用二次方程的求根公式计算就行。

from math import sqrt
a = float(input()); b = float(input()); c = float(input())
def roots(a,b,c):
#请在此添加代码,求方程 ax^2+bx+c = 0的解,返回由方程根构成的列表,若方程有无数解,返回['inf']
#********** Begin *********#
    list=[]
    delta = b**2 - 4*a*c
    if delta > 0:
        list.append((-b+delta**0.5)/(2*a))
        list.append((-b-delta**0.5)/(2*a))
    elif delta == 0:
        list.append(-b/(2*a))
    return list
#********** End **********#
print (roots(a,b,c))

第2关:具有多个返回值的函数

这题和上一题非常相似,甚至找不出区别在哪。

from math import sqrt
a=float(input()); b=float(input()); c=float(input())
def roots(a, b, c):
#请在此添加代码,在a不等于0的情况下编写函数求解方程的两个根并将根返回
#********** Begin *********#
    delta = b**2 - 4*a*c
    x1=(-b+sqrt(delta))/(2*a)
    x2=(-b-sqrt(delta))/(2*a)
    return(x1,x2)
#********** End **********#
if a != 0:
  print (roots(a,b,c))


第3关:在函数中修改全局变量

这关需要用到全局变量global,页面左侧已经给出提示。

counter = 0
def access():
#请在此添加代码,实现counter的调用,每次调用counter的值加1
#********** Begin *********#
  global counter
  counter += 1
  return counter
#********** End **********#  
for i in range(5):
  access()  
print (counter)

第4关:Lambda 表达式

任务和标题好像没啥关联。这关需要利用求导公式f'(x)=(f(x+\Delta x)-f(x-\Delta x))/2\Delta x计算出sinx的导数。那能不能直接用cosx来代替呢?感兴趣的可以试试看。

from math import sin, cos
delX = 0.001
x = float(input())
#请在此添加代码,用lambda方式定义sin()的导数函数diff
#********** Begin *********#
def diff(x,delX):
    return (sin(x+delX)-sin(x-delX))/(2*delX)  
#**********  End  *********
print ("%.2f"%(diff(x,delX)))


第5关:使用默认参数

怎么又是这题?

import math
#请在此添加代码,定义solve函数,求一元二次方程的的两个根,该函数应包括三个参数分别表示方程的三个系数,默认第三个参数为-4
#********** Begin *********#
def solve(a,b):
    delta = b**2 + 16 * a
    x1=(-b+math.sqrt(delta))/(2*a)
    x2=(-b-math.sqrt(delta))/(2*a)
    return(x1,x2)
#**********  End  *********#
a=eval(input())
b=eval(input())
x1, x2 = solve(a, b) #默认第三个参数为-4    
print('x1=%.2f, x2=%.2f' % (x1, x2))

第6关:使用可变长参数

依然是很迷惑的一道题,上下那么长一堆,实际上只要填一行。

import random
from functools import reduce

n = input()  # useless
n = random.randint(5,10)
L = []
for i in range(n):
 L.append(random.randint(1,n))
 
def sum_of_paras(*arg):
#请在此添加代码,返回参数列表 arg 中所有数的和
#********** Begin *********#
  return sum(L) #填这里就行了
#**********  End  *********#
    
strcall = "sum_of_paras(";
strcall += reduce(lambda x, y: x+","+y, [str(s) for s in L])
strcall +=")"

if eval(strcall) == sum(L):
  print("Y")
else:
  print("N")

第7关:使用递归

递归比较难理解,不过本题用递归做很简单。

n=int(input())
#请在此添加代码,返回斐波拉契数量第n项的值
#********** Begin *********#
def fib(n):
    if n == 1:
        return 0
    elif n == 2:
        return 1
    return  fib(n-2) + fib(n-1) 
#**********  End  *********#
print(fib(n))

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值