Forum: PC-Programmierung C++ Programm zum Aufsummieren


von Heyho (Gast)


Lesenswert?

Hi, habe versucht ein C++ Programm zu schreiben, das mir natürliche 
Zahlen bis zu einer bestimmten natürlichen Zahl aufsummiert:

Also z.B. bei n=5: 1+2+3+4+5=15

Nur scheint das bei mir nicht zu funktionieren:
1
#include <iostream>
2
using namespace std;
3
4
int n;
5
int x = 1;
6
int i = 0;
7
8
int main()
9
{
10
  cout << "Bis zu welcher Zahl soll aufaddiert werden?" << endl;
11
  cin >> n ;
12
13
  while( x <= n)
14
    i = i + x;
15
    x = x + 1;
16
17
  cout << i  << endl;
18
19
}
Bei diesem Programm wird zwar der Wert n abgefragt, ein Ergebnis 
erscheint aber nicht.
Kann mir jemand den/die Fehler sagen?

LG

: Bearbeitet durch User
von physiker (Gast)


Lesenswert?

Setz mal Klammern um Deinen while Block.

von Bauteiltöter (Gast)


Lesenswert?

Fehler1: Keine Code-Tags verwendet
Fehler2: Keine Klammern gesetzt.

Hättest du Fehler 2 nicht gemacht, dann hättest du gemerkt, dass du 
eigentlich
1
#include <iostream>
2
using namespace std;
3
4
int n;
5
int x = 1;
6
int i = 0;
7
8
int main()
9
{
10
  cout << "Bis zu welcher Zahl soll aufaddiert werden?" << endl;
11
  cin >> n ;
12
13
  while( x <= n)
14
  {
15
    i = i + x;
16
  }
17
  x = x + 1;
18
19
  cout << i  << endl;
20
21
}
geschrieben hast.

Das x=x+1; ist außerhalb der While-Schleife und wird somit niemals 
ausgeführt.

lg

von Max H. (hartl192)


Lesenswert?

>   while( x <= n)
>     i = i + x;
>     x = x + 1;
Die while wiederholt nur den ersten Befehl wenn du den Block nicht in 
Klammer setzt. Die Einrückungen interessieren dem Compiler überhaupt 
nicht.

: Bearbeitet durch User
von Heyho (Gast)


Lesenswert?

Super, jetzt scheint's zu funktionieren. Auf die Klammer wär ich jetzt 
gar nicht gekommen
Dankeschön :-)

von Udo S. (urschmitt)


Lesenswert?

Heyho schrieb:
> Auf die Klammer wär ich jetzt
> gar nicht gekommen

Dann brauchst du dringend ein Grundlagenbuch und solltest es auch lesen.
C++ mit Trial and Error lernen wird nix.

von Rolf Magnus (Gast)


Lesenswert?

Udo Schmitt schrieb:
> C++ mit Trial and Error lernen wird nix.

Das kann ich bestätigen, und zwar aus eigener persönlicher Erfahrung.

von alesi (Gast)


Lesenswert?

Heyho schrieb:
> Auf die Klammer wär ich jetzt
> gar nicht gekommen

Kann es sein, dass Du vorher (nur) Python programmiert hast?

von na ja (Gast)


Lesenswert?

Udo Schmitt (urschmitt) schrieb:

Heyho schrieb:
>> Auf die Klammer wär ich jetzt
>> gar nicht gekommen

> Dann brauchst du dringend ein Grundlagenbuch und solltest es auch lesen.
> C++ mit Trial and Error lernen wird nix.

Kann man so nicht sagen. Trial and Error macht JEDER beim Programmieren 
immer wieder, einfach indem man schaut, ob das rauskommt was man 
erwartet. Wenn man hier die Threads mitliest wird das in so ziemlich 
allen Fällen wenn was nicht läuft auch bestätigt. Nur wie hier die 
Klammern mal eben wegzulassen ist schon kein "Trial and Error" mehr, 
sondern Missachtung der elementarsten Grundregeln bereits bei C und 
nicht erst bei C++.

von Daniel F. (df311)


Lesenswert?

war das euler oder gauß die auf die nette formel
gekommen sind?
das wäre sicher kürzer zu implementieren - wenn auch nicht so wie es 
(wahrscheinlich) erwartet war ;-)

ohne schleife:
1
i = ((n * ++n) >> 1);

von Yalu X. (yalu) (Moderator)


Lesenswert?

Daniel F. schrieb:
> ohne schleife:
> i = ((n * ++n) >> 1);

