实验目的:

掌握稀疏矩阵的压缩存储方法及主要运算的实现。

实验内容与要求:

设计一个稀疏矩阵计算器,要求能够:⑴输入并建立稀疏矩阵;⑵输出稀疏矩阵(先输出三元组,再输出矩阵);⑶执行两个矩阵相加;⑷执行两个矩阵相乘;⑸求一个矩阵的转置矩阵(用快速转置);⑹(选做)求一个矩阵的逆矩阵。

选做未做

#include<iostream>
#include <iomanip>
using namespace std;
const int MAXSIZE=100;     //矩阵非零元个数template<class T>
class TSMaxtrix {
private:struct Triple {     //三元组int i;         //行下标int j;         //列下表T e;           //非零元值};Triple *data;                       //三元组表int mu;                               //行数int nu;                             //列数int tu;                             //非零元个数int cpot[MAXSIZE] = { 0 };          //记录T中各行非零元当前存储位置。int num[MAXSIZE] = { 0 };            //记录稀疏阵每列非零元个数public://初始化TSMaxtrix() {data = new Triple[MAXSIZE];mu = 0;nu = 0;tu = 0;}//创建稀疏阵void create() {cout << "输入矩阵行、列数:";int m, n;cin >> m >> n;mu = m; nu = n;T z;      //临时记录数据大小for (int i = 0; i < m; i++) {cout << "输入第" << i + 1 << "行的数据:";for (int j = 0; j < n; j++) {cin >> z;if (z != 0) {              data[tu].i = i; data[tu].j = j; data[tu].e = z;tu++;num[j]++;}}}}//输出稀疏阵void print() {if (tu != 0) {//输出三元组表cout << "三元组表为:" << endl;;for (int i = 0; i < tu; i++) {cout << "    |" << setw(2) << data[i].i + 1 << "|" << setw(2) << data[i].j + 1 << "|" << setw(2) << data[i].e << "|" << endl;}int z = 0;cout << "矩阵为:" << endl;for (int i = 0; i < mu; i++) {cout << "    ";for (int j = 0; j < nu; j++) {if (i == data[z].i && j == data[z].j) {cout << setw(5) << data[z].e;z++;}else {cout << setw(5) << "0";}}cout << endl;}}else {cout << endl<<"    error"<<endl;}}//两个矩阵相加void add(TSMaxtrix<T>t1, TSMaxtrix<T>t2) {this->mu = t1.mu; this->nu = t1.nu;int x = 0, y = 0;//判断这两个矩阵是否能相加if (t1.mu == t2.mu && t1.nu == t2.nu) {//将两个矩阵相同位置数据相加并放入当前矩阵相应位置,不同位置数据依次放入while (x != t1.tu && y != t2.tu) {if (t1.data[x].i == t2.data[y].i && t1.data[x].j == t2.data[y].j) {this->data[tu].i = t1.data[x].i;this->data[tu].j = t1.data[x].j;this->data[tu].e = t1.data[x].e + t2.data[y].e;tu++;x++; y++;}else if (t1.data[x].i < t2.data[y].i || (t1.data[x].i == t2.data[y].i && t1.data[x].j < t2.data[y].j)) {this->data[tu].i = t1.data[x].i;this->data[tu].j = t1.data[x].j;this->data[tu].e = t1.data[x].e;tu++;x++;}else if (t2.data[y].i < t1.data[x].i || (t2.data[y].i == t1.data[x].i && t2.data[y].j < t1.data[x].j)) {this->data[tu].i = t2.data[y].i;this->data[tu].j = t2.data[y].j;this->data[tu].e = t2.data[y].e;tu++;y++;}}//将矩阵t1剩余元素加入当前矩阵while (x != t1.tu) {this->data[tu].i = t1.data[x].i;this->data[tu].j = t1.data[x].j;this->data[tu].e = t1.data[x].e;tu++;x++;}//将矩阵t2剩余元素加入当前矩阵while (y != t2.tu) {this->data[tu].i = t2.data[y].i;this->data[tu].j = t2.data[y].j;this->data[tu].e = t2.data[y].e;tu++;y++;}}}//两个矩阵相乘void multiply(TSMaxtrix<T>t1, TSMaxtrix<T>t2) {//判断这两个矩阵是否能相乘if (t1.nu == t2.mu) {this->mu = t1.mu;this->nu = t2.nu;int i = 0; int z; //z为判断数据while (i != t1.tu) {for (int j = 0; j < t2.tu; j++) {if (t1.data[i].j == t2.data[j].i) {z = 0;for (int k = 0; k < this->tu; k++) {//判断元素是否需要相加合并if (t1.data[i].i == this->data[k].i && t2.data[j].j == this->data[k].j) {this->data[k].e += t1.data[i].e * t2.data[j].e;z = 1;}                  }if (z == 0) {        //为结果三元组表赋值this->data[tu].i = t1.data[i].i;this->data[tu].j = t2.data[j].j;this->data[tu].e = t1.data[i].e * t2.data[j].e;tu++;}                  }}i++;}}}//矩阵的转置void transposition(TSMaxtrix M) {//获取矩阵T各行非零元储存位置this->cpot[this->tu] = 0;this->tu++;for (int i = 0; i < M.tu; i++) {this->cpot[this->tu] =this->cpot[this->tu-1]+M.num[i];this->tu++;}this->tu = M.tu;this->mu = M.nu;this->nu = M.mu;//三元组形式开始转置for (int i = 0; i < M.tu; i++) {this->data[this->cpot[M.data[i].j]].i = M.data[i].j;this->data[this->cpot[M.data[i].j]].j = M.data[i].i;this->data[this->cpot[M.data[i].j]].e = M.data[i].e;this->cpot[M.data[i].j] += 1;}}};//菜单
void show() {cout << "---数组的运算---" << endl;cout << "---1.创建稀疏矩阵" << endl;cout << "---2.两个稀疏阵相加" << endl;cout << "---3.两个稀疏阵相乘" << endl;cout << "---4.稀疏阵的转置" << endl;cout << "---0.退出" << endl;
}
int main() {int n = 0; char ch;while (1) {show();cout << endl;cin >> n;if (n == 0)break;//创建稀疏矩阵if (n == 1) {TSMaxtrix<float>T;T.create();T.print();cout << endl << endl << "按下回车健执行下一步";ch = cin.get();ch = cin.get();system("cls ");}//两个稀疏阵相加if (n == 2) {TSMaxtrix<float>T; TSMaxtrix<float>T1; TSMaxtrix<float>T2;cout << "创建稀疏阵一" << endl;T1.create();cout << endl<< "创建稀疏阵二" << endl;T2.create();cout << "两个稀疏阵相加后结果为:" << endl;T.add(T1, T2);T.print();cout << endl << endl << "按下回车健执行下一步";ch = cin.get();ch = cin.get();system("cls ");}//两个稀疏阵相乘if (n == 3) {TSMaxtrix<float>T; TSMaxtrix<float>T1; TSMaxtrix<float>T2;cout << "创建稀疏阵一" << endl;T1.create();cout <<endl<< "创建稀疏阵二" << endl;T2.create();cout << "两个稀疏阵相乘后结果为:" << endl;T.multiply(T1, T2);T.print();cout << endl << endl << "按下回车健执行下一步";ch = cin.get();ch = cin.get();system("cls ");}//稀疏阵的转置if (n == 4) {TSMaxtrix<float>T; TSMaxtrix<float>M;cout << "创建稀疏阵" << endl;M.create();M.print();cout << "转置后的矩阵为" << endl;T.transposition(M);T.print();cout << endl << endl << "按下回车健执行下一步";ch = cin.get();ch = cin.get();system("cls ");}     }
}

实验五 数组的运算(第8周)相关推荐

  1. 桂 林 理 工 大 学实 验 报 告实验五 数组

    桂 林 理 工 大 学 实  验  报  告 班级 计算机类20 学号32020520 姓名  实验名称实验五 数组 日期 2020年 11月28日 一.实验目的: 熟悉掌握一维数组和二维数组的定义和 ...

  2. c语言程序设计 实验五数组6,实验五 数组——一维数组.doc

    实验五 数组--一维数组 淮海工学院计算机科学系实验报告书 课程名:< C语言程序设计教程> 题 目: 实验五 数组--一维数组 班 级: 学 号: 姓 名: 评语: 成绩: 指导教师: ...

  3. c语言程序设计 实验五数组6,c语言实验五数组程序设计解答.doc

    c语言实验五数组程序设计解答.doc 实验五数组应用(二)一.实验目的1(掌握二维数组的定义和初始化.2(掌握二维数组元素的引用及其应用.3(掌握字符数组的定义和初始化.4(掌握字符数组元素的引用及其 ...

  4. 利用matlab实现卷积实验报告,实验五 使用matlab实现卷积的运算

    实验五 使用matlab实现卷积的运算 一 实验目的 1. 2. 二 实验内容 学习MATLAB语言的编程方法及熟悉MATLAB指令: 深刻理解卷积运算,利用离散卷积实现连续卷积运算: 1. 完成f1 ...

  5. java 网络实验_Java实验五网络编程与安全

    实验五 网络编程与安全 实验准备 活动一 两人一组结对编程: 0. 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA 1. 结对实现中缀表达式 ...

  6. 计算机系统实验五:缓冲区溢出攻击

    参考教材:计算机系统基础 第二版 袁春风 机械工业出版社 参考慕课:计算机系统基础(四):编程与调试实践 https://www.icourse163.org/learn/NJU-1449521162 ...

  7. 20175203 2018-2019 实验五《网络编程与安全》

    20175203 2018-2019 实验五<网络编程与安全> 知识重点(摘自实验资料) 栈 :(Stack)是一种只允许在表尾插入和删除的线性表,有先进后出(FILO),后进先出(LIF ...

  8. 2018-2019-2 20175204 张湲祯 实验五《网络编程与安全》实验报告

    2018-2019-2 20175204 张湲祯 实验五<网络编程与安全>实验报告 实验五<网络编程与安全> 一.实验内容: 1.网络编程与安全-1 任务详情 两人一组结对编程 ...

  9. 20165310 Java实验五《网络编程与安全》

    20165310 Java实验五<网络编程与安全> 任务一 题目:①编写MyBC.java实现中缀表达式转后缀表达式的功能:②编写MyDC.java实现从上面功能中获取的表达式中实现后缀表 ...

最新文章

  1. Android--框架布局
  2. 4.4基于switch语句的译码器
  3. vue使用render渲染jsx
  4. 终于有人把大数据讲明白了。。。
  5. awk是命令还是编程语言
  6. html5 canvas修改颜色,html5 canvas 笔记二(添加样式和颜色)
  7. java 多版本管理工具_简介linux下的多版本管理工具—alternatives
  8. Linux核心应用命令速查
  9. Android Studio R类找不到(Mac)
  10. macOS安装配置rzsz(附博主安装过程中的错误解决)
  11. 谈计算机财务管理的相关论文,有关计算机财务管理的思考论文
  12. 射频中的回波损耗,反射系数,电压驻波比以及S参数的含义和关系
  13. 大数据应用之 --- apache doris 基于ssb测试
  14. 一种电池过放电保护电路
  15. 基于GitLab+Docker+K8S的持续集成和交付
  16. 德州农工大学计算机专业研究生,德州农工大学计算机专业
  17. 罗格斯的计算机科学,罗格斯大学计算机科学研究生申请截止日期
  18. 投资合伙人股份分配_创业者必看的合伙人股权分配细则
  19. 第二十四章 Caché 变量大全 $ZA 变量
  20. Win7上.bat文件打开方式变成了文本文档,怎么修改和恢复

热门文章

  1. sleuth+zipkin链路追踪
  2. 电视盒子与机顶盒哪个好?当贝MAX 1才是最值得买的电视盒子
  3. 【前端】优酷、酷6、土豆网视频自动播放代码
  4. hdu-2612-Find a way(双bfs)
  5. 全球“独角兽”创企数量增至500家 中国位居第二
  6. xtrabackup mysql_使用xtrabackup实现MySQL主从复制
  7. c语言枚举进程以及遇到的编码问题
  8. nfl证明_在电脑上观看NFL周日晚上足球
  9. Linux替换内容出现E488: Trailing characters
  10. Spring JdbcTemplate 无效的列索引错误