2016-11-28 4 views
0

so habe ich Integer m und n in meinem Programm, sobald Sie die Werte eingeben, sollte es ein Array mit Werten von m bis n erstellen (zum Beispiel m = 1 und n = 10 erstellt er Array q mit Werten von 1 bis 10). Dann sieht es im Array aus, ob es irgendwelche Zahlen gibt, die gleich zwei Zahlen sind, die quadriert sind (zum Beispiel ist in der Matrix die Zahl 5 gleich 1 Quadrat + 2 Quadrat). Das Problem ist, wenn ich versuche, den ersten Wert einzugeben, den es stürzt, ziemlich sicher, dass das Problem in der Funktion ist, aber nicht scheinen kann, es herauszufinden. DankProgramm stürzt ab, wenn ich versuche, Werte einzugeben

#include <iostream> 
using namespace std; 

int squared (int a, int b, int q[]){ 


    while (a<=0 || b<=0){ 
     cout <<"You can't input an integer that is 0 or below: "; 
     cin >>a; 
     cin >>b; 
     if (a>0 || b>0) break; 
    } 


    for (int p=0; p<b; p++){ 
     for (int i=a ; i<b; i++){ 
      q[p] = a; 
     } 
    } 

    for (int z=0; z<b; z++){ 
     for (int x=0; x<b; x++){ 
      for (int c=0; c<b; c++){ 
       if (q[z] == (q[x] * q[x]) + (q[c] * q[c])){ 
        int result= (q[x] * q[x]) + (q[c] * q[c]); 
        return result; 

       } 
      } 
     } 
    } 



} 

int main() { 
    int m,n; 
    int M[100]; 
    cout <<"Input integers m un n: "; 
    cin >>m,n; 
    cout <<squared(m,n,M); 

return 0; 
} 
+1

'cin >> m, n,' nicht tut, was Sie denken, es tut. – NathanOliver

+1

Haben Sie versucht, im Debugger durchzulaufen, um herauszufinden, wo der Fehler auftritt? Kannst du auch "Crash" definieren? Was genau läuft schief? Bitte lesen Sie [diesen Artikel] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) zum Debuggen von kleinen Programmen. – EJoshuaS

+0

'cin >> m >> n;' – Raindrop7

Antwort

1

Wahrscheinlich stürzt es aus diesem Grunde: cin >>m,n;, soll es cin >> m >> n; sein, sonst Sie n uninitialized in der nächsten Zeile zu verwenden, also nicht definiertes Verhalten bekommen, z.B. Absturz.

Welche Compiler verwenden Sie und mit welchen Flags, da dies einige Warnungen/Fehler bei der Kompilierung normalerweise auslösen würde.

0

cin >> m, n; ist falsch, die nur m Eingänge, die als interpretiert werden kann:

(cin >> m), n; was bedeutet: cin, n; es zu korrigieren:

cin >> m >> n;

if(a > 0 || b > 0) break; überflüssig ist, weil Sie für diesen Zustand zweimal überprüfen: einmal in while-Bedingung zweite innerhalb der while-Schleife, wodurch die gleiche Bedingung überprüft wird, ist redundant, weil sie automatisch bricht, wenn die Bedingung erfolgreich ist (a oder b ist gleich oder kleiner als 0).

ein Array geführt, ohne seine Größe vorbei, hat man Glück, wenn man das erste Element 1 der jeder zweite Wert gleich der Größe des Arrays zB gesetzt:

m = 1; n = 10; then the size is ten which is correct. 

was ist:

m = 7; n = 10; // now is size 10? it's only 3 

korrigieren sie die Größe zB passieren:

m = 4; n = 8; 
int size = 8 - 4; 
cout << Squared(m, n, M, size); 

auch:

Sie zuweisen den gleichen Wert a zu allen Elementen von Array und Iterieren das gleiche tun in der verschachtelten Schleife !!! es ist wahrscheinlich, schreiben:

int x = 0; x = 0; 

so die Bedingung Ergebnis quadriert wird innen nie gelingen, weil der gleiche Wert nie gleich seinem Platz ist. 4 = 4 * 4 nie

hier erreicht ist, was Sie suchen:

#include <iostream> 
using namespace std; 

// I only make squared search for the result not inputing m and n lik e in yours 
int squared (int m, int n, int* M) 
{ 
    int result; 
    for(int i(0); i < n; i++) 
     for(int j(0); j < n; j++) 
      for(int k(0); k < n; k++) 
       if((M[i] == ((M[j] * M[j]) + (M[k] * M[k]))) && j != k) // here to avoid comparing with the same index 
       { 
        cout << M[i] << " = (" << M[j] << "*" << M[j] << ") + (" << M[k] << "*" << M[k] << ")" << endl; 
        result = ((M[j] * M[j]) + (M[k] * M[k])); 
        cout << result << endl; 
        return result; // if success we return result 
       } 

    return -1; // otherwise we return -1 as a sign of error (no square yields in negative value) 
} 

int main() 
{ 
    int n, m, size; 

    do 
    { 
     cout <<"m: "; 
     cin >> m; 
     cout << "n: "; 
     cin >> n; 

     if(n <= 0 || m <= 0) 
      cout <<"You can't input an integer that is 0 or below: "; 
     // also it's very important to check whether n is greater than m or not because if m == n or m > n then size will be negative and as you know no array has a negative nor 0 size 
     if(m >= n) 
      cout << "n must be greater than m!" << endl; 
    }while (m <= 0 || n <= 0 || m >= n); 

    size = n - m; // getting size of array assuming m can be any value 
    int* M = new int[n - m]; // allocating dynamic array 

    // inputting array as you asked 
    for(int i(0), j = m; i < size; i++, j++) 
     M[i] = j; 

    // checking the values of array elements 
    for(int i = 0; i < size; i++) 
     cout << M[i] << ", " ; 
    cout << endl; 

    // getting the result 
    cout << squared(m, n, M) << endl; 

    // cleaning 
    delete[] M; 

    return 0; 
} 
Verwandte Themen