《Python语言程序设计》二级教程课后编程题及答案

答案不全,仅把本人敲出结果的代码整理如下。大部分为本人思路,部分代码参考了网上文章,初学水平有限,若有错误请读者指出,感谢。
《Python语言程序设计》二级教程课后编程题及答案_第1张图片

第二章 Python语言基本语法元素

2.1获得用户输入的一个整数N,计算并输出N的32次方。

N=eval(input('请输入'))
a=N**32
print("它的32次方是"+str(a))

2.2获得用户输入的一段文字,将这段文字进行垂直输出。

s=input("请输入一段文字:")
i=0
while i<len(s):
    print(s[i])
    i=i+1

2.3获得用户输入的一个合法算式,例如:1.2+3.4,输出运算结果。

a=input("输入一个带数算式:")
b=eval(a)
print("结果为:"+str(b))

2.4获得用户输入的一个小数,提取并输出其整数部分。

a=input("请输入一个小数:")
l=len(a)
i=0
while i<l:
    print(a[i],end='')
    i=i+1
    if a[i]=='.':
        break

2.5修改之后的代码如下:

n=eval(input("请输入整数N:"))
sum=0
for i in range(n):
    sum+=i+1
print("1到N求和结果:{}".format(sum))


修改的地方:
1.要将input的字符串数字化
2.行末分号最好去掉
3.for后面加冒号
4.最后一行少了一个format对应的槽位置{}

第三章 基本数据类型

3.1获得用户输入的一个整数,输出该整数百位以上的数字。

a=input("请输入一个整数:")
b=eval(a)
if type(b)==type(1234):
    l=len(a)-2
    c=a[:l]
    print(c)
else:
    print("请输入一个整数!")

3.2获得用户输入的一个字符串,将字符串按照空格分隔,然后逐行打印出来。

s=input("请输入一个字符串:")
a=s.split()
l=len(a)
for i in range(l):
    print(a[i])

3.3程序读入一个表示星期几的数字(1—7),输出对应的字符串名称。例如:输入3,返回“星期三”。

a=eval(input("请输入一个1—7的数字:"))
b=["一","二","三","四","五","六","日"]
print("星期"+b[a-1])

3.4设n是一任意自然数,如果n的各位数字反向排列所得自然数与n相等,则n被称为回文数。从键盘输入一个5位数字,请编写程序判断这个数字是不是回文数。

a=input("请输入一个5位自然数:")
b=a[::-1]
if a==b:
    print("此数是回文数!")
else:
    print("此数不是回文数!")

3.5输入一个十进制整数,分别输出其二进制,八进制,十六进制字符串。

s=eval(input("输入一个十进制整数:"))

print("二进制:{:b}".format(s))
print("八进制:{:o}".format(s))
print("十六进制:{:X}".format(s))

第四章 程序的控制结构

4.1输入一个年份,输出是否为闰年。(闰年:能被4整除但不能被100整除,或者能被400整除的年份都是闰年)

while True:
    s=input('请输入一个年份:(输入q退出)')
    if s=='q':
        break
    else:
        try:
            a=eval(s)
        except:
            print('请输入数字表示的年份!')
            continue
        if (a%4==0 and a%100!=0)or a%400==0:
            print('此年份是闰年!')
        else:
            print('此年份不是闰年!')

4.2最大公约数计算。获得两个整数,求出这两个整数的最大公约数和最小公倍数。最大公约数的计算一般使用辗转相除法,最小公倍数使用两个数的乘积除以最大公约数。

先放个例子理解一下辗转相除法:
假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:
1997 / 615 = 3 (余 152)
615 / 152 = 4(余7)
152 / 7 = 21(余5)
7 / 5 = 1 (余2)
5 / 2 = 2 (余1)
2 / 1 = 2 (余0)
至此,最大公约数为1
以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。

a=eval(input('请输入一个数:'))
b=eval(input('请输入另一个数:'))
d=a*b
if a>b:
    while a%b!=0:
        c=a%b
        a=b
        b=c
    e=int(d/b)
    print('两个数的最大公约数为:'+str(b)+'\n两个数的最小公倍数为:'+str(e))

elif a<b:
    while b%a!=0:
        c=b%a
        b=a
        a=c
    e=int(d/a)
    print('两个数的最大公约数为:'+str(a)+'\n两个数的最小公倍数为:'+str(e))
else:
    print('最大公约数与最小公倍数都是'+str(a))

4.3统计不同字符个数。用户从键盘键入一行字符,编写一个程序,统计并输出其中英文字符,数字,空格和其他字符的个数。

symble=input('Enter your words:')
number=letter=space=other=0
i=0
for i in range(len(symble)):
    if 'a'<=symble[i]<='z' or 'A'<=symble[i]<='Z':
        letter+=1
    elif '0'<=symble[i]<='9':
        number+=1
    elif symble[i]==' ':
        space+=1
    else:
        other+=1

