全国计算机等级考试二级Python语言程序设计模拟试卷A卷综合应用题

目录

背景

《论语》是儒家学派的经典著作之一,主要记录了孔子及其弟子的言行。网络上有很多《论语》文本版本。这里给出了一个版本,文件名称为“论语-网络版.txt”,其内容采用如下格式组织:

【原文】

1.11子曰:“父在,观其(1)志;父没,观其行(2);三年(3)无改于父之道(4),可谓孝矣。”

【注释】

(略)

【译文】

(略)

【评析】

(略)

该版本通过【原文】标记《论语》原文内容,采用【注释】、【译文】和【评析】标记对原文的注释、译文和评析。

问题一及其解答

问题

请编写程序,提取《论语》文档中所有原文内容,输出保存到“论语-提取版.txt”文件。输出文件格式要求:去掉文章中原文部分每行行首空格及如“1.11”等的数字标志,行尾无空格、无空行。参考格式如下(原文中括号及内部数字是对应源文件中注释项的标记):

子曰(1):“学(2)而时习(3)之,不亦说(4)乎?有朋(5)自远方来,不亦乐(6)乎?人不知(7),而不愠(8),不亦君子(9)乎?”
有子(1)曰:“其为人也孝弟(2),而好犯上者(3),鲜(4)矣;不好犯上,而好作乱者,未之有也(5)。君子务本(6),本立而道生(7)。孝弟也者,其为人之本与(8)?”
子曰:“巧言令色(1),鲜(2)仁矣。”
(略)

解答一

总程序框图
子程序1
Created with Raphaël 2.2.0 定位【原文】 在txt文档中的位置,如下述: 将整型变量flag作为标记, 并把flag的默认值设置为2。 循环遍历行文本列表 lines的元素line, 是否到达文本末尾? 跳回主程序 字符串line 是否为“【原文】\n” 将flag设置为0 确定flag是否为2 将字符串line增加到 列表ls中 字符串line 是否为“【注释】\n” 或者 “【译文】\n” 或者 ”【评析】\n" 将flag设置为1 将flag加1 yes no yes no yes no yes no
子程序2
Created with Raphaël 2.2.0 去掉line中每行行首空格,行尾无空格、无空行 并将修改后的字符串保存在列表ls中 line是否为"\n" 跳回主程序 调用字符串对象的方法 str.strip() 调用列表增加元素的方法 ls.append(str) yes no
子程序3
Created with Raphaël 2.2.0 去掉文章中原文部分 每行数字标志,并将修改后的字符串 保存内容至列表ls1,如下述: 遍历列表ls的元素line, 是否达到列表末尾 跳回主程序 遍历循环变量i, 是否小于10 遍历循环变量j, 是否小于10 将"·"前后一位数字 以及"·"变为“*”, 得到新的字符串line 将变量j的 值加1 将变量i的 值加1 遍历循环变量i, 是否小于10 将"*"前的一 位数字以及 "*"替换为 空字符串,得到 新的字符串line 将变量i的 值加1 遍历循环变量i, 是否小于10 将"*"后的一 位数字以及 "*"替换为 空字符串,得到 新的字符串line 将变量i的 值加1 将*替换为空字符, 得到新的字符串line 将字符串line增加到列表ls1中 yes no yes no yes no yes no yes no
程序代码
with open("论语-网络版.txt", "r", encoding = "UTF-8") as fi:
    lines = fi.readlines()

# 1.去掉文章中原文部分每行行首空格,行尾无空格、无空行
#   并将修改后的字符串保存在列表ls中
ls = []
flag = 2 # 用整型变量作为标记
for line in lines:
    # 定位【原文】在txt文档中的位置:
    if line == "  【原文】\n":
        flag = 0
    elif line == "  【注释】\n" or line == "  【译文】\n" or line == "  【评析】\n":
        flag = 1
    else:
        flag += 1
    # 将【原文】下面的内容赋给列表ls:
    if flag == 2:
        if line !="\n":
            ls.append(line.strip(" "))
            
