2016-12-07 4 views
-1

so mein Programm soll wie folgt funktionieren:Programm funktioniert nicht richtig

  1. Eingangs ganzen Zahlen n und m (zum Beispiel n = 1, m = 10)
  2. Eingang alle Werte von n zu m (zum Beispiel 1; 2; 3; 4; 5; 6; 7; 8; 9; 10) in ein dynamisches Array
  3. Dann mit Bool-Funktion müssen Sie das dynamische Array für 2 Zahlen, die quadriert sind und suchen summiert zusammen und machen eine Art von 3. Nummer (zum Beispiel 1 * 1 + 1 * 1 = 2; 2 * 2 + 2 * 2 = 8 usw. etc)

Das Programm druckt aus irgendeinem Grund entweder nur die erste Kombination aus oder druckt überhaupt nichts aus (zum Beispiel, wenn n = 1 und m = 10, es nur 1 * 1 + 1 * 1 = 2 ausdruckt, aber es sollte Vordruck 2 * 2 + 1 * 1 = 5; 2 * 2 + 2 * 2 = 8 etc etc, wenn n = 4 und m = 200 es wird nicht einmal etwas überdrucken). Wo könnte das Problem sein? Ich bin seit Stunden festgefahren und in meinem Kopf sollte das Programm funktionieren, tut es aber nicht. Danke vielmals.

#include <iostream> 

using namespace std; 

bool isSquared (int i){ 
    // bool result = false; 

    //int div; 
    //int *squares = new int [i]; 

    for (int j=1;j<=i;j++){ 
     for (int k=1;k<=i;k++){ 
      if (k*k + j*j == i) return true; 
      else return false; 
     } 
    } 
} 


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

    cin >>n; 
    cin >>m; 

    size = m - n; 
    int *real = new int [m - n]; 

    for (int q=0, j=n; q<size, j<=m; q++, j++){ 
     real[q] = j; 
    } 

    for (int q=0; q<=size; q++){ 
     cout <<real[q] <<" | "; 
    } 

    cout <<endl; 

    for (int i=n; i<=m; i++){ 
     if (isSquared(i) == true){ 
      for (int j=0; j<=size; j++){ 
       for (int k=0; k<=size; k++){ 
        if (real[j]*real[j] + real[k]*real[k] == i){ 
         cout <<i <<"=" <<real[j] <<"*" <<real[j] <<"+" <<real[k] <<"*" <<real[k] <<endl; 
        } 
       } 

      } 


     } 
    } 

    return 0; 
} 
+1

Das richtige Werkzeug zu lösen, so Probleme ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage bearbeiten, um ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel einzufügen, das Ihr Problem zusammen mit den Beobachtungen, die Sie in der Debugger. –

+0

Hinweis: 'für (int k = 1; k <= i; k ++) {' Warum brauchen Sie diese Schleife, wenn Sie beim ersten Vergleich trotzdem zurückkehren? – drescherjm

+0

@drescherjm das ist die Sache, wie kann ich die Funktion stoppen, wenn es den ersten Vergleich erhält. – jcoe

Antwort

3

Sie müssen mehr Zeit damit verbringen, die Logik Ihrer Aufgabe aufzubrechen. Die Art und Weise, wie Sie es formuliert haben, ist verwirrend, und ich denke, es trägt dazu bei, wie Sie Ihren Code geschrieben haben.

  1. Eingang ganzer Zahlen n und m (zum Beispiel n = 1; m = 10)
  2. Eingang all Werte von n bis m (zum Beispiel 1; 2; 3; 4; 5; 6; 7, 8, 9, 10) in ein dynamisches Array
  3. Dann mit Bool-Funktion müssen Sie das dynamische Array für 2 Zahlen, die quadriert und summiert zusammen sind und eine Art von 3. Nummer (zum Beispiel 1 * 1 + 1 * 1 = 2; 2 * 2 + 2 * 2 = 8 etc etc)

I keine (logischen) p siehe Problem mit, wie Sie Teil 1 geschrieben haben, aber aus Gründen der Klarheit werde ich sie in start und end umbenennen.