print('letter:'+str(letter)+' number:'+str(number)+' space:'+str(space)+' other:'+str(other))


4.4猜数游戏续。当用户输入的不是整数(如字母,浮点数)时,程序会终止执行退出。改编题目1中的程序,当用户输入出错时给出“输入内容必须为整数!”的提示,并让用户重新输入。

import random
target=random.randint(1,1000)
count=0
while True:
    try:
        guess=eval(input('请输入一个猜测的整数(1至1000):'))
    except:
        print('输入内容必须为整数!此次不计数猜测次数!')#解决输入不是数字的问题
        continue
    if type(guess)!=type(1):
        print('输入内容必须为整数!此次不计数猜测次数!')#解决输入是浮点数的问题
        continue
    count=count+1
    if guess<target:
        print('猜小了')
    elif guess>target:
        print('猜大了')
    else:
        print('猜对了')
        break
print('此次猜测的次数为:'+str(count))

5.羊车门问题。有三扇关闭的门,一扇门后停着汽车,blabla。。。。。。请使用random库对这个随机事件进行预测,分别输出参赛者改变选择和坚持选择获胜的概率。
这个问题我之前有一篇帖子阐述了一下帮助理解,下面代码原理看不懂的或者对这个问题有兴趣的可以看看,这里不赘述了,直接上代码:

import random
n=10000
success_time=0
fail_time=0
for i in range(n):
    car_location=random.randint(1,3)
    my_choose=random.randint(1,3)
    if my_choose==car_location:
        fail_time+=1
    else:
        success_time+=1
s=success_time/10000
f=fail_time/10000
print('换后成功概率为:'+str(s))
print('换后失败概率为:'+str(f))

第五章 函数和代码复用
5.1实现isNum()函数,参数为一个字符串,如果这个字符串属于整数,浮点数或者复数的表示,则返回True,否则返回False。

a=input("请输入数字")
def isnum(a):
    try:
        n=eval(a)
        if type(n)==float or type(n)==int  or type(n)==complex:
            print('True')
        else:
            prit('False')
    except:
        print('False')
isnum(a)

5.2实现isNum()函数,参数为整数,要有异常处理。如果整数是质数,返回True,否则返回False。

from math import sqrt
def is_prime(a):
    try:
        n=eval(a)
    
        if type(n)!=type(1):
            print('请确认您输入的是整数!')#保证输入是整数
        else:
            if n==1:
                return False
            for i in range(2,int(sqrt(n))+1):
                if n%i==0:
                    return False
            return True         
    except:
        print('请确认您输入的是数字!')#保证输入是数字

while True:
    a=input('请输入一个整数,键入“q”退出:')
    if a=='q':
            break
    else:
        print(is_prime(a))

5.3编写一个函数计算传入字符串中数字,字母,空格以及其他字符的个数。

def tongji():
    str1=input('请输入一个字符串:')
    zimu=shuzi=kongge=qita=0
    for p in str1:
        if 'a'<=p<='z' or 'A'<=p<='Z':
            zimu+=1
        elif '0'<=p<='9':
            shuzi+=1
        elif p==' 'or p==' ':
            kongge+=1
        else:
            qita+=1
    print('字母{},数字{},空格{},其他{}'.format(zimu,shuzi,kongge,qita))

tongji()

5.4编写一个函数,打印200以内的所有素数,以空格分割。

from math import sqrt

def is_prime():
    for i in range(2,201):
        a=1
        for j in range(2,int(sqrt(i))+1):
            if i%j==0:
                a=a*0
            else:
                a=a*1
        if a==1:
            print(i,end=' ')
            
is_prime()

5.5编写一个函数,参数为一个整数n。利用递归获取斐波那契数列中的第n个数并返回。

def fb(n):
    a,b=1,1
    count=0
    while(count!=n-2):
        a,b=b,a+b
        count+=1
    return b
n=eval(input('您想返回第几个数:'))
print(fb(n))
       

第六章 组合数据类型
6.1英文字符频率统计。编写一个程序,对给定字符串中出现的a–z字母频率进行分析,忽略大小写,采用降序方式输出。

txt=input("请输入一段英文文本:")
txt=txt.lower()
count={}
for word in txt:
    if word in "abcdefghijklmnopqrstuvwxyz":
        count[word]=count.get(word,0)+1
items=list(count.items())
items.sort(key=lambda x:x[1],reverse=True)
for i in range(len(items)):
    word,count=items[i]
    print("{0:<10}{1:>5}".format(word,count))

6.2中文字符频率统计。编写一个程序,对给定字符串中出现的全部字符(含中文字符)频率进行分析,采用降序方式输出。

txt=input("请输入一段文本:")
txt=txt.lower()
count={}
for word in txt:
    #if word in "abcdefghijklmnopqrstuvwxyz":
    count[word]=count.get(word,0)+1
