数据结构递归算法(六)串类型的实现方法、数组的压缩存储、递归消除的方法

一、 实验目的

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);
}



猜你喜欢

转载自blog.csdn.net/weixin_42442713/article/details/80959985
今日推荐