Schleifenprogramm erstellen



  • hallo Zusammen,
    Vielen vielen Dank für die Antworten.Habe bevor ich nochmal hier ereingeschaut habe mal selber was rumprobiert.Das ist bei rumgekommen:

    Allerdings läuft das mit dem Exponenten nicht so wirklich.Wie schreibt man das in C++?
    Zu den unzähligen Lösungen hier: Vielen Dank, nur leider versteh ich vieles davon einfach nciht, weil wir noch nicht soviel gehabt haben.
    Das letzte was wir gelernt haben waren If-Else Bedingungen.

    Hoffe ihr könntet mal drüberschaun.
    Ich habe es auch einmal mit #include <math.h> und dann pow() probiert.Damit geht das wunderbar, nur leider soll ich das vermeiden.

    mfg
    Stormi



  • Nutze doch bitte <cpp> </cpp> (statt "<>" --> "[]") um Code herum ... und nutze Einrückung - das fördert die Hilfsbereitschaft der User.

    Wenn du Variablen hast die sich nicht ändern werden ist const (== ändert sich nicht) dein Freund. Schleifen laufen meist von int i=0; i< irgendwas; ++i - dass sie bei 0 starten hat oft was mit Arrays zu tun .. wenn du von 0 bis <=irgendwas zählst hast du (irgendwas+1) Durchläufe also einer mehr als gewünscht. Wenn du double initialisierst gewöhn dir an gleich ein .0 dranzuhängen und nutz immer "sprechende" Namen, der Code wird dadurch übersichtlicher. Variablen solltest du so spät wie möglich einführen und nur so lange wie nötig im Scope halten. Das was nicht tu kann was mit den genutzten Typen und impliziter konvertierung zu tun haben:

    int main () 
    {
        int eingabe =0;
        printf("Bitte die Anzahl der Schleifendurchläufe eingeben: ");
        scanf("%i",&eingabe);
    
        // int m = 0; // brauchen wir nur in der Schleife
        // double n = 0; // sprechende Namen
        double ergebnis = 0.0;
        const double zaehler = 1.0;
        // const double nenner = 2.0; // wo benutzt du den?
    
        for(int m = 0; m < eingabe; m++)
        {
            // typen:
            // double += double / (int SHIFTOP int)
            // double += double / (int)
    
            ergebnis += zaehler / (2<<(m));
            // ergebnis += zaehler / double(2<<m);
    
            printf("%lg\n", ergebnis);
        }
    }
    

    so und nun teste mal was rauskommst wenn du double = double / 2; ausgibst und lies die ersten 2 Abschnitte von http://www.cplusplus.com/doc/tutorial/typecasting/



  • Stormtroop@ schrieb:

    Ich habe es auch einmal mit #include <math.h> und dann pow() probiert.Damit geht das wunderbar, nur leider soll ich das vermeiden.

    Wenn du mit pow() auf die richtige Lösung kommst, was spricht dagegen, eine eigene pow-Fkt. zu schreiben?
    Wenn der Exponent eine Ganzzahl ist, ist es auch nicht schwierig. Anders sähe es aus, wenn der Exponent ebenfalls ein double wäre.

    double MyPow(double base, int e)
    {
    	if(!e)  // der Exponent ist Null, das Ergebnis ist durch Definition 1
    		return 1.0;
    	double ret=1.0; // hier wird der Returnwert deklariert und mit 1 initialisiert
    	for(int i=1;i<=e;++i) // in einer Schleife von 1 bis einschließlich e
    		ret*=base; // in jedem Durchgang ret = ret * base -> kürzere Schreibweise: ret*=base;
    
    	return ret; // Ergebnis liefern
    }
    

    Bei einem Aufruf MyPow(2.0, 5) sieht es entrollt so aus (Pseudocode)

    e>0?weiter:sonst 1.0 zurückliefern
    Returnwert mit 1.0 initialisieren -> entspricht 2[h]0[/h]
    schleife:
     für i = 1 bis i=e
      Returnwert jeweils mit base multiplizieren
    Returnwert zurückgeben
    ->
    ret*=base: 2.0 ,i ist 1
    ret*=base: 4.0 ,i ist 2
    ret*=base: 8.0 ,i ist 3
    ret*=base: 16.0 ,i ist 4
    ret*=base: 32.0 ,i ist 5 hier ist i==e und die Schleife wird beendet
    

    Edit: Eine mögliche Lösung ist hier.



  • Was spricht gegen folgendes ?

    #include <iostream>
    using namespace std;
    
    int main()
    {
        double summe = 0;
        const double z = 1.0;
    
        int m = 0;
        cout << "m = ";
        cin >> m;
    
        for(int i=0; i<=m; ++i)
        {
            int tmp = ( 1<<i );
            summe += ( z/tmp );
        }
        cout << summe;
    
        cin.get();
        return 0;
    }
    

    lg dweb



  • Stormtroop@ schrieb:

    hallo Zusammen,
    Vielen vielen Dank für die Antworten.Habe bevor ich nochmal hier ereingeschaut habe mal selber was rumprobiert.Das ist bei rumgekommen:

    #include <stdio.h>

    void main()
    {
    int eingabe =0;
    int m = 0;
    double n = 0, zaehler = 1, nenner = 2;

    printf("Bitte die Anzahl der Schleifendurchläufe eingeben: ");
    scanf("%i",&eingabe);
    for(m = 0; m <=eingabe; m++)
    {
    n += zaehler / (2<<(m));

    printf("%lg\n", n);
    }

    }

    Allerdings läuft das mit dem Exponenten nicht so wirklich.Wie schreibt man das in C++?
    Zu den unzähligen Lösungen hier: Vielen Dank, nur leider versteh ich vieles davon einfach nciht, weil wir noch nicht soviel gehabt haben.
    Das letzte was wir gelernt haben waren If-Else Bedingungen.

    Hoffe ihr könntet mal drüberschaun.
    Ich habe es auch einmal mit #include <math.h> und dann pow() probiert.Damit geht das wunderbar, nur leider soll ich das vermeiden.

    mfg
    Stormi

    must du das bis zu einer bestimmten zahl durchlaufen lassen?



  • gast123 schrieb:

    Stormtroop@ schrieb:

    hallo Zusammen,
    Vielen vielen Dank für die Antworten.Habe bevor ich nochmal hier ereingeschaut habe mal selber was rumprobiert.Das ist bei rumgekommen:

    #include <stdio.h>

    void main()
    {
    int eingabe =0;
    int m = 0;
    double n = 0, zaehler = 1, nenner = 2;

    printf("Bitte die Anzahl der Schleifendurchläufe eingeben: ");
    scanf("%i",&eingabe);
    for(m = 0; m <=eingabe; m++)
    {
    n += zaehler / (2<<(m));

    printf("%lg\n", n);
    }

    }

    Allerdings läuft das mit dem Exponenten nicht so wirklich.Wie schreibt man das in C++?
    Zu den unzähligen Lösungen hier: Vielen Dank, nur leider versteh ich vieles davon einfach nciht, weil wir noch nicht soviel gehabt haben.
    Das letzte was wir gelernt haben waren If-Else Bedingungen.

    Hoffe ihr könntet mal drüberschaun.
    Ich habe es auch einmal mit #include <math.h> und dann pow() probiert.Damit geht das wunderbar, nur leider soll ich das vermeiden.

    mfg
    Stormi

    must du das bis zu einer bestimmten zahl durchlaufen lassen?

    wie wird denn a/ (b hoch c) in der sprache c ausgedrückt?



  • gast123 schrieb:

    wie wird denn a/ (b hoch c) in der sprache c ausgedrückt?

    Was machst denn du in diesem Thread 😕

    #include <math.h>
    
    int main()
    {
        double a,b,c;
        //...
        double result = a / pow(b, c);
    }
    


  • gast123 schrieb:

    wie wird denn a/ (b hoch c) in der sprache c ausgedrückt?

    Das hat doch nichts mit der Sprache zu tun.
    Wenn du einen Bruchstrich schreiben willst sagst du doch auch nicht, "dazu muss ich nun blaue Tinte verwenden".
    Das hat doch nur was mit deinem Köpfchen zu tun und welchen Algorithmus du dir ausdenkst/überlegst. 😉

    Wenn du b^c haben willst, dann kannst du das iterativ, rekursiv oder über eine eventuelle Funktion, die im Standard vorhanden ist, lösen.

    Oder wenn die Basis 2 ist, dann musst du gar nicht mehr großartig nachdenken, sondern nur noch eine 0 hinten anhängen.

    lg dweb



  • wxSkip schrieb:

    gast123 schrieb:

    wie wird denn a/ (b hoch c) in der sprache c ausgedrückt?

    Was machst denn du in diesem Thread 😕

    #include <math.h>
    
    int main()
    {
        double a,b,c;
        //...
        double result = a / pow(b, c);
    }
    

    ohne pow, sry kenne mich nicht aus...



  • gast123 schrieb:

    wxSkip schrieb:

    gast123 schrieb:

    wie wird denn a/ (b hoch c) in der sprache c ausgedrückt?

    Was machst denn du in diesem Thread 😕

    #include <math.h>
    
    int main()
    {
        double a,b,c;
        //...
        double result = a / pow(b, c);
    }
    

    ohne pow, sry kenne mich nicht aus...

    Was heißt "ohne pow"? Darfst du das nicht verwenden? Was willst du dann?



  • gast123 schrieb:

    ohne pow, sry kenne mich nicht aus...

    Das wurde doch eigentlich schon geagt. Willst du ein explizites Beispiel haben oder wie ?

    Dweb schrieb:

    Wenn du b^c haben willst, dann kannst du das iterativ, rekursiv oder über eine eventuelle Funktion, die im Standard vorhanden ist, lösen.

    Oder wenn die Basis 2 ist, dann musst du gar nicht mehr großartig nachdenken, sondern nur noch eine 0 hinten anhängen.

    lg dweb



  • Hallo zusammen,
    hab mich jetzt nochmal hingesetzt und was gebastelt.
    hab sozusagen die potenz selber geschrieben, läuft allerdings nicht so wie es soll.
    wenn man 0 eingibt kommt nicht 1 raus, und der zeigt mir nicht nur das ergebnis der jeweiligen Teilsummanden sondern nur alle Teilsummanden, also nicht die Summe, was ich aber gerne möchte.
    Vielleicht könntet ihr nochmal drüber schaun.

    [cpp]



  • Ohne dein Programm jetzt genau analysiert zu haben, aber:
    1. Wo bitte schreibst du etwas in ergebnis hinein?
    2. Warum nimmst du mit 2 mal und nicht mit 0.5?



  • wxSkip schrieb:

    Ohne dein Programm jetzt genau analysiert zu haben, aber:
    1. Wo bitte schreibst du etwas in ergebnis hinein?
    2. Warum nimmst du mit 2 mal und nicht mit 0.5?

    zu 2.
    zweite schleife soll quasi das pow() ersetzten.Also die Potenz ausrechnen.

    zu 1.
    Stimmt, aber wo genau muss das jetzt hin?



  • Stormtroop@ schrieb:

    wxSkip schrieb:

    Ohne dein Programm jetzt genau analysiert zu haben, aber:
    1. Wo bitte schreibst du etwas in ergebnis hinein?
    2. Warum nimmst du mit 2 mal und nicht mit 0.5?

    zu 2.
    zweite schleife soll quasi das pow() ersetzten.Also die Potenz ausrechnen.

    zu 1.
    Stimmt, aber wo genau muss das jetzt hin?

    2. Ich fragte dich, warum du mit 2 und nicht 0.5 malnimmst. 0.5^3 gibt nie im Leben 0.5*2*2.
    1. Du solltest schon verstehen, was du da machst. (Nämlich das falsche 🙄 ) Du musst den Quotienten zu zsumme dazuaddieren, nicht immer neu hineinschreiben. Danach ist zsumme dein Ergebnis. Zusätzlich glaube ich, dass deine innere pow-Schleife 2 Schleifendurchläufe weniger haben sollte, aber probier das aus.


Anmelden zum Antworten