一、 实验目的
1. 熟悉串类型的实现方法和数组的压缩存储;
2. 掌握递归算法的设计和程序设计,掌握递归消除的方法。
二、实验要求
1. 复习课本中有串、数组的有关知识;
2. 用C++语言完成算法和程序设计并且调试通过;
三、实验题目与要求
1. 字符串的查找与替换
【问题描述】用C提供的字符串函数(或者STL的string类)将文本test.txt文件中的Tom替换成Marry,完成串的查找与替换,替换后在屏幕输出所有内容,并将替换后的结果保存在test1.txt中。
可利用以下C的字符串函数(string.h),参考如下:
Ø char* strstr(char *str1,char *str2);
其中str1: 被查找目标;str2: 要查找对象 The string expression to find.返回值:若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL
Ø void *memcpy(void *dest, const void *src, size_t n);
功能:从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中
Ø void *strcat(char *strDest, const char *strSrc);
功能:将串加strSrc连接在strDest后面,返回串strDest首地址
【注意】若用string类相关函数请自行查阅,并正确的包含相应的头文件。
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main(void)
{
ifstream in("test.txt");
ofstream out("E:\\ test1.txt");
string line;
while (getline(in, line)) {
int pos;
while ((pos = line.find("Tom")) != line.npos)
line.replace(pos, 3, "Marry");
cout << line << '\n';
out << line << '\n';
}
return 0;
}
2. 文本串加密与解密程序
【问题描述】一个文本串可用事先给定的字母映射表进行加密。例如,设字母映射表为:
则字符串“encrypt”被加密为“tkzwsdf”,编写一个程序将文件中的的文本串进行加密后写入新的文件,然后再将新的文件进行解密并输出。
【功能分析】直接使用STL的string类完成。
Ø EnCrypt(string p):字符串p的加密过程
Ø UnEncrpt(string p):字符串p的解密过程
Ø main():用A和B两个串存放字母映射表,调用EnCrypte()用于加密,即扫描p串,对于当前字母f在A串中找到后,用B串相应的字母转换,否则保持原字符不变。调用UnEncrpt()用于解密,原理与加密过程完全相同。
#include <string>
#include <fstream>
using namespace std;
string A = "abcdefghijklmnopqrstuvwxyz"; //建立A串
string B = "ngzqtcobmuhelkpdawxfyivrsj"; //建立B串
string EnCrypt(string p)
{
for (int i = 0; i < p.size(); i++)
if ('a' <= p[i] && p[i] <= 'z')
p[i] = B[p[i] - 'a'];
return p;
}
string UnEncrypt(string p)
{
for (int i = 0; i < p.size(); i++)
if ('a' <= p[i] && p[i] <= 'z')
p[i] = A[B.find(p[i])];
return p;
}
void main(void)
{
ifstream in("in.txt");
ofstream en_out("E:\\en_out.txt");
ofstream de_out("E:\\de_out.txt");
string s;
string line;
while (getline(in, line)) {
s += line;
s += '\n';
}
string en = EnCrypt(s);
en_out << en;
de_out << UnEncrypt(en);
}
3. 利用稀疏矩阵的三元组顺序表类实现(P135-P139)
将M*N稀疏矩阵进行压缩存储(利用三元组顺序表),实现压缩存储后。完成以下操作:
Ø 实现矩阵的转置
Ø 实现对完成两个矩阵的加法(如下图所示)
【存储结构分析】
矩阵A利用三元组存储非零元素如下:
行号 |
列号 |
元素值 |
1 |
3 |
11 |
1 |
5 |
17 |
因此,每个三元组的结构定义
稀疏矩阵的存储结构定义为:
【算法分析】
Ø 矩阵的加法:转换成顺序表的合并
1. SeqSpaMatrix.h
#define MAXSIZE 1000
typedef int ElementType;
typedef struct {
int row;
int col;
ElementType e;
} Triple;
typedef struct {
Triple data[MAXSIZE];
int m; // row
int n; // col
int len;
} TSMatrix;
TSMatrix creat(ElementType (*arr)[MAXSIZE], int row, int col);
TSMatrix transpose(TSMatrix matrix);
TSMatrix sum(TSMatrix a, TSMatrix b);
void print(TSMatrix matrix);
2. SeqSpaMatrix.cpp
/*实现SeqSpaMatr;ix.h中声明的函数*/
#include "SeqSpaMatrix.h"
#include <stdio.h>
TSMatrix creat(ElementType(*arr)[MAXSIZE], int row, int col)
{
TSMatrix matrix;
matrix.len = 0;
matrix.m = row;
matrix.n = col;
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
if (arr[i][j])
matrix.data[matrix.len++] = { i, j, arr[i][j] };
return matrix;
}
TSMatrix transpose(TSMatrix matrix)
{
TSMatrix res = { { 0 }, matrix.n, matrix.m, 0 };
for (int i = 0; i < matrix.m; i++)
for (int j = 0; j < matrix.len; j++)
if (i == matrix.data[j].col) {
res.data[res.len] = matrix.data[j];
res.data[res.len].row = i;
res.data[res.len++].col = matrix.data[j].row;
}
return res;
}
TSMatrix sum(TSMatrix a, TSMatrix b)
{
if (a.m != b.m || a.n != b.n)
return{ 0 };
TSMatrix res = { { 0 }, a.m, a.n, 0 };
int i = 0, j = 0;
while (i < a.len && j < b.len) {
if (a.data[i].row == b.data[j].row)
if (a.data[i].col == b.data[j].col) {
res.data[res.len] = a.data[i++];
res.data[res.len].e += b.data[j++].e;
}
else if (a.data[i].col < b.data[j].col)
res.data[res.len] = a.data[i++];
else
res.data[res.len] = b.data[j++];
else if (a.data[i].row < b.data[j].row)
res.data[res.len] = a.data[i++];
else
res.data[res.len] = b.data[j++];
res.len++;
}
while (i < a.len)
res.data[res.len++] = a.data[i++];
while (j < b.len)
res.data[res.len++] = b.data[j++];
return res;
}
void print(TSMatrix matrix)
{
printf("矩阵行数为:%d,列数为:%d,非零元个数为:%d\n",
matrix.m, matrix.n, matrix.len);
for (int i = 0, x = 0; i < matrix.m; i++) {
for (int j = 0; j < matrix.n; j++)
printf("%4d ",
i == matrix.data[x].row && j == matrix.data[x].col ?
matrix.data[x++].e : 0);
printf("\n");
}
}
3.Main.cpp
/*程序的入口,实现矩阵的压缩存储,能够进行相关操作,如转置矩阵,矩阵相加等*/
#include "SeqSpaMatrix.h"
#include <stdio.h>
ElementType data[MAXSIZE][MAXSIZE];
void main(void)
{
printf("输入 行数 列数:");
int row, col;
scanf("%d %d", &row, &col);
puts("输入矩阵");
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
scanf("%d", data[i] + j);
TSMatrix A = creat(data, row, col);
print(A);
puts("转置");
TSMatrix B = transpose(A);
print(B);
puts("相加");
TSMatrix C = sum(A, B);
print(C);
}