# 2. 去掉文章中原文部分每行数字标志,并将修改后的字符串
#    保存内容至列表ls1
ls1 = []
for line in ls:
    ####### 将行首的数字全部转换为* #########
    for i in range(25):
        for j in range(25):
            line = line.replace("{}·{}".format(i,j),"**")
    for i in range(10):
        line = line.replace("{}*".format(i),"")
    for i in range(10):
        line = line.replace("*{}".format(i),"")
    #########################################
    line = line.replace("*","") # 替换*为空字符
    ls1.append(line)

## 3. 将列表ls1保存在文件中
with open("论语-提取版.txt", "w", encoding = "UTF-8") as fo:
    fo.writelines(ls1)
程序解释

下面从程序的形态和功能、构造、特征和性质、关系四个方面来解释程序。

形态和功能:上述代码是一组由字符、符号等以离散形式表示的能够实现提取《论语》文本功能的明确的规则体系。

构造:程序代码共分为三大部分:利用第一部分代码可以去掉《论语》原文的行首空格、行尾回车和行尾空格,处理后的文本保存在列表中;利用第二部分代码可以进一步去掉《论语》原文中的数字标志,处理后的文本保存在列表中;利用第三部分代码将经过上述两步处理后的文本保存在文件中。

特征和性质:上述代码具有唯一确定性、标准化和可通用性、可扩充性与稳定性、便于识别和记忆、力求短小和格式统一以及容易修改等特点。

1
2
3
4
5
6
代码的特征和性质
唯一确定性
标准化和可通用性
可扩充性与
稳定性
便于识别和记忆
力求短小和
格式统一
容易修改

关系:代码和源程序的概念相同。源程序是指未经编译的,按照一定程序设计语言规范书写的可读文本文件,包括算法和数据结构。源程序加上说明文档可以构成软件。

解答二

解答方案二和方案一的不同点在于子程序1。在方案一中,通过整型变量定位【原文】内容,在方案二中,通过布尔变量定位【原文】内容。

总程序框图
子程序1
Created with Raphaël 2.2.0 定位【原文】 在txt文档中的位置,如下述: 将布尔变量flag作为标记, 并把flag的默认值设置为FALSE。 循环遍历行文本列表 lines的元素line, 是否到达文本末尾? 跳回主程序 "【"是否在字符串line中 将flag设置为False "【原文】"是否在字符串line中 跳出当前循环, 并且将flag设置为True flag的值是否为True 新建一个列表, 存储【原文】中的行文本 yes no yes no yes no yes no
子程序2
Created with Raphaël 2.2.0 去掉line中每行行首空格,行尾无空格、无空行 并将修改后的字符串保存在列表ls中 line是否为"\n" 跳回主程序 调用字符串对象的方法 str.strip() 调用列表增加元素的方法 ls.append(str) yes no
子程序3
Created with Raphaël 2.2.0 去掉文章中原文部分 每行数字标志,并将修改后的字符串 保存内容至列表ls1,如下述: 遍历列表ls的元素line, 是否达到列表末尾 跳回主程序 循环变量i 是否小于10 循环变量j 是否小于10 将"·"前后一位数字 以及"·"变为“*”,得到 新的字符串line 将变量j的 值加1 将变量i的 值加1 循环变量i 是否小于10 将"*"前的一 位数字以及 "*"替换为 空字符串,得到 新的字符串line 将变量i的 值加1 循环变量i 是否小于10 将"*"后的一 位数字以及 "*"替换为 空字符串,得到 新的字符串 将变量i的 值加1 将*替换为空字符, 得到新的字符串 将新字符串line增加到列表ls1中 移动到列表ls1的下一个元素 ——字符串line yes no yes no yes no yes no yes no
程序代码
with open("论语-网络版.txt", "r", encoding = "UTF-8") as fi:
    lines = fi.readlines()

