#include<stdlib.h>
using namespace std;
class Symmetric
{
public:
Symmetric()
{
a = new int [capacity];
capacity = 0;
front = area = 0;
}
Symmetric(int n)
{
capacity = n;
front = area = 0;
a = new int [capacity];
}
void push(int a1)
{
front = (front % capacity) + 1;
a[front] = a1;
}
int pop()
{
area = (area % capacity) + 1;
cout << a[area];
}
private:
int *a;
int capacity;
int front, area;
};
typedef struct element
{
int mu, nu;
int data;
};
int s[100] = {0};
void diagonal(int a, int n, int m)
{
switch(n - m)
{
case 0:
s[n * 3] = a;
break;
case 1:
s[n * 3 - 1] = a;
break;
case -1:
s[n * 3 + 1] = a;
break;
default:
if(a != 0)
{
cout << "非對角線上的數值必須爲0" << endl;
exit(1);
}
}
}
int main()
{
int i;
cout << "1是對稱矩陣或三角矩陣" << endl;
cout << "2是稀疏矩陣" << endl;
cout << "3是對角矩陣" << endl;
cout << "4是退出程序" << endl;
while(cin >> i)
{
switch(i)
{
case 1:
{
int n;
cout << "矩陣的行數爲:" << endl;
cin >> n;
int str[n][n];
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
cin >> str[i][j];
}
}
Symmetric p(n * (n + 1) / 2);
int k = 0, t = 0;
for(int i = 0; i < n; i++)
{
for(int j = 0; j <= i; j++)
{
p.push(str[i][j]);
k++;
}
}
for(int i = 0; i < k; i++)
{
p.pop();
cout << " ";
}
break;
}
case 2:
{
int n;
cout << "矩陣的行數爲:" << endl;
cin >> n;
int str[n][n];
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
cin >> str[i][j];
}
}
element h[100];
int k = -1;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(str[i][j] != 0)
{
h[++k].data = str[i][j];
h[k].mu = i;
h[k].nu = j;
}
}
}
for(int i = 0; i <= k; i++)
{
cout << "行數爲:" << h[i].mu + 1 << "列數爲:" << h[i].nu + 1 << "數值爲:" << h[i].data << endl;
}
break;
}
case 3:
{
int n;
cout << "矩陣的行數爲:" << endl;
cin >> n;
int str[n][n];
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
cin >> str[i][j];
}
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
diagonal(str[i][j], i, j);
}
}
for(int i = 0; i < n * 3 - 2; i++)
{
cout << s[i] << " ";
}
break;
}
case 4:
{
exit(1);
}
}
}
return 0;
}