1.  某英文逐词翻译软件,不区分大小写。为了加快翻译速度,在翻译的过程中,软件会将最近出现过的一些单词存入内存。若内存中有该单词则直接翻译,否则查外存词典并将该单词存入内存。内存中每个单元存储一个单词,存满时会清空最早进入内存的单词,腾出单元存放新单词。编程模拟软件的翻译过程,输入一个仅含英文、逗号或空格字符的英语句子,以句号结束,计算翻译软件需要去外存查找多少次词典,在翻译开始前,内存中没有任何单词。运行界面如图所示。

(1) 若上图中的内存容量改为 7,则需要去外存查找次词典。
(2) 实现上述功能的 Python 程序如下,请在划线处填入合适的代码。

m = int(input("请输入内存容量:"))

s = input("请输入英语句子:")

dic = {}

head = tail = 0

word = ""

for ch in s:

 if ch == " " or ch == "," or ch == ".":

 if word not in dic or dic[word] < head:

 if tail - head == m:

                

 dic[word] = tail

 tail + = 1

 word = ""

 else:

 if :

 ch = chr(ord(ch) + 32)

 word += ch

print("需要去外存查找",,"次词典")

【考点】
运算符、基本运算与表达式; 分支结构语句及程序实现; 循环结构语句及程序实现;
【答案】

您现在未登录,无法查看试题答案与解析。 登录
综合题 困难
能力提升
真题演练
换一批
2. 为四则运算式“6+(8-2)*2÷3”转逆波兰表达“682-2*3÷+”设计算法,编程实现。

分析:在数学运算表达式中,运算符总是置于与之相关的两个运算对象之间,在计算结果时,要考虑括号、运算符号的优先性。为了程序实现的方便,波兰逻辑学家J.Lukasiewicz提出了另一种表示法,将运算符置于其运算对象之后,没有括号,不用考虑运算符号的优先性。这种表达式称为后缀表达式,又叫逆波兰表达式。

如表达式“682-2*3÷+”是四则运算式“6+(8-2)*2÷3”的逆波兰表达式。为了处理方便, 规定表达式中的数均为小于 10 的正整数, 运算符为+ - * ÷。

⑴抽象建模

设计两个栈bds、fh,栈bds用来存放表达式,栈fh用来暂时存放运算符。从左往右扫描四则运算式,遇到数字时,入栈bds;遇到运算符号时,根据运算符号的优先级设计进栈与出栈。

四则运算式“6+(8-2)*2÷3”转换规则的模拟过程如表1所示:

表 1

结合表1的操作过程,用栈bds和栈fh记录每个操作后的栈内情况(见下图),那么在操作2中栈fh里有内容为(请从栈底到栈顶顺序书写)。

⑵设计算法

基于问题的抽象与建模,解决该问题的主要算法描述如下:

从左往右遍历四则运算式s(设中间变量为ch):

1)当ch是数字,直接入栈bds;

2)当ch是运算符:

a.若ch为左括号时,直接入栈fh;

b.若ch为右括号时,则将栈fh元素弹出,压入栈bds,直到遇到左括号(左括号只弹出,不压入栈bds);

c.若ch为其它运算符时,如果运算符ch优先级大于栈fh中栈顶元素的优先级(或栈fh为空),直接入栈fh;否则,将栈fh元素依次弹出,并压入栈bds,直到运算符ch优先级大于栈fh中栈顶元素的优先级(或栈fh为空);

3)将栈bds中元素依次出栈,即为该四则运算s的后缀表达式。

⑶编写程序

实现上述功能的 Python 代码如下,请在划线处填入合适代码。

yxj = {"+":1,"-":1,"*":2,"÷":2} #运算规则的优先级

s = input("请输入四则运算式: ")

fh = [""]*100  #存储运算符

topfh = -1

bds = [""]*100 #存储表达式

top=-1

for ch in s:

if ch.isdigit():   #字符串只包含数字则返回 True 否则返回 False

top+=1

bds[top]=ch

elif ch == "(":

topfh +=1

fh[topfh]=ch

elif ch == ")":

while True:

tmp = fh[topfh]

topfh-=1

if tmp=="(":

top+=1

bds[top]=tmp

elif ch in yxj:

if topfh==-1 or fh[topfh]=="(":

topfh += 1

fh[topfh]=ch

elif :

topfh+=1

fh[topfh]=ch

else:

while fh[topfh]!="(" and topfh!=-1:

if yxj[fh[topfh]]>=yxj[ch]:

top+=1

bds[top]=fh[topfh]

topfh-=1

else:

break

topfh+=1

while topfh!=-1:

top+=1

bds[top]=fh[topfh]

topfh-=1

print("后缀表达式:","".join(bds[:top+1]))

综合题 普通
3. 某数据压缩方法描述如下:

①原始数据中,某数不为0且相邻无重复,压缩数据用该数据表示;②原始数据中,某数为0且相邻无重复,压缩数据用两个数表示,第1个为0,第2个为0;③原始数据中,某数据相邻有重复,压缩数据用3个数表示:第1个为0,第2个为重复数的个数,第3个为该数本身。

根据上述压缩方法,对应的解压缩方法示例如图所示。

小明学习了Python的PIL、matplotlib和numpy等模块知识后,现有图像文件“杭州.bmp”,该文件的颜色模式为RGB,将该图像文件的每个像素点转换成灰度值(值为整数)后,使用上述压缩方法进行压缩并保存为文本文件。颜色RGB值转灰度值的公式如下:

灰度值=0.299×红色颜色分量+0.587×绿色颜色分量+0.114×蓝色颜色分量

(1) 如果压缩数据为“23,0,21,66,0,0,77,0,5,0”,则解压缩数据的个数是
(2) 实现上述功能的 Python 程序如下。请在划线处填入合适代码。

from PIL import Image

import numpy as np

import matplotlib.pyplot as plt

img = np.array(Image.open("杭州.bmp"))

row,cols,rgb =img.shape

s= []

for i in range(row) :

for j in range(cols) :

r,g,b = img[i,j]

hdz =

s.append(hdz)

ss = [] ;j = 0

while j<len(s)-1 :

if s[j] !=s[j+1] :

if s[j] !=0:

ss.append(s[j])

else:

ss.extend( )#extend 函数用于在列表末尾一次性追加另一个序列中的多个值

j+=1

else:

c = s[j]

for k in range(j+1,len(s)) :

if c!=s[k]:

break

else:

ss.extend([0,k-j,s[j]])

j=k

if j!=len(s) :

ss.append(s[j])

f = open(" 杭州 255.txt","w+")

f.write(",".join(map(str,ss)))

f.close()

综合题 困难