While-Schleife bei C++

OP #1461139
hey leute,

bei einer eingabe von einer ganzzahl n>0,

in einem programm, das alle zahlen von 0 bis n addiert und die summe 
ausgibt,


hier habe ich schon ma versucht was zu machen aber bei eingabe =n zeigt 
er immer fehler an kann mir jemand sagen warum und helfen,

vielen dank schon im vorraus

mfg



# include <iostream>
#include <string>
#include <conio.h>
using namespace std;
int main ()

{
double  eingabe =n ;

while (ergebnis n <= ++var)
  {
  cout << "Pogramm,das alle Zahlen von 0 bis n addiert und die Summer 
ausgibt" <<endl;
  cout << "Geben sie eine Zahl ein (0 zum Beenden): ";

  cin    >> eingabe;

  cout << "Die Summe " <<ergebnis <<" ist " <<eingabe++var <<endl;


  }
return 0;
}
Gast
n hat einen undefinierten Wert, weil nie initialisiert. Das selbe gilt 
für Eingabe.

Und was soll das?
1
while (ergebnis n <= ++var)

Wo ist var definiert?
Und was soll ergebnis n sein?


Und mach bitte in Deinen Texten ab und an mal ein "." rein. Macht es 
wesentlich lesbarer.
Gast
Kauf dir als erstes nen Buch über Rechtschreibung und Zeichensetzung. 
Wenn du das durch hast, kannst du dir ein Buch über C++ kaufen und 
durcharbeiten. Wenn du das auch erledigt hast, kannst du hier bei 
Problemen nochmal fragen.
Gast
So, jetzt aber Jürgen.

Wenn das ein Spiel sein soll, ich geb euch Wörter, macht Sätze draus, 
ok. Na gut, dann sag das.

Wenn Du willst Das wir Deine Hausaufgaben lösen, dann wird das nichts. 
Schon gar nicht wenn Du zu faul bist einen anständigen Text zu schreiben 
mit Satzzeichen. Gross/Klein wäre toll, muss aber nicht sein.

Setz Dich hin, versuche Dein Problem so auszudrücken, das man es auch 
verstehen kann. Bitte in Deutsch!!!
Gast
Denk einfachmal hierüber nach:
1
#include <iostream>
2

3
using namespace std;
4

5
int main(void){
6
 unsigned int eingabe;
7
 unsigned int summe = 0;
8

9
 cout << "Pogramm,das alle Ganzen Zahlen von 0 bis n addiert und die Summe ausgibt" << endl;
10
 cout << "Geben sie eine Zahl ein (0 zum Beenden): ";
11
 cin >> eingabe;
12
 for (int i=1; i<=eingabe; i++) summe += i;
13
 cout << "Die Summe der Zahlen von 0 bis " << eingabe << " ist " << summe << endl;
14
 return 0;
15
}

dann solltest du es als while-Schleife hinbekommen.
Gast
Hallo komme jetzt nicht so aus der C++ Ecke, aber

Was ist "double eingabe = n ;"

Muss es nicht heissen
1
double eingabe;
n ist zu diesem Zeitpunkt weder definiert noch deklariert;

Gruß Jörg
Gast
> wir habe zwar heute schnelle cpus, aber man doch ein wenig optimieren

Es wird immer unverständlicher.
Dieser Satz muss wohl in einer mir unbekannten Sprache geschrieben sein 
:-)

... und der OP wollte While-Schleifen lernen, nicht die Laufzeit 
optimieren.
Marcus Kunze schrieb:
> @Gast
>> for (int i=1; i<=eingabe; i++) summe += i;
>
> wir habe zwar heute schnelle cpus, aber man doch ein wenig optimieren
>
> summe = (eingabe + 1) * eingabe / 2;

:-)

Prinzipiell ja.
Aber darum gehts bei diesem Übungsbeispiel im Grunde gar nicht. Hier ist 
der Weg das Ziel.

Und wie man sieht, ist der Weg noch weit.
Gast schrieb:
> und immer wenn ich eine /2 lese bekomm ichs Kotzen.
>
> Denk mal drüber nach du Held...

Und warum bekommst du da das Kotzen?
(Ich bekomme immer das Kotzen, wenn Leute ihre Compilerbauer für 
Vollidioten halten, die ihrem Compiler absichtlich nicht beibringen, 
dass unter bestimmten Umständen ein /2 identisch ist zu einmal schieben 
nach rechts).
Gast
Gast schrieb:
> und immer wenn ich eine /2 lese bekomm ichs Kotzen.
>
> Denk mal drüber nach du Held...

Nicht immer, bei Fliesskomma-Operation macht das durchaus mal Sinn. ;-)
@NurEinGast
> ... und der OP wollte While-Schleifen lernen, nicht die Laufzeit
> optimieren.
Seit wann ist die for Schleife ein while Schleife? (die von Gast)