Teil 2 ist, wo wir beginnen, Probleme zu treffen. Für den Anfang haben Sie Ihr Programm unnötig kompliziert gemacht, indem Sie die manuelle Verwaltung des dynamischen Speichers einbezogen haben. Ein std::vector ist perfekt geeignet für unsere Aufgabe (für mehr als einen Grund, wie Sie bald sehen ...)

std::vector<int> data; 

Wir werden unsere Werte in data laden. Auf der Grundlage Ihrer Aufforderung, die Eingänge für start und end ein inklusives Bereich sind, so dass wir es schreiben, wie so:

for(int i = start; i <= end; i++) { 
    data.emplace_back(i); 
} 

In Ihrer Version des Codes, ist dies nur verwirrend:

for (int q=0, j=n; q<size, j<=m; q++, j++){ 
    real[q] = j; 
} 

Sie haben size als m - n definiert, was 9 ist, aber die Eingabeaufforderung möchte alle Zahlen zwischen 1 und 10 haben, was bedeutet, dass es 10 Zahlen geben sollte; Sie werden also Fehler haben. Der Code, den ich vorgeschlagen habe, wird zuverlässiger funktionieren.

Betrachten wir abschließend Schritt 3.Es kann (und sollte) in mehrere Schritte unterteilt werden:

  • Für jede Zahl in data (z),
    • Iterierte durch jedes Paar von Zahlen, die ihr vorausging (die auf der Basis von Beispielen, (kann Duplikate enthalten), und für jedes Paar (x und y)
    • bestimmen, ob x*x + y*y == z, und wenn ja, diese Variablen an den Benutzer zu drucken.

Also lassen Sie uns diesen Code schreiben.

//Note we're using data.size(), to ensure we stay in valid memory 
for(int i = 0; i < data.size(); i++) { 
    int z = data[i]; 
    //You can change the checks for j and k to "j <= i" and "k <= i" respectively 
    //if you want solutions where z*z + z*z = z, which can happen if z == 0. 
    for(int j = 0; j < i; j++) { 
     //We don't need to repeat identical pairs, so we're starting k at j. 
     for(int k = j; k < i; k++) { 
      int x = data[j]; 
      int y = data[k]; 
      if(x*x + y*y == z) { 
       std::cout 
       << x << "*" << x 
       << " + " 
       << y << "*" << y 
       << " = " 
       << z 
       << std::endl; 
      } 
     } 
    } 
} 

Für einen Eingang 1 10, erhalte ich die folgende Ausgabe:

1*1 + 1*1 = 2 
1*1 + 2*2 = 5 
2*2 + 2*2 = 8 
1*1 + 3*3 = 10 

Und für eine Eingabe von 4 200 ich folgende Ausgabe:

4*4 + 4*4 = 32 
4*4 + 5*5 = 41 
5*5 + 5*5 = 50 
4*4 + 6*6 = 52 
5*5 + 6*6 = 61 
4*4 + 7*7 = 65 
6*6 + 6*6 = 72 
5*5 + 7*7 = 74 
4*4 + 8*8 = 80 
6*6 + 7*7 = 85 
5*5 + 8*8 = 89 
4*4 + 9*9 = 97 
7*7 + 7*7 = 98 
6*6 + 8*8 = 100 
5*5 + 9*9 = 106 
7*7 + 8*8 = 113 
4*4 + 10*10 = 116 
6*6 + 9*9 = 117 
5*5 + 10*10 = 125 
8*8 + 8*8 = 128 
7*7 + 9*9 = 130 
6*6 + 10*10 = 136 
4*4 + 11*11 = 137 
8*8 + 9*9 = 145 
5*5 + 11*11 = 146 
7*7 + 10*10 = 149 
6*6 + 11*11 = 157 
4*4 + 12*12 = 160 
9*9 + 9*9 = 162 
8*8 + 10*10 = 164 
5*5 + 12*12 = 169 
7*7 + 11*11 = 170 
6*6 + 12*12 = 180 
9*9 + 10*10 = 181 
4*4 + 13*13 = 185 
8*8 + 11*11 = 185 
7*7 + 12*12 = 193 
5*5 + 13*13 = 194 
10*10 + 10*10 = 200 
+0

@jcoe Wenn dies alle Ihre Probleme löst, markieren Sie es bitte als gelöst. – Angelo