编写一个通用程序,求出二维数组的非对角线元素之和,即求两条对角线之外的元素之和。
#pragma once
#include<iostream>
using namespace std;
class MATRIX
{
public:
MATRIX();
MATRIX(int x[][40], int k);
void process();
void show();
~MATRIX();
private:
int m;
int sum;
int a[40][40];
};
#include "MATRIX.h"
MATRIX::MATRIX()
{
}
MATRIX::MATRIX(int x[][40], int k)
{
m = k;
for (int i = 0; i < k; i++)
for (int j = 0; j < k; j++)
{
a[i][j] = x[i][j];
}
sum = 0;
}
void MATRIX::show()
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < m; j++)
{
cout << a[i][j] << "\t";
}
cout << endl;
}
cout << "sum=" << sum << endl;
}
void MATRIX::process()
{
int i,j;
for (i = 0; i < m; i++)
for (j = 0; j < m; j++)
{
if ((i == j) || ((i + j) == (m - 1)))
{
continue;
}
sum += a[i][j];
}
}
MATRIX::~MATRIX()
{
}
#include"MATRIX.h"
int main()
{
int b[40][40] = { { 1, 1, 1, 1 }, { 1, 2, 2, 1 }, { 1, 2, 2, 1 }, {1,1,1,1} };
MATRIX mtx(b, 4);
mtx.process();
mtx.show();
return 0;
}
将二维数组改为数据结构的程序实现改写为单向链表结构来表示二维数组可定位为数据结构体。代码如下:
#include<iostream>
#include<iomanip>
using namespace std;
struct LinkNode{
int Row;
int Column;
int Data;
LinkNode *Next;
};
LinkNode *createArray(int n);
void getArrayData(int n, LinkNode *head);
int arrayDiagonal(int n, LinkNode *head);
int arraySum(LinkNode *head);
void outputSpinArray(int n, LinkNode *head);
int main()
{
LinkNode *ListHead = NULL;
int n;
cout << "请输入行数和列数:";
cin >> n;
if (n > 1)
{
ListHead = createArray(n);
cout << "输入的二维数组:" << endl;
getArrayData(n, ListHead);
cout << "此数组的对角线之和:" << arrayDiagonal(n, ListHead) << endl;
cout << "非对角线之和:" << arraySum(ListHead) - arrayDiagonal(n, ListHead) << endl;
cout << "数组顺时针旋转后的角度为:" << endl;
outputSpinArray(n, ListHead);
}
return 0;
}
LinkNode *createArray(int n)
{
LinkNode *head = NULL, *tail = NULL, *temp = NULL;
int num;
cin >> num;
head = new LinkNode;
if (head == NULL)
{
cerr << "no memory availble" << endl;
}
else
{
head->Data = num;
head->Row = 1;
head->Column = 1;
head->Next = NULL;
tail = head;
}
//i为列数,j为行数,k用来计算输入的总个数。
for (int i = 2, j = 1, k = 1; k <=n*n - 1; i++, k++)
{
cin >> num;
temp = new LinkNode;
if (temp == NULL)
{
cerr << "No memory availablel" << endl;
return head;
}
else
{
temp->Data = num;
temp->Row = j;
temp->Column = i;
temp->Next = NULL;
tail->Next = temp;
tail = temp;
if ((k + 1) % n == 0)
{
j++;
}
if (i%n == 0)
i = 0;
}
}
return head;
}
void getArrayData(int n, LinkNode *head)
{
LinkNode *put = head;
int i = 0;
while (put)
{
if (put->Row <= n && put->Column <= n)
{
cout << setw(4) << put->Data;
i++;
}
if (i%n == 0)
cout << endl;
put = put->Next;
}
cout << endl;
}
int arrayDiagonal(int n, LinkNode *head)
{
LinkNode *p = head;
int sum = 0;
while (p)
{
if ((p->Row == p->Column) || (p->Row + p->Column == n + 1))
{
sum += p->Data;
}
p = p->Next;
}
return sum;
}
int arraySum(LinkNode *head)
{
LinkNode *p = head;
int sum = 0;
while (p)
{
sum += p->Data;
p = p->Next;
}
return sum;
}
void outputSpinArray(int n, LinkNode *head)
{
LinkNode *p = head;
int i = 1, count = 0, space = 0, m = n;
while (1)
{
while (p)
{
if (p->Row == m && p->Column == i)
{
cout << setw(4) << p->Data;
count++;
space++;
m--;
}
if (space == n)
{
i++;
m = n;
space = 0;
cout << endl;
}
p = p->Next;
}
if (count == n*n)
{
break;
}
p = head;
}
cout << endl;
}