@gast
> und immer wenn ich eine /2 lese bekomm ichs Kotzen.
> Denk mal drüber nach du Held...

Dann Teste erstmal bevor du etwas schreibst.
Gast
Shifts existieren, und das gilt nicht nur für das Geschreibsel des OP.

Und das Aufsummieren ALLER Fließkommazahlen von 0 bis irgendeinem n > 0 
stell ich mir auch spannend vor.
Gast
> Und das Aufsummieren ALLER Fließkommazahlen von 0 bis irgendeinem n > 0
> stell ich mir auch spannend vor.

ok, wenn man nur die darstellbaren Fließkommazahlen nimmt, ist es 
zumindest lösbar ;)
Gast schrieb:
> Shifts existieren, und das gilt nicht nur für das Geschreibsel des OP.

optimierende Compiler existieren ebenfalls.
Das was du da andeutest, ist eine der trivialsten Optimierungen die ein 
Compiler überhaupt nur machen kann.

Wenn /2 am klarsten ist, dann schreibe auch /2. Den Rest macht der 
Compiler.
Gast
Tja, sag das der Optimierungs Voreinstellung. Abgesehen davon sollte man 
wenn man sich schon damit brüstet optimieren zu wollen sowas auch mal 
selber bedenken.
Ich bin ansonsten auch immernoch der Meinung das für hinreichend kleine 
n die Summierung schneller läuft als die Berechnung mit Multiplikation 
und Division, nicht das es dem OP darum gegangen wäre...
Gast
@Marcus Kunze

   >> ... und der OP wollte While-Schleifen lernen, nicht die Laufzeit
   >> optimieren.
   >
   >Seit wann ist die for Schleife ein while Schleife? (die von Gast)


Gast Schrieb :
  >  Denk einfachmal hierüber nach:

  Dann hat er das Problem mit einer FOR Schleife verdeutlicht.
  Dann schrieb er

  > dann solltest du es als while-Schleife hinbekommen.

Er wollte also dem OP das Prinzip verständlich machen, ihm aber nicht 
einfach nur die fertige Lösung hinwerfen.
Gast schrieb:
> Tja, sag das der Optimierungs Voreinstellung.

Würde mich nicht wirklich wundern, wenn die meisten Compiler diese 
Trivialoptimierung selbst dann machen, wenn der Optimizer ausgeschaltet 
ist.

> Abgesehen davon sollte man
> wenn man sich schon damit brüstet optimieren zu wollen sowas auch mal
> selber bedenken.

Nein. Genau solche Dinge sollte man eben NICHT selber bedenken.
Du musst endlich von der Vorstellung weg, dass du irgendjemanden etwas 
Gutes damit tust, wenn du dich um solche Trivialoperationen selber 
kümmerst. Das genaue Gegenteil ist der Fall. Kümmere dich um den 
Algorithmus, kümmere dich um vernünftige Datentypen, kümmere dich darum 
dass dein Code gut lesbar und wartbar ist. Aber lass um Himmels Willen 
derartige Trivialtransformationen den Compiler machen!

> Ich bin ansonsten auch immernoch der Meinung das für hinreichend kleine
> n die Summierung schneller läuft als die Berechnung mit Multiplikation
> und Division, nicht das es dem OP darum gegangen wäre...

Das wäre ein Argument. Aber das ist nicht gekommen.
Gast
Jop, das war in etwa mein Ansinnen, ähnliche for-Schleife, Variablen 
Deklaration und Initialisierung mit richtgen Typen, aber eben ohne eine 
gesamte While-Schleife oder die Berücksichtigung eines Abbruchs.
Gast
Also wenn mir ein Compiler unter kommt, der bei eingeschalteter 
Optimierung / 2 nicht durch einen shift erledigt*, dann tret ich den 
Compiler in die Tonne, und schreib nicht >>1 ins Programm.

*Es sei denn die Hardware kann zufällig genau so schnell dividieren, wie 
shiften ;)
OP
danke an alle die versucht haben mir zu helfen,

ich hab es selber hin bekommen



#include <cstdlib>
#include <iostream>
#include <conio.h>

using namespace std;

