2016-10-25 4 views
1

Ich schreibe einen C++ - Code, der die Gauß-Seidel-Methode verwendet, um ein System von Gleichungen zu lösen (aber Sie sollten nicht wissen, was das ist, um meine Frage zu beantworten). Dies beinhaltet im Wesentlichen, dass der Benutzer eine Reihe von Werten in ein 2D-Array eingibt. Mein Problem tritt auf, wenn der Wert etwas wie sin (45) ist, oder eher irgendetwas, das keine Zahl wie 3,14, 2,120947 oder 3 usw. ist. Hier ist ein Ausschnitt der Hauptschleife des Codes.C++ Laufzeitfehler nach Benutzereingabe in Array

/* code to solve an nxn system using the Gauss-Seidel method */ 

int i, j, n; 
int violation_counter, answer; 
int violation_rows[MAX_DIM]; 
double sum; 
double a[MAX_DIM][MAX_DIM]; 
double b[MAX_DIM],x[MAX_DIM]; 
/* read in data */ 
n = MAX_DIM + 1; 
while (n > MAX_DIM) 
{ 
    cout << "Enter the dimension of the system to be solved: " << endl; 
    cin >> n; 
} 

/*THIS BLOCK IS WHAT WE'RE CONCERNED WITH*/ 
cout << endl; 
for (i = 0; i < n; i++) 
{ 
    for (j = 0; j < n; j++) 
    { 
     printf("Enter a[%d][%d] of the system matrix: ", i, j); 
     cin >> a[i][j]; 
    } 
    printf("Enter b[%d] of the right-hand-side vector: ", i); 
    cin >> b[i]; 
    cout << endl; 
} 

/*THE REST OF THE CODE IS FINE I THINK*/ 

/* test the convergence criterion */ 
violation_counter = 0; 
for (i = 0; i < n; i++) { 
    sum = 0.0; 
    for (j = 0; j < n; j++) 
     if (i != j) 
      sum = sum + abs(a[i][j]); 
    if (abs(a[i][i]) < sum) { 
     violation_rows[violation_counter]= i; 
     violation_counter = violation_counter + 1; 
    } 
    if (a[i][i] == 0.0) { 
     cout << "Found diagonal element equal to zero; rearrange equations; exiting." << endl; 
     exit (-1); 
    } 
} 
if (violation_counter > 0) { 
    printf ("The Gauss-Seidel convergence criterion is violated in %d rows out of %d\n", violation_counter, n); 
    printf ("Specifically, it was violated in rows:\n"); 
    for (i = 0; i < violation_counter; i++) { 
     printf("%d ",violation_rows[i]); 
     printf("\n"); 
    } 
    printf("Enter 1 if you want to continue; any other number to abort: "); 
    cin >> answer; 
    if (answer != 1) 
     exit(-1); 
    printf ("Check results carefully\n\n"); 
} 
/* initialize the solution vector -- initial guesses */ 

for (i = 0; i < n; i++) { 
    printf ("Enter an initial guess x[%d] of the solution vector: ", i); 
    cin >> x[i]; 
} 

/* solve the system */ 
gauss_seidel (a, b, x, n); 

/* output solution */ 
for (i = 0; i < n; i++) { 
    printf ("x[%d]=%f\n", i, x[i]); 
} 
printf("\n"); 
return 0; 

hervorgehoben ich die Rolle, die ich denke wir innerhalb des Codes betroffen sind. Hier ist ein Beispiel für die Ausgabe von dem, was passiert, wenn jemand etwas mit einer trigonometrischen Funktion als Eingang betritt:

Enter the dimension of the system to be solved: 5 

Enter a[0][0] of the system matrix: 2  
Enter a[0][1] of the system matrix: sin(3.14/4) 
Enter a[0][2] of the system matrix: 
Enter a[0][3] of the system matrix: 
Enter a[0][4] of the system matrix: 

Enter b[0] of the right-hand-side vector: 
Enter a[1][0] of the system matrix: 
Enter a[1][1] of the system matrix: 
Enter a[1][2] of the system matrix: 
Enter a[1][3] of the system matrix: 
Enter a[1][4] of the system matrix: 

Enter b[1] of the right-hand-side vector: 
Enter a[2][0] of the system matrix: 
Enter a[2][1] of the system matrix: 
Enter a[2][2] of the system matrix: 
Enter a[2][3] of the system matrix: 
Enter a[2][4] of the system matrix: 

Enter b[2] of the right-hand-side vector: 
Enter a[3][0] of the system matrix: 
Enter a[3][1] of the system matrix: 
Enter a[3][2] of the system matrix: 
Enter a[3][3] of the system matrix: 
Enter a[3][4] of the system matrix: 

Enter b[3] of the right-hand-side vector: 
Enter a[4][0] of the system matrix: 
Enter a[4][1] of the system matrix: 
Enter a[4][2] of the system matrix: 
Enter a[4][3] of the system matrix: 
Enter a[4][4] of the system matrix: 

Enter b[4] of the right-hand-side vector: 

Found diagonal element equal to zero; rearrange equations; exiting. Program ended with exit code: 
255 

Wie Sie sehen können, das Programm vollständig kippt, nachdem der Benutzer die Funktion sin tritt für ein [0] [1 ]. Das ist wahrscheinlich ein Anfängerfehler, der leicht zu beheben ist (ich bin in einer Intro-Klasse, also habe Erbarmen), aber ich habe Schwierigkeiten zu verstehen, warum genau der Code "ausflippt", wie er es tut und warum er nicht danach fragt weitere Eingabe vom Benutzer und stattdessen initialisiert den Rest des Gitters zu Null (ich weiß für eine Tatsache, dass der Rest des Codes auf Null initialisiert wird, weil meine Konvergenzkriterium Funktion auslöst, Beenden des Programms am Ende).

Kann mir das jemand erklären?

Noch wichtiger, gibt es eine Möglichkeit, wie ich meinen Code ändern kann, um dem Benutzer zu erlauben, einen Wert wie sin (45) oder sin (pi/4) einzugeben?

+0

Sie benötigen grundsätzlich einen Parser, um Eingaben als String (kein Doppel) zu nehmen und die Formel auszuwerten, wenn der Benutzer einen eingegeben hat. C++ wird dies standardmäßig nicht für Sie tun. –

+0

Lesen Sie die Eingabe als Zeichenfolge, bevor Sie sie analysieren; wenn das nicht klar war. –

+0

Könnten Sie den Wert von "i" anzeigen, wenn "if (a [i] [i] == 0.0)' kurz vor dem Beenden? " Weil nur eine Zelle 'a [0] [0]' gesetzt wurde. –

Antwort

1

Sie könnten es in jedem Wert als String lesen lassen, und dann können Sie damit alles machen, was Sie analysieren/evaluieren möchten. Gerade jetzt, Sie bitten um ein Doppel zu lesen, aber nicht eingeben.

+0

Rechts. Leider hat das Programm keine Idee, wie man "sin (45)" interpretieren kann, es sei denn, Sie sagen es wie, was bedeutet, den Code für die Berechnung zu schreiben. – eddiem

+0

Das machen Programmierer. –