全国计算机等级考试二级教程——Python语言程序设计(2018年版)课后习题参考答案汇总

 如标题所示,由于嵩天老师的那本书的课后习题的大题部分缺少答案,于是下面的代码是自己在看书期间尝试练习的结果,仅供同学参考。

另外推荐MOOC上嵩天老师关于Python的在线课程。祝学习愉快。

#第2章第2题
sen=input("请输入一段文字:")
print("\n".join(sen)) #在print函数中,“\n”的转义效果就很明显
#把一个字符串拆分成由字符组成的列表【不能变成集合,因为集合的话会自动去重】的话是不是直接list()
list1=list(sen)

#第2章第3题 #这道题涉及到把字符转换为有效的可以计算的值#没有那么复杂,eval可以自动识别
try:
	equ = eval(input("请输入一个合法的算式:"))#如果不是算式,可以检验其是否合法吗?
except:
	print("输入的公式不合法,请重新输入,如1+3")
	equ = eval(input("请输入一个合法的算式:"))
print(equ)

#第2章第4题
equ = eval(input("请输入一个小数:"))
# print("您输入的小数的整数部分是:{}".format(round(equ))) #这个保留的是四舍五入的整数值,还不太准确。
#print("您输入的小数的整数部分是:{:d}".format(equ))
list1=str(equ).split(".")
print(list1[0])



#第2章第5题
n=eval(input("请输入整数N:"))
#请输入整数N:8
sum=0
for i in range(1,n+1):
	global sum
	sum = sum+i

print("1到N的求和结果:{}".format(sum))
#1到N的求和结果:36


