(@▽@)
2021-04-19 20:59
采纳率: 100%
浏览 40

初学C++,麻烦问哈这个问题如何解决?

我学C++没得好久还没学到函数,所以代码有点繁琐,在运行输入完数据后出现了这个问题,但是不晓得怎么解决。。

#include <iostream>
#include<iomanip>


int main() {
	size_t rows1{}, columns1{};
	std::cout << "How many rows and columns?" << std::endl;
	std::cin >> rows1 >> columns1;//输入第一个矩阵的行列数
	if (rows1 == 0 || columns1 == 0)//如果行列数为0,则不进行计算
		return 0;
	double** matrix1{ new double*[rows1] };//matrix1数组是double*指针的一个动态数组,每个double*指针包含一个double数组的地址
	for (size_t i = 0; i < rows1; ++i) {
		matrix1[i] = new double [columns1] {};//矩阵的行
	}
	for (size_t i{}; i < rows1; ++i) {
		for (size_t j{}; j < columns1; ++j) {
			std::cout << "Please enter the value of row " << i+1 << " and column " << j+1 << std::endl;
			std::cin >> matrix1[i][j];//输入矩阵第【i+1,j+1】的值
		}
	}
	size_t rows2{}, columns2{};
	std::cout << "How many rows and columns?" << std::endl;
	std::cin >> rows2 >> columns2;//输入第二个矩阵的行列数
	if (rows2 == 0 || columns2 == 0)//如果行列数为0,则不进行计算
		return 0;
	double** matrix2{ new double*[rows2] };//matrix2数组是double*指针的一个动态数组,每个double*指针包含一个double数组的地址
	for (size_t i = 0; i < rows2; ++i) {
		matrix2[i] = new double [columns2] {};//矩阵的行
	}
	for (size_t i{}; i < rows2; ++i) {
		for (size_t j{}; j < columns2; ++j) {
			std::cout << "Please enter the value of row " << i+1 << " and column " << j+1 << std::endl;
			std::cin >> matrix2[i][j];// 输入矩阵第【i + 1,j + 1】的值
		}
	}
	if (columns1 != rows2) {
		std::cout << "The two matrices cannot be multiplied.Please re-enter.";//判定第一个矩阵的列数是否等于第二个矩阵的行数
		return 0;
	}
	double** matrix3{ new double*[columns1] };//将第一个矩阵的列数作为第三个矩阵的行数
	for (size_t i = 0; i < columns1; ++i) {
		matrix2[i] = new double [rows2] {};//将第二个矩阵的行数作为第三个矩阵的列数
	}
	double* pvalue{ new double{ } };//设置一个中间值方便计算
	for (size_t i{}; i < rows1; ++i) {
		for (size_t j{}; j < columns2; ++j) {
			for (size_t k{}; k < columns1; ++k) {
			*pvalue = (matrix1[i][k] * matrix2[k][j]);//计算第一个矩阵第[i][k]个元素和第二个矩阵第[k][j]个元素的乘积
			matrix3[i][j] += *pvalue;//第三个元素第[i][j]个元素的值等于k个*pavlue的值的和
			}
		}
	}
	delete pvalue;//删除pvalue
	pvalue = nullptr;//重设指针
	for (size_t i{ }; i < columns1; ++i) {
		for(size_t j{ }; j < rows2; ++j){
			std::cout << std::setw(12) << matrix3;
		}
		std::cout << std::endl;
	}//遍历输出第3个矩阵
	for (size_t i{}; i < rows1; ++i)
		delete[] matrix1[i];//删除第一个矩阵的列
	delete[] matrix1;//删除第一个矩阵
	for (size_t i{}; i < rows2; ++i)
		delete[] matrix2[i];//删除第二个矩阵的列
	delete[] matrix2;//删除第二个矩阵
	for (size_t i{}; i < rows2; ++i)
		delete[] matrix3[i];//删除第二个矩阵的列
	delete[] matrix3;//删除第二个矩阵
}
  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

6条回答 默认 最新

  • CSDN专家-cpp_learner 2021-04-20 08:19
    已采纳

    double** matrix3 { new double*[columns1] };//将第一个矩阵的列数作为第三个矩阵的行数

    这个matrix3你定义了,没有像matrix1和matrix2那样对他内部的值进行分配内存。

    已采纳该答案
    评论
    解决 1 无用
    打赏 举报
  • bostonAlen 2021-04-19 21:09

    这种问题你要把你的输入给出来,才好帮你看

    评论
    解决 无用
    打赏 举报
  • (@▽@) 2021-04-19 22:33

    上面那个截图有输入的嘛

    评论
    解决 无用
    打赏 举报
  • 有问必答小助手 2021-04-20 11:13

    您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

    如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

    ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

    评论
    解决 无用
    打赏 举报
  • 有问必答小助手 2021-04-21 18:23

    非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

    速戳参与调研>>>https://t.csdnimg.cn/Kf0y

    评论
    解决 无用
    打赏 举报
  • C和C++技术博客 2021-04-26 20:16

    C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html
    C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题