# 1.去掉文章中原文部分每行行首空格,行尾无空格、无空行
# 并将修改后的字符串保存在列表ls中

ls = []
flag = False # 用Boolean变量作为标记
for line in lines:
    # 定位【原文】在txt文档中的位置
    if  "【" in line: #遇到【时,说明已经到了新的区域,写标记为False
        flag = False
    if "【原文】" in line: #遇到【原文】时,设置写标记为True
        flag = True 
        continue
    if flag == True: 
        ls.append(line.strip(" ")) # 去除字符串中的空格和回车
        if line !="\n":
        fo.writelines(line)
for element in ls: 
    ls.remove("") # 去除列表中的空字符串 ls.remove(x)将列表ls中出现的第一个元素x删除

# 2. 去掉文章中原文部分每行数字标志,并将修改后的字符串
# 保存内容至列表ls1

ls1 = []
for line in ls:
    ####### 将行首的数字全部转换为* #########
    for i in range(10):
        for j in range(10):
            line = line.replace("{}·{}".format(i,j),"**")
    for i in range(10):
        line = line.replace("{}*".format(i),"")
    for i in range(10):
        line = line.replace("*{}".format(i),"")
    #########################################
    line = line.replace("*","") # 替换*为空字符
    ls1.append(line)

## 3. 将列表ls1保存在文件中

with open("论语-提取版.txt", "w", encoding = "UTF-8") as fo:
    fo.writelines(ls1)

解答三

总程序框图
子程序1
Created with Raphaël 2.2.0 逐条确定文章中【原文】文字部分, 如下述: 将布尔变量wflag作为标记, 并把wflag的默认值设置为FALSE。 循环遍历行文本列表lines的元素line, 是否到达文本末尾? 跳回主程序 "【"是否在字符串line中 将wflag设置为False wflag的值是否为True 去掉line中每行数字标志 去掉line每行行首空格, 保证行尾无空格、无空行 "【原文】"是否在字符串line中 跳出当前循环, 并且将wflag设置为True yes no yes no yes no yes no
子程序2
Created with Raphaël 2.2.0 去掉line中每行行首空格, 行尾无空格、无空行,如下述: line是否为"\n" 跳回主程序 调用字符串对象的 方法 str.strip() yes no
子程序3
Created with Raphaël 2.2.0 去掉line中每行 数字标志, 如下述: 循环变量i 是否小于10 循环变量j 是否小于10 将"·"前后一位数字 以及"·"变为“*”,得到新的 字符串line 将变量j的 值加1 将变量i的 值加1 循环变量i 是否小于10 将"*"前的一 位数字以及 "*"替换为 空字符串,得到 新的字符串line 将变量i的 值加1 循环变量i 是否小于10 将"*"后的一 位数字以及 "*"替换为 空字符串,得到 新的字符串line 将变量i的 值加1 将*替换为空字符, 得到新的字符串line 将line增加到列表ls1中 跳回主程序 yes no yes no yes no yes no
程序代码
with open("论语-网络版.txt", "r", encoding = "UTF-8") as fi:
    lines = fi.readlines()

# 1.去掉文章中原文部分每行行首空格,行尾无空格、无空行
#   并将修改后的字符串保存在列表ls中
ls = []
flag = False # 用Boolean变量作为标记
for line in lines:
    # 定位【原文】在txt文档中的位置
    if  "【" in line: #遇到【时,说明已经到了新的区域,写标记为False
        flag = False
    if "【原文】" in line: #遇到【原文】时,设置写标记为True
        flag = True 
        continue
    if flag == True:
        if line !="\n":
            line = line.strip(" ")
            ls.append(line) # 去除字符串中的空格和回车

