第四章作业
一、选择题1,2,3,4,5
1.串是一种特殊的线性表,其特殊性体现在(B)
A.可以顺序存储
B.数据元素是一个字符
C.可以链式存储
D.数据元素可以是多个字
2.设有两个串p和q,求q在p中首次出现的位置的运算称为(B)
A.连接
B.模式匹配
C.求子串
D.求串长
3.设串 s1=“ABCDEFG”,s2=“PQRST”,函数con(x,y)返回x和y串的连接串,subs(s,i,j)返回串s的从序号i开始的j个字符组成的子串,len(s)返回串s的长度,则con(subs(s1,2,len(s2)),subs(s1,len(s2),2))的结果串是(D)
A.BCDEF
B.BCDEFG
C.BCPQRST
D.BCDEFEF
4.假设有60行70列的二维数组a[1…60,1…70]以列序为主序顺序存储,其基地址为10000,每个元素占两个存储单元,那么第32行第58列的元素a[32,58]的存储地址为(A),注意无第0行第0列的元素。
A.16902
B.16904
C.14454
D.答案A,B,C均不对
5.设矩阵A是一个对称矩阵,为了节省存储,将其下三角部分(如图)按行序存放在一维数组B[1,n(n-1)/2]中,
对下三角部分中的任一元素 a i , j a_{i,j} ai,j(i<=j),在一维数组B中下标k值是(B)
A.i(i-1)/2+j-1
B.i(i-1)/2+j
C.i(i+1)/2+j-1
D.i(i+1)/2+j
二、填空题1,2,3,5,7,8
1.不包含任何字符(长度为0)的串称为(空串);由一个或多个空格(仅有空格符)组成的串称为(空白串)。
2.设s=“A;/document/Mary.doc”,则strlen(s)=(20)的“/”字符定位的位置为(3)
3.字串的定位运算称为串的模式匹配;被匹配的主串称为(被匹配的串),(子串)称为模式
5.设目标T=“abccdcdccbaa”,模式P=“cdcc”,则第(6)次匹配成功。
7.假设有二维数组A6X8,每个元素用相邻的6个字节存储,存储器按字节编址。已知A的起始存储位置(基地址)为1000,则数组A的体积(存储量)为(288B);末尾元素A57的第一个字节的地址为(1282);若按行存储,元素A14的第一个字节的地址为(1072);若按列存储,元素A47的第一个字节的地址为(1276)。
8.设数组a[1…60,1…70]的基地址为2048,每个元素占两个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为(8950)
三、算法设计题3,5,7
3.编写基于SeqString类的成员函数reverse(),要求将当前对象中的字符反序存放
class SeqString:def __init__(self, s):self.str = sdef reverse(self):# 使用切片来反转字符串self.str = self.str[::-1]def print(self):print(self.str)# 测试代码
s = SeqString("reverse 1999")
print("Original string:", end=" ")
s.print()
s.reverse()
print("Reversed string:", end=" ")
s.print()
5.编写基于SeqString类的成员函数stringcount(str),要求统计子串str在当前对象串中出现的次数,若不出现则返回0.
class SeqString:def __init__(self, s):self.str = sdef stringcount(self, sub_str):count = 0start_index = 0while True:# 在当前对象串中搜索子串index = self.str.find(sub_str, start_index)if index == -1:breakcount += 1# 更新搜索的起始位置start_index = index + 1return count# 测试代码
s = SeqString("reverse 1999:Can you can a can as a canner can can a can")
sub_str = "can"
print("Number of occurrences of '{}' in '{}': {}".format(sub_str, s.str, s.stringcount(sub_str)))
7.已知两个稀疏矩阵A和B,试基于三元组顺序表或十字链表的存储链表编程实现A+B的运算。
class MatrixNode:def __init__(self, row, col, value):self.row = rowself.col = colself.value = valueself.right = Noneself.down = Noneclass CrossLinkedList:def __init__(self, row_num, col_num):self.row_num = row_numself.col_num = col_num# 初始化行指针和列指针self.row_heads = [None] * row_numself.col_heads = [None] * col_numdef insert(self, row, col, value):# 创建节点node = MatrixNode(row, col, value)# 插入节点到行链表if self.row_heads[row] is None or self.row_heads[row].col > col:node.right = self.row_heads[row]self.row_heads[row] = nodeelse:current = self.row_heads[row]while current.right and current.right.col < col:current = current.rightnode.right = current.rightcurrent.right = node# 插入节点到列链表if self.col_heads[col] is None or self.col_heads[col].row > row:node.down = self.col_heads[col]self.col_heads[col] = nodeelse:current = self.col_heads[col]while current.down and current.down.row < row:current = current.downnode.down = current.downcurrent.down = nodedef add(self, other):if self.row_num != other.row_num or self.col_num != other.col_num:raise ValueError("Matrix dimensions don't match")result = CrossLinkedList(self.row_num, self.col_num)for row in range(self.row_num):for col in range(self.col_num):value1 = self.get_value(row, col)value2 = other.get_value(row, col)result_value = value1 + value2if result_value != 0:result.insert(row, col, result_value)return resultdef get_value(self, row, col):current = self.row_heads[row]while current:if current.col == col:return current.valueelif current.col > col:return 0current = current.rightreturn 0def print_matrix(self):for row in range(self.row_num):for col in range(self.col_num):print(self.get_value(row, col), end=" ")print()# 测试代码
A = CrossLinkedList(3, 3)
A.insert(0, 0, 1)
A.insert(0, 2, 2)
A.insert(1, 0, 0)
A.insert(2, 0, 4)
print("矩阵A :")
A.print_matrix()B = CrossLinkedList(3, 3)
B.insert(0, 1, 5)
B.insert(1, 0, 6)
B.insert(1, 1, 7)
B.insert(2, 2, 8)
print("矩阵B :")
B.print_matrix()C = A.add(B)
print("A + B:")
C.print_matrix()