程序设计与计算思维 - 多维数组


多维数组声明

// 含有 2 个【含有 3 个 int 元素的数组】元素的数组
int a[2][3] = {{1, 2, 3},
               {4, 5, 6}}; // 可视作 2 × 3 矩阵,布局以行为主
int b[2][3][4] = {{{1, 2, 3},{4, 5, 6},{7, 8, 9}}
                 ,{{10, 11, 12},{13, 14, 15},{16, 17, 18}}};

操作多维数组的时候通常用多重 for 循环

for (int i = 0;i < 2;i++)
	for (int j = 0;j < 3;j++)
		cout << a[i][j] << (j < 2 ? ' ' : '\n');


交换循环顺序,相当于输出原来矩阵的转置

for (int j = 0;j < 3;j++)
	for (int i = 0;i < 2;i++)
		cout << a[i][j] << (i < 1 ? ' ' : '\n');


越界问题

cout << a[0][3]; // 输出 4

越界有时不会运行时错误,但是会返回其他位置的值
简单应用:计算行列式

#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
const int MAXN = 100 + 10;
int det(int n,double a[][MAXN]) {
	int sgn = 1;
	for (int i = 1;i <= n;i++) {
		int k = -1;
		for (int j = i;j <= n;j++)
			if (fabs(a[j][i]) > 0) {
				k = j; // 找到一行不为 0 的用来消元
				break;
			}
		if (k == -1) return 0;
		if (k != i) {
			sgn *= -1; // 因为交换第 k 行和第 i 行,行列式变号
			swap(a[k],a[i]);
		}
		for (int j = i+1;j <= n;j++) {
			double tmp = a[j][i]/a[i][i];
			for (int t = i;t <= n;t++)
				a[j][t] -= a[i][t]*tmp; // Rj - Ri * Aji/Aii
		}
		cout << "-----------------------\n"; // 输出每次消元后的矩阵
		for (int j = 1;j <= n;j++,cout << endl)
			for (int t = 1;t <= n;t++) cout << setw(5) << a[j][t] << ' ';
	}
	double result = 1;
	for (int i = 1;i <= n;i++)
		result *= a[i][i];
	return int(result)*sgn;
}
int main() {
	double a[MAXN][MAXN];
	int n;
	cin >> n;
	for (int i = 1;i <= n;i++)
		for (int j = 1;j <= n;j++)
			cin >> a[i][j];
	printf("%d",det(n,a));
	return 0;
}


posted @ 2024-10-20 18:42  lrj124  阅读(11)  评论(0编辑  收藏  举报