-> undefined Behavior!

Wenn schon, dann so:
1
i = (n * (n + 1)) >> 1;

von Programmierer (Gast)


Lesenswert?

na ja schrieb:
> Kann man so nicht sagen. Trial and Error macht JEDER beim Programmieren
> immer wieder, einfach indem man schaut, ob das rauskommt was man
> erwartet.

Yalu X. schrieb:
> -> undefined Behavior!
Macht nichts, Trial & Error zeigt dass es funktioniert.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Programmierer schrieb:
> Macht nichts, Trial & Error zeigt dass es funktioniert.

Na, dann trialen wir mal:
1
$ cat >trial.cpp
2
#include <iostream>
3
using namespace std;
4
5
int main() {
6
  int n, i;
7
8
  cout << "Größter Summand:   ";
9
  cin >> n;
10
  cout << "Summe von 1 bis " << n << ": ";
11
  i = ((n * ++n) >> 1);
12
  cout << i << endl;
13
  return 0;
14
}
15
16
$ g++ -Wall -O2 -o trial trial.cpp
17
trial.cpp: In function ‘int main()’:
18
trial.cpp:10:23: warning: operation on ‘n’ may be undefined [-Wsequence-point]
19
   i = ((n * ++n) >> 1);
20
                       ^
21
$ # Häh??? Blöder Labersack -> ignorieren und weiter
22
$ trial
23
Größter Summand:   5
24
Summe von 1 bis 5: 18
25
$ # Huch??? Naja, nur ein kleiner Rundungsfehler -> Programm kann verkauft werden

;-)

von P. M. (o-o)


Lesenswert?

Bauteiltöter schrieb:
> Fehler1: Keine Code-Tags verwendet

Was bitteschön sind "Code-Tags"?

von Max H. (hartl192)


Lesenswert?

P. M. schrieb:
> Bauteiltöter schrieb:
>> Fehler1: Keine Code-Tags verwendet
>
> Was bitteschön sind "Code-Tags"?
1
[c]C-Code[/c]

von P. M. (o-o)


Lesenswert?

Max H. schrieb:
> P. M. schrieb:
>> Bauteiltöter schrieb:
>>> Fehler1: Keine Code-Tags verwendet
>>
>> Was bitteschön sind "Code-Tags"?
1
C-Code

Achso...wurde mittlerweile korrigiert, konnte ich also nicht mehr 
nachvollziehen. Habe schon befürchtet, da habe sich wieder jemand einen 
speziellen Begriff ausgedacht, um seine Kompetenz hochzuskillen ;-)

von Mo_Mo (Gast)


Lesenswert?

Weißt jd von euch was ich hier falsch geschrieben habe?

von Mo_Mo (Gast)


Angehängte Dateien:

Lesenswert?

Mo_Mo schrieb:
> Weißt jd von euch was ich hier falsch geschrieben habe?

von Experte (Gast)


Lesenswert?

Mo_Mo schrieb:
> Weißt jd von euch was ich hier falsch geschrieben habe?

Ja.

 - "Fuegen" schreibt man mit 'ü', also: "Fügen".
 - Das gleiche mit "Loesung", richtig ist: "Lösung".


Viel Erfolg!

von rbx (Gast)


Lesenswert?

Fehlt irgendwie noch:
("kleiner Gauß")
https://de.wikipedia.org/wiki/Gaußsche_Summenformel

Man kann sich die Formel (plus Rundungsausgleich!) selbst herleiten:

8:
1+2+3+4+
8+7+6+5

7:
1+2+3+
7+6+5+4

Bzw. wenn man auf die Generalisierung nicht gleich kommt, erstmal zwei 
Formeln benutzen, eine für gerade Zahlen, eine für ungerade.

von Dirk B. (dirkb2)


Lesenswert?

Mo_Mo schrieb:
> Weißt jd von euch was ich hier falsch geschrieben habe?

Ja, der Compiler.
Der sagt es mit Zeilennummer und Spalte.

Text (Stringliterale) schreibt man in C++ zwischen "

von Eric B. (beric)


Lesenswert?

Mo_Mo schrieb:
> Mo_Mo schrieb:
>> Weißt jd von euch was ich hier falsch geschrieben habe?

Nach main() kommt kein : -- C++ ist kein Python.
Lies verdammt noch mal endlich ein C(++) Buch!

von Rolf M. (rmagnus)


Lesenswert?

Und nächstes mal bitte nicht einen 5 Jahre alten Thread kapern, sondern 
einen neuen starten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.