#第3章第1题  输入该整数百位及以上的数字
num = eval(input("请输入一个整数:"))
print("该整数百位及以上的数字是:{}".format(num//100))

#第3章第2题
string=input("请输入一个字符串(以空格分隔):")
str = string.split("	")#变成了一个list
print("\n".join(str)) #注意斜杠的方向

#第3章第3题 这道题相对比较复杂不过不能 我们或许可以定义一个字典
week = {"1":"星期一","2":"星期二","3":"星期三","4":"星期四","5":"星期五","6":"星期六","7":"星期日"}
day = input("请输入数字(1-7):")
print("今天是:{}".format(week.get(day)))

#第3章第4题 判断回文数 涉及到一个将数字反向排列的方法(之前好像有遇到过)
def reverse(get):

	new = list(get)
	new.reverse()
	rev = "".join(new)
	if rev == get:
		print("输入的这个数是回文数。")
	else:
		print("输入的这个数不是回文数。")

#将字符串反转是Python中常常考察的题了
get = input("请输入一个数(用于判断是否为回文数):")
reverse(get)



#第3章第5题  
num = eval(input("请输入一个十进制的整数:"))
print("其二进制的形式为:{:b}".format(num))
print("其八进制的形式为:{:o}".format(num))
print("其十六进制的形式为:{:X}".format(num))

#第4章第1题 判断是否为闰年
#闰年的判断标准是(1)被4整除但不能被100整除(2)能够被四百整除?
#判断条件有点复杂,给它两次机会。

year = eval(input("请输入一个年份:"))

def yeardeside(year): 
	if year%400==0:
		print("该年份为闰年。")
	else:
		if year%4==0 and year%100!=0: #python这边条件之间使用的参数是,and or
			print("该年份为闰年。")
		else:
			print("该年份不为闰年。")
			


yeardeside(year) #此year为用户输入的数值。

#第4章第2题 计算两个整数之间的最大公约数和最小公倍数
#最大公约数的计算方法:辗转相除法
#最小公倍数的计算方法:两个数的乘积除以最大公约数

#涉及到取余 两个数之中较小的那一个再除 涉及到判断的情况 直到最后余零 这时的被除数就是最大公约数

a = eval(input("请输入一个较大的数:"))
b = eval(input("请输入一个较小的数:"))
c = b #保留b的值,因为b的值在循环的过程中会发生改变
d = a #保留a的值,因为a的值在循环的过程中会发生改变
while a%b !=0:
	r = a%b
	a = b
	b = r
print("这两个数的最大公约数是:{}".format(b))
print("这两个数的最小公倍数是:{}".format((d*c)/b)) #除法产生的结果为浮点数

#第4章第3题 统计不同字符的个数,包括中英文字符,数字,空格和其他字符的个数
#我感觉这题有点复杂,拿到要一个字符一个字符的判断嘛
#不用,我看到的网上的解决思路是这样的,以输入的那个序列为基准,在里面则在原来的基础上加一,不在里面,则以自己为第一个。
#res 相当于是定义了一个字典,按照键去取值,默认值为0,存在则取出相应的值(两种解决思路)
#能不能按照值的大小进行排序输出

sen = input("请输入一行字符:")

def count(sen):
	res = {} #定义一个空的字典集
	for i in sen: #逐个遍历sen中的元素
		res[i]=res.get(i,0)+1
	#对单词的统计值进行由高到低的排序(自然而然会想到的事情)
	items = list(res.items()) #把没有顺序的字典转换为有顺序的列表
	items.sort(key = lambda x:x[1],reverse=True) #排序
	
	return items  #缩进注意

count(sen)

#书上这块输入列表数量最多的前十个,也值得我去学习,这串代码。
for i in range(10):
	word,count = items[i] #返回列表第一个元素,为一个键值对的元组
	print(word,count) #输出的格式可适当调整。一行一行输出
	
#第4章第4题 #主要考察异常处理的处理方式

try:
	num = eval(input("请输入一个整数:"))
except:
	print("输入错误!请输入一个整数。")
	continue #结束本次循环,继续下一次循环 


#第4章第5题 #羊车门游戏
#使用random库 对于这个随机事件进行预测
#预测参赛者改变选择和坚持选择获胜的概率
#主持人开启另一扇门,露出门后山羊,更不更换(即自己所指的是汽车还是山羊之间赌


from random import * #引入random库,随机生成一组数(这组数的性质由不同的函数所决定)
a = randint(1,3) #用户随机指出另一扇门  #固定设定1,2为羊 3为车
if a == 3:
   rate = 1/3
   print("不改变选择获胜的概率为{}".format(rate))
else:
	rate = 2/3
	print("改变选择获胜的概率为{}".format(rate))
   
#这道题实际上就是通过多次抽样得到胜利的次数,而概率就是从抽样这个过程中找到规律
from random import *  
x=randint(5000,10000) #抽样的次数
change=0
nochange=0
for i in range(1,x+1):
  a=randrange(1,4) #汽车所在的位置
  b=randrange(1,4)  #用户选的位置
  if a==b:
    nochange=nochange+1  #不改变计数为1,只有不改变才能获胜
  else:
    change=change+1 #改变计数为1,改变才能获胜
print("不更改选择得到汽车的概率为{}".format(nochange/x))
print("更改选择得到汽车的概率为{}".format(change/x))


#第5章 第2题 整数 异常处理 质数 为true,否 为false

def intprocess(num):
#判断整数类型,异常判断
	if(type(num) == type(1)):
		for i in range(2,num):
			if num%i == 0: #如果存在可以整除的其余项目,则不予考虑
				return False
			else:
				i == num-1
				return True
	else:
		print("输入的参数不为整数!重新输入!")
	
				
#第5章 第3题 统计传入字符串中的字母,数字,空格以及其他字符的个数 

def count(str):
	res = {}
	for i in str:
		res[i]=res.get(i,0)+1
	items = list(res.items())
	items.sort(key = lambda x:x[1],reverse=True) #排序
	
	return items  #缩进注意


#第5章第4题 打印200以内的所有素数
#素数:除了1和它本身再没有其他因子的数

def sushu(num):
	a = [1]
	for i in range(1,num+1):
		for j in range(2,i):
			if i%j == 0 :  #如果存在可以整除的其余项目,则不予考虑
				break
			else:
				if j == i-1: #遍历到最后的,还是没有遇到整除的
					a.append(i)
	#print("{0}以内的素数为:{1}".format(num," ".join(str(a)))) 
	#str(a)这里我的还是很不准确
	#这也就是上次出错的地方 #似曾相识,我是如何解决的呢?	
	#首先把列表中的元素一点点取出来,然后转换为字符串,然后再用join拼接
	ls2 = [str(i) for i in a] #这一句代码特别重要,把数列中的数值全部转换为字符串
    b = " ".join(ls2)
	print(b)



#第5章第5题 斐波那契数列
#第3位数是第1次循环的b
#第4位数是第2次循环的b
#第n位数是第n-2次循环的b
#所以最大到第n-2次循环,n-2+1=n-1
def facci(n):
	a = 1
    b = 1
	for i in range(1,n-1):
		c = b
		b = a+b
		a = c
	return b
		


#第6章 第1题:英文字符频率统计(就是可能一大段序列中有各种字符,仅仅是统计英文字符出现频率的统计)
#这让我想到了用perl语言处理碱基序列这块(还是很神奇的啊)
#它这个是在特定的范围内去统计频率
#首先定义一个字典,key =abc~Z,value初始化为零。如果getkey能够找到,则value加一。
def EngCount(str):
	va = {"a":0,"b":0,"c":0,"d":0,"e":0,"f":0,"g":0,"h":0,"i":0,"j":0,"k":0,"l":0,"m":0,"n":0,"o":0,"p":0,"q":0,"r":0,"s":0,"t":0,"u":0,"v":0,"w":0,"x":0,"y":0,"z":0}
	ls = list(str)
	for i in ls:
		if va.get(i,"*") == "*": #这个判断语句有问题 #后来修正了看出了问题所在
			break
		else:
			va[i]=va.get(i)+1
	items = list(va.items())
	items.sort(key = lambda x:x[1],reverse=True) #排序
	return items
	#在逐个遍历的过程中

EngCount("xshaxvhasvchasvhbxsabhsv")


#第6章 第2题 统计中文字符出现的频率(想把大叔的诗作弄下来,然后去统计字频,那一定很有趣)

import os
os.chdir("E:\\S-code\\Pythoncode")  #设定新的工作目录,test.txt文件要存放在这个工作目录下
os.getcwd() #查看现在的工作目录
'E:\\S-code\\Pythoncode' #显示的是我们最新设定的,就代表设定成功
f = open("pose.txt","rt") #test.txt为文件名,rt为读取文件的方式
s = f.readlines() #读取文件,输出结果为一个列表
pose = {}
for line in s:
    ls = list(line)
	for i in ls:
	    if i in ",。、":
			break
		else:
			pose[i]= pose.get(i,0)+1
items = list(pose.items())
items.sort(key = lambda x:x[1],reverse=True) 
for i in range(1,11):
    word,count = items[i]
	print("{0:<10}{1:>5}".format(word,count))

f.close()

#这里虽然能够对出现的中文字符,但是如果能够出现常用的词语的搭配就更好了
#词云
import jieba
f = open("pose.txt","r")
txt = f.read()
f.close()
words = jieba.lcut(txt)
counts={}
for word in words:
	if len(word)==1:
		continue
	else:
		counts[word]=counts.get(word,0)+1

items = list(counts.items())
items.sort(key = lambda x:x[1],reverse=True) 
for i in range(1,11):
    word,count = items[i]
	print("{0:<10}{1:>5}".format(word,count))


#第6章 第3题 随机密码的生成
import random
codelist = ["A","a","B","b","C","c","D","d","E","e",1,2,3,4,5,6,7,8,9,0]
for i in range(1,11):
	secret = random.sample(codelist,8)
	#把列表变成字符串
	new =[str(i) for i in sectet] #这一句代码特别重要,把数列中的数值全部转换为字符串
	print("{}".format("".join(new)))
	
	
#第6章 第4题 重复元素判定
def rep(ls):
	#逐个的遍历列表各元素(这里就涉及到算法了)
	#在我印象中,算法是什么呢,就是解决问题的方法,而这种解决问题的方法可以通过不同的语言来实现
	#算法具体解决的是怎么做的问题,就像解一道数学题有不同的思路 
	for i in range(0,len(ls)): #这里的嵌套循环是值得借鉴的
		for j in range(i+1,len(ls)):
			if ls[i] == ls[j]:
				print("糟糕!有重复值!")
				break
			else:
				continue


a = [1,2,3,1,1,5,3,5,4,6]
rep(a)

	
#第6章 第5题 利用集合的无重复性改编这道程序
def rep(ls):#在命名变量的时候,不要和语言本身的关键字重复,要不然程序会傻傻分不清
	#逐个的遍历列表各元素(这里就涉及到算法了)
	#在我印象中,算法是什么呢,就是解决问题的方法,而这种解决问题的方法可以通过不同的语言来实现
	#算法具体解决的是怎么做的问题,就像解一道数学题有不同的思路 
	a = set(ls) #转为集合
	b = list(a) #集合再转换为列表
	if b == ls:
		print("安全!无重复值!")
	else:
		print("糟糕!有重复值!")


a = [1,2,3,2]
rep(a)
	

#第7章 第1题 统计该字符在文件中出现的次数
#发现定义一个函数真的要方便很多,到时候直接调用就行
import os
os.chdir("E:\\S-code\\Pythoncode")

def charcount(ch):
        word ={ch:0} #定义一个字典,默认值为零
        f = open("diary.txt","rt") 
        p = f.readlines()
        for i in p: #读取每一行,存放在一个列表之中
                for j in i: #再对每一行的字符串进行分解成字符		
                        if j ==ch:
                                word[ch]=word.get(ch,0)+1
        count = word.get(ch,0)
        print(count)

charcount("我")


#第7章 第2题 大写字母转小写 小写字母转大写(好无聊的要求,估计是看看我们熟不熟悉这部分操作吧)
#这个函数也是逐个遍历,逐个操作处理的过程	
#通过做这道题学会了文件另存为的操作,怎样写入一个新的文件中
import os
os.chdir("E:\\S-code\\Pythoncode")
f = open("englishText.txt","r+") 
w = open("new.txt","a+")
p = f.readlines() #每行被存储为列表
for i in p: #读取每一行,存放在一个列表之中
    for j in i: #再对每一行的字符串进行分解成字符		
        if j.islower():#小写转换为大写
			change = j.upper()
			w.write(j.replace(j,change))#替换
		else: #大写转换为小写
			change = j.lower()
			w.write(j.replace(j,change))
w.close()	
f.close()
	
#第7章 第3题 这道题分为两步操作
#(1)随机生成一个10*10的矩阵,以空格分隔行向量,换行符分隔列向量保存。
#(2)另存为一个csv类型的文件,以逗号分隔保存。
#使用random库,随机生成一个整数,先打印行再打印列。
import os
os.chdir("E:\\S-code\\Pythoncode")
from random import *
f = open("sq.txt","w+") #这是覆盖写

for i in range(1,11):
    line = ""  #把每一行定义为一个字符串这个思路特别好
    for j in range(1,11):
        line += "{0:<.2f}\t".format(random())
	
    f.write(line+"\n")
f.close()

o = open("sq.txt","r+")
line = o.readlines() #每一行读成了列表中的元素
c = open("newsq.csv","w+")

for i in  line:
	new = i.strip("\t\n").split("\t") #各种点之间有一定的逻辑关系
	print(new)
	ls = ""
	for j in new:
		ls +="{0},".format(j)

	c.writelines(ls+"\n") #没有c.writeline(),只有writelines()
	                      #注意缩进,我觉得缩进在Python中表示的是一种逻辑关系,所以务必谨慎

c.close()
o.close()



 

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值