mikrocontroller.net

Forum: PC-Programmierung C++ Programm zum Aufsummieren


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Heyho (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <iostream>
using namespace std;

int n;
int x = 1;
int i = 0;

int main()
{
  cout << "Bis zu welcher Zahl soll aufaddiert werden?" << endl;
  cin >> n ;

  while( x <= n)
    i = i + x;
    x = x + 1;

  cout << i  << endl;

}
Bei diesem Programm wird zwar der Wert n abgefragt, ein Ergebnis 
erscheint aber nicht.
Kann mir jemand den/die Fehler sagen?

LG

: Bearbeitet durch Moderator
Autor: physiker (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Setz mal Klammern um Deinen while Block.

Autor: Bauteiltöter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <iostream>
using namespace std;

int n;
int x = 1;
int i = 0;

int main()
{
  cout << "Bis zu welcher Zahl soll aufaddiert werden?" << endl;
  cin >> n ;

  while( x <= n)
  {
    i = i + x;
  }
  x = x + 1;

  cout << i  << endl;

}
geschrieben hast.

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

lg

Autor: Max H. (hartl192)
Datum:

Bewertung
1 lesenswert
nicht 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
Autor: Heyho (Gast)
Datum:

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

Autor: Udo S. (urschmitt)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Udo Schmitt schrieb:
> C++ mit Trial and Error lernen wird nix.

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

Autor: alesi (Gast)
Datum:

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

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

Autor: na ja (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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++.

Autor: Daniel F. (df311)
Datum:

Bewertung
3 lesenswert
nicht 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:
i = ((n * ++n) >> 1);

Autor: Yalu X. (yalu) (Moderator)
Datum:

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

-> undefined Behavior!

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

Autor: Programmierer (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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.

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Programmierer schrieb:
> Macht nichts, Trial & Error zeigt dass es funktioniert.

Na, dann trialen wir mal:
$ cat >trial.cpp
#include <iostream>
using namespace std;

int main() {
  int n, i;

  cout << "Größter Summand:   ";
  cin >> n;
  cout << "Summe von 1 bis " << n << ": ";
  i = ((n * ++n) >> 1);
  cout << i << endl;
  return 0;
}

$ g++ -Wall -O2 -o trial trial.cpp
trial.cpp: In function ‘int main()’:
trial.cpp:10:23: warning: operation on ‘n’ may be undefined [-Wsequence-point]
   i = ((n * ++n) >> 1);
                       ^
$ # Häh??? Blöder Labersack -> ignorieren und weiter
$ trial
Größter Summand:   5
Summe von 1 bis 5: 18
$ # Huch??? Naja, nur ein kleiner Rundungsfehler -> Programm kann verkauft werden

;-)

Autor: P. M. (o-o)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Bauteiltöter schrieb:
> Fehler1: Keine Code-Tags verwendet

Was bitteschön sind "Code-Tags"?

Autor: Max H. (hartl192)
Datum:

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

Autor: P. M. (o-o)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Max H. schrieb:
> P. M. schrieb:
>> Bauteiltöter schrieb:
>>> Fehler1: Keine Code-Tags verwendet
>>
>> Was bitteschön sind "Code-Tags"?
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 ;-)

Autor: Mo_Mo (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Weißt jd von euch was ich hier falsch geschrieben habe?

Autor: Mo_Mo (Gast)
Datum:
Angehängte Dateien:

Bewertung
-4 lesenswert
nicht lesenswert
Mo_Mo schrieb:
> Weißt jd von euch was ich hier falsch geschrieben habe?

Autor: Experte (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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!

Autor: rbx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dirk B. (dirkb2)
Datum:

Bewertung
0 lesenswert
nicht 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 "

Autor: Eric B. (beric)
Datum:

Bewertung
1 lesenswert
nicht 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!

Autor: Rolf M. (rmagnus)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.