2016-08-01 28 views
-1

Beide Codes kompilieren, aber nur der zweite tut, was ich will. Erster Code:Was ist der Unterschied zwischen diesen beiden Programmen, die Dreieckszahlen berechnen?

#include <stdio.h> 
#include <cs50.h> 
#include <math.h> 

int main() 

    { 
    int TriNumber = 0; 
    int n; 

     for(n = 5; n <= 50; n += 5) 
     TriNumber = ((n + 1) * n)/2; 

     printf("The trianglular number of %d is %d\n", n, TriNumber); 

    } 

Welche Ausgänge:

Die dreieckige Zahl von 55 1275

Das folgende Programm ist das tut, was ich will es: es druckt die Dreieckszahl für jeden fünfte ganze Zahl zwischen 5 und 50.

#include <stdio.h> 
#include <cs50.h> 
#include <math.h> 

int main() 

{ 
    int TriNumber = 0; 
    int n; 

    for(n = 5; n <= 50; n += 5) 

     printf("The trianglular number of %d is %d\n", n, TriNumber = (((n + 1) * n)/2)); 

} 

W hich gibt meinen gewünschten Ausgang:

Die dreieckige Zahl von 5 15
Die dreieckige Zahl von 10 ist, 55
Die dreieckige Zahl von 15 ist 120
Die dreieckige Zahl von 20 ist 210
Die dreieckige Zahl von 25 325 ist
Die dreieckige Zahl von 30 465
von 35 Die dreieckige Zahl beträgt 630
Die dreieckige Zahl von 40 820 ist
Die dreieckigen nu mber von 45 1035
Die dreieckige Zahl von 50 ist 1275

Ich verstehe nicht, warum eine solche hätte unterschiedliche Ergebnisse in dem ersten Code und innerhalb der printf Funktion in dem zweiten Code TriNumber = ((n + 1) * n)/2; in einer eigenen Zeile setzen .

+3

Das erste Snippet berechnet "TriNumber" zehn Mal und druckt es dann einmal. Das 'printf' ist ** nicht ** in der Schleife. – user3386109

+0

'for' ist der Beginn einer Schleife. Die nächste _Anweisung_ wird so lange wiederholt, wie die Schleifenbedingung erfüllt ist. In Ihrem ersten Beispiel erfolgt der Ausdruck _ nachdem die Schleife beendet ist. Ihr zweites Beispiel, der Druck ist Teil der Schleife. –

+0

Überprüfen Sie Ihre Kursnotizen. Die einzige Anweisung, die direkt nach dieser 'for'loop-Anweisung ausgeführt wird, ist ... – usr2564301

Antwort

6

A for Schleife (oder irgendeine andere Steuerstruktur, was das betrifft) ohne geschweiften Klammern arbeitet nur eine Anweisung auf. Das erste Snippet würde also die TriNumber Berechnung durchlaufen, aber nur printf aufrufen, sobald die Schleife fertig ist. Es ist gleichbedeutend mit Schreiben

for(n = 5; n <= 50; n += 5) { 
    TriNumber = ((n + 1) * n)/2; 
} 
printf("The trianglular number of %d is %d\n", n, TriNumber); 

Um es zu bekommen zu arbeiten, wie Sie erwartet haben, Sie die geschweiften sich klammern könnte hinzufügen, um beide Aussagen:

for(n = 5; n <= 50; n += 5) { 
    TriNumber = ((n + 1) * n)/2; 
    printf("The trianglular number of %d is %d\n", n, TriNumber); 
} 
+1

Vielen Dank! Irgendwie habe ich das bei der Lesung vermisst! – Louis

0

Im ersten Fall, dass Sie nach der letzten Schleife drucken Iteration und als Ergebnis n erhalten zusätzliche Inkrement von 5 und Sie sehen 55. Im zweiten Fall drucken Sie direkt von der letzten Iteration und der Schleifenzähler wird noch nicht extra erhöht und Sie sehen 50.

1

● In Ihrem ersten Fall, die for Schleife berechnet die TriNumber bis die Bedingung erfüllt, und bewegt sich dann auf die nächste Anweisung; ich.e, die printf:

for(n = 5; n <= 50; n += 5) 
    TriNumber = ((n + 1) * n)/2; 

printf("The trianglular number of %d is %d\n", n, TriNumber); 

Dies ist ähnlich (zum besseren Verständnis):

for(n = 5; n <= 50; n += 5) 
{ 
    TriNumber = ((n + 1) * n)/2; 
} 
printf("The triangular number of %d is %d\n", n, TriNumber); 

Deshalb sollten Sie eine einzige Anweisung Ausgabe erhalten besagt:

Die Dreieckszahl von 55 ist 1275

● Während Ihres zweiten Fall in, die for Schleifen berechnet die TriNumber und druckt es jedes Mal so weit wie die Schleifenbedingung erfüllt ist, da hier die printf die nächste Anweisung der for Schleife, die ausgeführt wird ist.

for(n = 5; n <= 50; n += 5) 

    printf("The trianglular number of %d is %d\n", n, TriNumber = (((n + 1) * n)/2)); 

die ohne die Klammern auch an den folgenden Code ähnlich ist {}:

for(n = 5; n <= 50; n += 5) 
{ 
    printf("The trianglular number of %d is %d\n", n, TriNumber = (((n + 1) * n)/2)); 
} 

Dies nicht nur for Schleife gültig ist, aber alle anderen Kontrollstruktur wie while, if, etc., die auf der arbeitet sehr nächste Aussage ohne die {} Klammern wie gesagt von Mureinik.