items=list(count.items())
items.sort(key=lambda x:x[1],reverse=True)
for i in range(len(items)):
    word,count=items[i]
    print("{0:<10}{1:>5}".format(word,count))
#首先:‘我的{0}叫{1}’.format(name,jack),大括号里的数字,表示的是位置,也就是0对应的name,1对应的jack。同理,题中0对应的是Word,1对应的是count。
#其次,冒号是引导符,后面跟的是格式控制方法。<表示左对齐,>表示右对齐,数字表示宽度。同理,题中<10表示左对齐,并占10个位置,>5表示右对齐,占5个位置。

6.3随机密码生成。编写程序在26个字母大小写和9个数字组成的列表中随机生成10个8位密码。

import random
txt='1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
the_list=list(txt)
for i in range(10):
    password=''
    for j in range(8):
        password+=random.choice(the_list)
    print(password)

6.5重复元素判定续。利用集合的无重复性改编上一个程序,获得一个更快更简洁的版本。

def test(lis):
    tem=set(lis)
    if len(tem)<len(lis):
        return True
    else:
        return False

def getlist():
    lis=list(input("请输入判定元素,回车表示结束:"))
    print(test(lis))
getlist()

既然更快更简洁了那6.4就不要了哈哈哈

第七章 文件和数据格式化

7.1输入一个文件和一个字符,统计该字符在文件中出现的次数。

def countstr(filename,str1):
    filenames=filename+".txt"
    f=open(filenames,'r')
    count=0
    for line in f:
        for i in line:
            if i==str1:
                count+=1
    print("'{}'字符在'{}'中出现的次数是'{}'".format(str1,filename,count))

def main():
    filename=input("请输入文件名称:")
    str1=input("请输入需要统计的字符:")
    countstr(filename,str1)

main()

7.2假设有一个英文文本文件,编写一个程序读取其内容并将里面的大写字母变成小写字母,小写字母变成大写字母。

def transform(filename):
    file=filename+".txt"
    f=open(file,"r+")
    fn=open("{}转化后.txt".format(filename),"w")
    for line in f:
        for word in line:
            if word in "qwertyuiopasdfghjklzxcvbnm":
                word=word.upper()
            elif word in "QWERTYUIOPASDFGHJKLZXCVBNM":
                word=word.lower()
            fn.write(word)
    f.close
    fn.close


def main():
    filename=input("请输入文件名称:")
    transform(filename)

main()

7.3编写一个程序,生成一个10*10的随机矩阵并保存为文件(空格分隔行向量,换行分隔列向量),再写程序将刚才保存的矩阵文件另存为CSV格式,用Excel或文本编辑器打开看看结果对不对。

import random
def s_txt(low,high,txtname):
    f=open("{}.txt".format(txtname),"w")
    for line in range(10):
        word=""
        for row in range(10):
            word=word+str(random.randrange(low,high))+" "
        f.write(word+"\n")
    f.close()


def s_csv(txtname,csvname):
    f1=open("{}.txt".format(txtname),"r")
    f2=open("{}.csv".format(csvname),"w")
    for line in f1:
        after=line.replace(" ",",")
        f2.write(after)
    f1.close()
    f2.close()

def main():
    low,high=eval(input("请输入随机数下限low、上限high,并用逗号隔开:"))
    txtname=input("请输入txt文件名:")
    s_txt(low,high,txtname)
    csvname=input("请输入csv文件名:")
    s_csv(txtname,csvname)


main()


7.5编写一个程序,要求能够将元素为任意Python支持的类型(包括含有半角逗号的字符串)的列表转储为CSV,并能够重新正确解析为列表。

def save_csv(ls, fname):
    # 向列表中逐个添加元素
    value = input('请向列表总添加一个元素:')
    while value != '':
        ls.append(value)
        value = input('请向列表总添加一个元素:')
    print('您输入的列表为:{}'.format(ls))
    
    # 若元素中有半角逗号,将其替换成点
    for i in range(len(ls)):
        if ',' in ls[i]:
            ls[i] = ls[i].replace(',', '.')

    file_csv = open('{}.csv'.format(fname), 'w', encoding='utf-8')
    file_csv.write(','.join(ls) + '\n')
    file_csv.close()
    print('恭喜!已成功保存<{}.csv>文件!'.format(fname))


def read_csv(lt, fname):
    f = open('{}.csv'.format(fname), 'r', encoding='utf-8')
    lt = f.read().strip('\n').split(',')
    
    # 将替换后的点换成半角逗号
    for i in range(len(lt)):
        if '.' in lt[i]:
            lt[i] = lt[i].replace('.', ',')
    f.close()
    print('<{}.csv>文件读取中...'.format(fname))
    print(lt)


def main():
    ls = []
    fname = input('请将列表文件命名:')
    save_csv(ls, fname)
    lt = []
    read_csv(lt,fname)

main()


完结撒花
《Python语言程序设计》二级教程课后编程题及答案_第2张图片

你可能感兴趣的:(python)