# 2. 去掉文章中原文部分每行数字标志,并将修改后的字符串
#    保存内容至列表ls1
ls1 = []
for line in ls:
    ####### 将行首的数字全部转换为* #########
    for i in range(10):
        for j in range(10):
            line = line.replace("{}·{}".format(i,j),"**")
    for i in range(10):
        line = line.replace("{}*".format(i),"")
    for i in range(10):
        line = line.replace("*{}".format(i),"")
    #########################################
    line = line.replace("*","") # 替换*为空字符
    ls1.append(line)

## 3. 将列表ls1保存在文件中
with open("论语-提取版.txt", "w", encoding = "UTF-8") as fo:
    fo.writelines(ls1)

问题二及其解答

问题

请编写程序,在“论语-提取版.txt”基础上,进一步去掉每行文字中所有括号及其内部数字,保存为“论文-原文.txt”文件。参考格式如下:

子曰:“学而时习之,不亦说乎?有朋自远方来,不亦乐乎?人不知,而不愠,不亦君子乎?”
有子曰:“其为人也孝弟,而好犯上者,鲜矣;不好犯上,而好作乱者,未之有也。君子务本,本立而道生。孝弟也者,其为人之本与?”
子曰:巧言令色,鲜仁矣。”
(略)

本题暂不支持自动评分,print(“我已掌握”),即可得分

解答一

程序框图
Created with Raphaël 2.2.0 分别替换行文本中的左括号、 右括号和数字,并将修改后的文本保存在列表中、 写入文件,如下述: 以只读模式打开文件 循环遍历行 文本,是否到达 文本末尾? 结束 将左括号替换成空字符 将右括号替换成空字符 将数字替换成空字符 将修改后的行文本写入列表 以覆盖写模式打开文本,将列表内容写入文件 yes no
程序代码
with open("论语-提取版.txt","r",encoding = "UTF-8") as fi:
    lines = fi.readlines() 

#############分别替换左括号、右括号和数字##########
ls = []
for line in lines:
    line = line.replace("(","") #替换左括号
    line = line.replace(")","") #替换右括号
    for c in line:
        if c.isnumeric():
            line = line.replace(c,"") #替换数字
    ls.append(line)
##############################################       
with open("论文-原文.txt","w",encoding = "UTF-8") as fo:
    fo.write(line)

解答二

程序框图
Created with Raphaël 2.2.0 开始 以只读模式打开文件 循环遍历行 文本,是否到达 文本末尾? 结束 循环变量i是否小于25 将行文本中的括号及数字替换成* 将行文本中的*替换成空字符 将修改后的字符串写入列表中 移动到行文本的下一行 yes no yes no
程序代码
with open("论语-提取版.txt","r",encoding = "UTF-8") as fi:
    lines = fi.readlines()
###################方法二####################
#############先将括号以及括号里面的数字替换成*号,
########然后再将*替换成空字符串##########
ls = []
for line in lines:
    for i in range(25):
        line = line.replace("({})".format(i),"*") # 利用format确定指定格式的字符串
    line = line.replace("*","")
    ls.append(line)
############################################
with open("论文-原文.txt","w",encoding = "UTF-8") as fo:
    fo.writelines(ls)  

知识点总结

  1. 掌握if语句、if-else语句和if-elif-else语句的语法区别和使用方法。

  2. 掌握文件读写操作,包括常规的open函数,with…as…语句。

  3. 掌握字符串的操作:

    3.1. 字符串的提取

    学会利用标记(flag)字符(可以是boolean类型或者整型变量)查找特定的字符串。

    3.2. 字符串中指定字符的替换

    学会利用replace()函数替换字符串中的指定字符,注意replace()返回值是原字符串的副本

    3.3. 字符串中特定字符的删除(空格、回车)

    学会利用strip()函数删除字符串中的指定字符,注意strip()返回值是原字符串的副本

  4. 理解str方法isnumeric()的用法,如果字符串中所有字符均是数字,那么isnumeric()返回True,注意不要忘记参数括号“()”。

  5. 会利用format确定指定格式的字符串。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值