Lösungen für die Variablen ausgeben
In diesem Schritt vervollständigen Sie die Implementierung der Cramer'schen Regel, indem Sie die Lösungen für die Variablen in einem System linearer Gleichungen berechnen und ausgeben.
Öffnen Sie die vorhandene Quelldatei:
cd ~/project
nano cramer_solver.c
Aktualisieren Sie den Code mit der Berechnung der Lösungen nach der Cramer'schen Regel:
#include <stdio.h>
#define MAX_SIZE 3
// Die vorherige Funktion computeDeterminant bleibt unverändert
float computeDeterminant(float matrix[MAX_SIZE][MAX_SIZE], int n) {
if (n == 1) {
return matrix[0][0];
}
if (n == 2) {
return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
}
float det = 0;
float submatrix[MAX_SIZE][MAX_SIZE];
int sign = 1;
for (int x = 0; x < n; x++) {
int subi = 0;
for (int i = 1; i < n; i++) {
int subj = 0;
for (int j = 0; j < n; j++) {
if (j == x) continue;
submatrix[subi][subj] = matrix[i][j];
subj++;
}
subi++;
}
det += sign * matrix[0][x] * computeDeterminant(submatrix, n - 1);
sign = -sign;
}
return det;
}
// Funktion zur Lösung linearer Gleichungen mit der Cramer'schen Regel
void solveUsingCramersRule(float matrix[MAX_SIZE][MAX_SIZE], float constants[MAX_SIZE], int n) {
float mainDeterminant = computeDeterminant(matrix, n);
// Prüfen, ob das System eine eindeutige Lösung hat
if (mainDeterminant == 0) {
printf("Das System hat keine eindeutige Lösung (Determinante ist Null).\n");
return;
}
// Temporäre Matrizen für jede Variable erstellen
float tempMatrix[MAX_SIZE][MAX_SIZE];
float solutions[MAX_SIZE];
// Lösungen für jede Variable berechnen
for (int i = 0; i < n; i++) {
// Ursprüngliche Matrix kopieren
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
tempMatrix[j][k] = matrix[j][k];
}
}
// i-te Spalte mit Konstanten ersetzen
for (int j = 0; j < n; j++) {
tempMatrix[j][i] = constants[j];
}
// Determinante für diese Variable berechnen
solutions[i] = computeDeterminant(tempMatrix, n) / mainDeterminant;
}
// Lösungen ausgeben
printf("\nLösungen:\n");
for (int i = 0; i < n; i++) {
printf("x%d = %.2f\n", i+1, solutions[i]);
}
}
int main() {
float matrix[MAX_SIZE][MAX_SIZE];
float constants[MAX_SIZE];
int n;
// Eingabecode bleibt unverändert
printf("Geben Sie die Anzahl der Gleichungen (max. 3) ein: ");
scanf("%d", &n);
// Eingabe der Koeffizienten
printf("Geben Sie die Koeffizienten der Matrix ein:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("Geben Sie den Koeffizienten a[%d][%d] ein: ", i+1, j+1);
scanf("%f", &matrix[i][j]);
}
}
// Eingabe der Konstanten
printf("Geben Sie die Konstanten ein:\n");
for (int i = 0; i < n; i++) {
printf("Geben Sie die Konstante b[%d] ein: ", i+1);
scanf("%f", &constants[i]);
}
// Mit der Cramer'schen Regel lösen
solveUsingCramersRule(matrix, constants, n);
return 0;
}
Kompilieren Sie das aktualisierte Programm:
gcc -o cramer_solver cramer_solver.c
Führen Sie das Programm aus:
./cramer_solver
Beispielausgabe:
Geben Sie die Anzahl der Gleichungen (max. 3) ein: 2
Geben Sie die Koeffizienten der Matrix ein:
Geben Sie den Koeffizienten a[1][1] ein: 2
Geben Sie den Koeffizienten a[1][2] ein: 1
Geben Sie den Koeffizienten a[2][1] ein: -3
Geben Sie den Koeffizienten a[2][2] ein: 4
Geben Sie die Konstanten ein:
Geben Sie die Konstante b[1] ein: 4
Geben Sie die Konstante b[2] ein: 5
Lösungen:
x1 = 2.00
x2 = 1.00
Wichtige Punkte zur Berechnung der Lösungen:
- Die Funktion
solveUsingCramersRule()
implementiert die Cramer'sche Regel.
- Sie prüft, ob das System eine eindeutige Lösung hat, indem sie die Hauptdeterminante überprüft.
- Für jede Variable erstellt sie eine temporäre Matrix und berechnet deren Determinante.
- Die Lösungen werden berechnet, indem die Determinante jeder Variable durch die Hauptdeterminante dividiert wird.
Das Programm löst nun vollständig ein System linearer Gleichungen mit der Cramer'schen Regel.