Forum: PC-Programmierung While-Schleife bei C++


von Jürgen M. (juergen00)


Lesenswert?

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;
}

von Rene H. (Gast)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

Kauf dir ein Buch übers Programmieren, vorzugsweise in C oder C++.
Dein "Programm" ist sowas von falsch...

von Rene H. (Gast)


Lesenswert?

Ach ja, n ist auch nicht definiert.
Nimm Dir erst mal ein C oder C++ Buch zur Hand. So wird das nichts.

von Jürgen M. (juergen00)


Lesenswert?

ja vieleicht verständlicher


n soll meine eingabe wert sein und und das programm soll hoch zäheln so 
hoch zählen das 0 + 1+2+3 und so weiter

von Klaus (Gast)


Lesenswert?

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.

von Rene H. (Gast)


Lesenswert?

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!!!

von Gast (Gast)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

Willst du echt in DEM Quelltext nach so banalen Fehlern wie nicht 
initialisierten Variablen suchen?

von Gast (Gast)


Lesenswert?

Ich dachte ich fange mal oben an ;-)

Jörg

von Marcus K. (marcusk)


Lesenswert?

@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;

von NurEinGast (Gast)


Lesenswert?

> 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.

von Gast (Gast)


Lesenswert?

und immer wenn ich eine /2 lese bekomm ichs Kotzen.

Denk mal drüber nach du Held...

von Karl H. (kbuchegg)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

> ... und der OP wollte While-Schleifen lernen

Ich glaube, als erstes wollte er Deutsch lernen.

von Karl H. (kbuchegg)


Lesenswert?

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).

von Rene H. (Gast)


Lesenswert?

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. ;-)

von Marcus K. (marcusk)


Lesenswert?

@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.

von Rene H. (Gast)


Lesenswert?

schmeiss noch ein "en" nach ...

von Olaf D. (Firma: O.D.I.S.) (dreyero)


Lesenswert?

@Marcus Kunze

Spielverderber ;-)

Gruß

Olaf

von Marcus K. (marcusk)


Lesenswert?

nur zur Info:

> (eingabe + 1) * eingabe

ist immer durch 2 Teilbar

von Gast (Gast)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

> 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 ;)

von Marcus K. (marcusk)


Lesenswert?

@Gast
> Shifts existieren
Ja, aber das kann doch bitte schön der Compiler entscheiden und nicht 
ich.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

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...

von NurEinGast (Gast)


Lesenswert?

@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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

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 ;)

von Jürgen M. (juergen00)


Lesenswert?

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();


};

von Gast (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

Und arbeite an deiner Codeformatierung.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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!)

von Mark B. (markbrandis)


Lesenswert?

Trrrrriple Post! ;-)

von Rolf Magnus (Gast)


Lesenswert?

> 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.

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.