我实现了可以找到矩阵元素的c ++程序: 这是行的最大元素,同时是其列的最小元素或行的 - min元素,同时也是其列的最大元素。 例如,我们有data.txt文件:
其中4是n - 矩阵大小(4x4),7和10是那些数字。
以下是代码:
#include <iostream>
#include <fstream>
using namespace std;
int main(){
ifstream is;
ofstream os;
int n;
is.open("data.txt");
if (is.fail()){
cout << "Failed to open data file" << endl;
exit(-1);
}
is >> n;
double **matrix;
matrix = new double*[n];
for (int i = 0; i < n; i++){
matrix[i] = new double[n];
}
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
is >> matrix[i][j];
}
}
double* maxROW = new double[n];
double* minROW = new double[n];
for (int i = 0; i < n; i++){
maxROW[i] = matrix[i][0];
minROW[i] = matrix[i][0];
for (int j = 0; j < n; j++){
if (matrix[i][j] > maxROW[i]){
maxROW[i] = matrix[i][j];
}
if (matrix[i][j] < minROW[i]){
minROW[i] = matrix[i][j];
}
}
}
double* maxCOLUMN = new double[n];
double* minCOLUMN = new double[n];
int x = 0;
for (int i = 0; i < n; i++){
maxCOLUMN[i] = matrix[0][x];
minCOLUMN[i] = matrix[0][x];
for (int j = 0; j < n; j++){
if (matrix[j][i] > maxCOLUMN[i]){
maxCOLUMN[i] = matrix[j][i];
}
if (matrix[j][i] < minCOLUMN[i]){
minCOLUMN[i] = matrix[j][i];
}
if (j == n - 1) x++;
}
}
int k = 0;
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
if (maxROW[i] == minCOLUMN[j]){
k++;
}
if (minROW[i] == maxCOLUMN[j]){
k++;
}
}
}
double* matrixNUM = new double[k];
int l = 0;
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
if (maxROW[i] == minCOLUMN[j]){
matrixNUM[l] = matrix[i][j];
l++;
}
if (minROW[i] == maxCOLUMN[j]){
matrixNUM[l] = matrix[i][j];
l++;
}
}
}
cout << "Matrix numbers: " << endl;
for (int i = 0; i < k; i++){
cout << matrixNUM[i] << ", ";
}
cout << endl;
for (int i = 0; i < n; i++){
delete[] matrix[i];
}
delete[] matrix;
delete[] maxCOLUMN;
delete[] minCOLUMN;
delete[] maxROW;
delete[] minROW;
delete[] matrixNUM;
return 0;
}
问题:我想知道我的代码是否是“脏”代码?因为我总是热衷于使一切变得如此困难,因为它可以让它变得简单。是否有不同的方式,可能更容易,也许更容易理解的方式来实现这样的任务?在此先感谢谁将在此代码中发现错误。
答案 0 :(得分:2)
int main(){
std::ifstream is;
std::ofstream os;
is.open("data.txt");
if (is.fail()){
std::cerr << "Failed to open data file\n";
exit(-1);
}
int n;
is >> n;
if (n <= 0)
{
std::cerr << "Negative matrix size, aborting\n";
exit(-1);
}
std::vector< std::vector<double> > matrix( n, std::vector<double>(n) );
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
is >> matrix[i][j];
}
}
std::vector<double> maxROW(n);
std::vector<double> minROW(n);
for (int i = 0; i < n; i++){
auto minmax = std::minmax_element( matrix[i].begin(), matrix[i].end() );
maxROW[i] = *minmax.second;
minROW[i] = *minmax.first;
}
std::vector<double> maxCOLUMN(n);
std::vector<double> minCOLUMN(n);
for (int i = 0; i < n; i++){
maxCOLUMN[i] = matrix[0][i];
minCOLUMN[i] = matrix[0][i];
for (int j = 1; j < n; j++){
maxCOLUMN[i] = std::max( maxCOLUMN[i], matrix[j][i] );
minCOLUMN[i] = std::min( minCOLUMN[i], matrix[j][i] );
}
}
std::vector<double> matrixNUM;
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
if (maxROW[i] == minCOLUMN[j]){
matrixNUM[l].push_back(matrix[i][j]);
}
if (minROW[i] == maxCOLUMN[j]){
matrixNUM[l].push_back(matrix[i][j]);
}
}
}
std::cout << "Matrix numbers: " << endl;
for (double num:matrixNUM)
std::cout << num << ", ";
}
std::cout << "\n";
}
可能存在拼写错误,但上述内容应该同样快,代码也少。
它确实使用了一些C ++ 11功能。
答案 1 :(得分:0)
随机注意,C ++ 11在其可变长度数组处理方面仍然有一些繁琐的方面,但是:
int n; is >> n;
double (&matrix)[n][n] = *(double(*)[n][n])(new double[n*n]);
for (auto &r:matrix)
for (auto &c:r)
is >> c;
// ...
delete[] &matrix
非常好。