int main ()
{

    int n, i=0;
    cout <<" Gib eine Ganzzahl ein: ";
    cin >> n;
    long sum=0;
    while (i <= n)
   {
    sum = sum+i;
    i=i+1;}
    cout << " Die Summeder ersten " << n << " Ganzzahlenbetraegt: " << 
sum << endl;
    getch();


};
Gast
Wie du willst Karl Heinz, ist müßig sich mit dir darüber zu streiten, 
insbesondere da du mit sowas bei den meisten Optimierungen und Compilern 
wohl recht haben wirst.
Ich für meinen Teil bleibe dabei das Leute die optimieren wollen wissen 
sollten was der Compiler draus macht und ein Gefühl für Optimierungen 
haben. Ab und an mal einen Profiler drüber und auch ein Blick in den ASM 
Teil schadet da nicht und zeigt, zugegeben auf nicht x86 Plattformen, 
doch manchmal das die Optimierung nicht so doll ist.
Gast schrieb:
> Wie du willst Karl Heinz, ist müßig sich mit dir darüber zu streiten,
> insbesondere da du mit sowas bei den meisten Optimierungen und Compilern
> wohl recht haben wirst.

Nicht nur wohl.
Du würdest dich wundern, was Compiler aus solchen trivialen Operationen 
machen.
Oder schreibst du etwa

   x = ( ( y << 2 ) + y ) << 1;

als Ersatz für

  x = 10 * y;

Die meisten Compiler machen diese Ersetzung, wenn sie sich lohnt 
(CPU-abhängig) und haben bei anderen Zahlen noch ganz andere Tricks 
drauf.

Aber der springende Punkt ist:
Der Compiler macht dabei keine Fehler. Änderst du y von int auf long, 
geht obige Optimierung weiterhin. Änderst du den long in double, geht 
sie nicht mehr. Der Compiler berücksichtigt das. Aber ob der 
Programmierer beim Wechsel des Datentyps daran denkt, ist mehr als 
fraglich. Man kann also mit Fug und Recht behaupten, dass sich hier der 
Programmierer unnötigerweise ein Eigentor geschossen hat.

> Ich für meinen Teil bleibe dabei das Leute die optimieren wollen wissen
> sollten was der Compiler draus macht und ein Gefühl für Optimierungen
> haben.

Eben.
Aber du lenkst das Gefühl in die falsche Richtung.
Vor 30 Jahren war es noch cool, solche Ersetzungen zu kennen. Heute 
schmeisst dir jeder Vorgesetzte den Code um die Ohren, wenn du so etwas 
machst.
Optimieren ja. Aber nur dann wenn es sich lohnt. Und wenn ja, fängt man 
beim Algorithmus an und nicht bei Low-Level Operationen, es sei denn der 
Profiler hat gezeigt, dass es dort ein Problem gibt und das Assembler 
Listing hat gezeigt, dass man noch ein paar Nanosekunden schinden kann.
Karl heinz Buchegger schrieb:

> Vor 30 Jahren war es noch cool, solche Ersetzungen zu kennen.

Auch mit dem Hintergedanken, dass derartige Optimierungen auf praktisch 
allen CPUs gegriffen haben.

Heute ist das nicht mehr so. Was auf einer CPU schnell ist, kann auf der 
nächsten saulangsam sein. Der Compiler kennt seine Zielarchitektur und 
sucht sich die Operation raus, die gut geht (Ich würde an dieser Stelle 
gerne schreiben 'die optimial ist', aber das ist vermessen und in der 
Praxis nicht immer so)

Ich habe Wochen damit verbracht einen Hiddenliner auf einem 486 mittels 
Integerarithmetik auf schnell zu trimmen und die Probleme, die durch die 
grobe Diskretisierung entstehen in den Griff zu kriegen.

Ein plain vanilla Rewrite auf einem Pentium mit doubles hat diese 
int-Optimierung aber sowas von ausgehebelt (Coprozessor!)
Gast
> Du würdest dich wundern, was Compiler aus solchen trivialen Operationen
> machen.
> Oder schreibst du etwa
>
>    x = ( ( y << 2 ) + y ) << 1;
>
> als Ersatz für
>
>  x = 10 * y;
>
> Die meisten Compiler machen diese Ersetzung, wenn sie sich lohnt
> (CPU-abhängig)

Genau. Insbesondere kann es auch langsamer sein, wenn die CPU einen 
Multiplizierer, aber keinen Barrelshifter hat.

> Ich für meinen Teil bleibe dabei das Leute die optimieren wollen wissen
> sollten was der Compiler draus macht und ein Gefühl für Optimierungen
> haben. Ab und an mal einen Profiler drüber und auch ein Blick in den ASM
> Teil schadet da nicht und zeigt, zugegeben auf nicht x86 Plattformen,
> doch manchmal das die Optimierung nicht so doll ist.

Dieser Blick zeigt auch manchmal, daß gut gemeinte "Optimierungen" von 
Hand nicht unbedingt immer eine Verbesserung bewirken. Daher sollte man, 
wenn's einem denn so wichtig ist und Portabilität nicht so die Rolle 
spielt, gleich Assembler nutzen, und wenn nicht, dem Compiler die 
Optimierungen überlassen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.