Bitte um Hilfe bei einem "Hochzählprogramm"



  • Hallo!
    Nachdem wir uns heute den ganzen Tag an einer Aufgabe die Zähne ausgebissen haben, bitte ich nun hier um Hilfe.

    Aufgabenstellung:
    Erstellen Sie ein C-Programm, welches die Summe
    S=1-(1/2)+(1/3)-(1/4)+(1/5)-...+(1/299)-(1/300)
    berechnet und auf dem Bildschirm ausgibt. Außerdem werden geeignete Kontrollstrukturen gefordert.(Sind aber nicht so wichtig).
    while-Anweisungen sind verboten.

    Hinweis: Die Klammern habe ich nur gesetzt, damit euch die Brüche deutlich werden, stehen also in Wirklichkeit nicht da.

    Hier der Versuch:

    #include<stdio.h>
    int main (void)
    {
    	float a, s, x;
    	int b;
    	b=1;
    	s=0.0;
    	x=0.0;
    	for(a=0;a<=300;++a)
    	{
    		switch (b)
    		{
    		case 'b>0':++a;b*(-1);break;
    		case 'b<0':--a;b*(-1);break; 
                    default:a++;b*(-1);break;
    		}
            x=1/a;
            a*(-1);
    	}
            s=x;
            printf("Die Summe von 1 bis -1/300 betraegt: %f\n",s);
            return 0;
    }
    

    Hätte jemand die Nerven, mir zu sagen, warum das Programm nicht richtig läuft?
    PS Compiler ist: Microsoft Visual C++ 2008 Express Edition.
    Besten Dank
    knacksen 🙂



  • Was möchtest du mit dieser Zeile erreichen 😉

    case 'b>0':++a;b*(-1);break;
    

    Lies dir noch mal durch was du bei case ' ' reinschreiben solltest.
    und dann ++a oder nächste Zeile --a möchtest du das?

    Gibt dein Compiler keine Warnung heraus?

    MfG f.-th.



  • Du versuchst das allgemein viel zu kompliziert anzugehen, da es doch eigentlich ein relativ triviales Problem ist:

    #include <stdio.h>
    
    int main()
    {
    	float sum = 0;
    	int limit = 300;
    
    	for(int i=1; i <= limit; ++i){
    		sum += i % 2 == 0 ? 1.0/i : -1.0/i;
    	}
    
    	printf("1/1 - 1/2 + 1/3 - ... %c 1/%d = %f\n", limit % 2 ? '+' : '-', limit, sum);
    
    	return 0;
    }
    


  • Guten Abend,

    Also dein Fehler lag an der stelle

    x = 1/a// Falsch müsste
    x = x+ 1/a // heißen
    

    Dann benutzt du s nur um es in printf auszugeben. Meiner Meinung nach wäre es besser gleich x auszugeben.
    Du kannst die Default anweisung ruhig weglassen. in diesem Beispiel ist es unmöglich das b 0 ist.
    Dann versuchst du

    case 'b>0':++a;b*(-1);break;
    

    die abfrage in einem String zu machen, was nicht möglich ist. mach es lieber als if anweisung.

    Das waren die Fehler die mir aufgefallen sind.
    Ich habe dir Funktion für dein Problem geschrieben.

    double add(int anzahl) {
        int  b;
        float i,x=0;
        b=1;
        for(i=1; i<=anzahl; ++i) {
            if(b<0) {
                    x=x-1/i;
                    b *= -1;
            } else {
                    x=x+1/i;
                    b *= -1;
    
            }
        }
        return x;
    }
    


  • Hallo!
    Erstmal vielen Dank an alle.
    Nach langem hin und her haben wir das Problem mit einer if/else Anweisung gelöst, welches in einer for Schleife eingepackt ist.
    Ich werde den Quellcode nachher hier einstellen.

    Gruß knacksen 🙂



  • Hier noch unsere Lösung:

    #include <stdio.h>
    
    int main (void)
    
    {
    	float             a,b,c,s,z,x;
    
    	a=1;
    	b=2;
    	c=3;
    	s=1;
    	x=5;/*kann beliebige Zahl sein*/
    
    	for(z=1;z<=100;z++)
    	{
    		if(x==5)
    		{
    			s=s-(1/b);
    			printf("Zwischenergebnis: %f\n",s);
    			b++;b++;
    			++x;
    			printf("Ausgabe x: %f\n",x);
    		}
    		else
    		{
    			s=s+(1/c);
    			printf("Zwischenergebnis: %f\n",s);
    			c++;c++;
    			--x;
    			printf("Ausgabe x: %f\n",x);
    		}
    	}
    	printf("Endergebnis: %f\n",s);
    
    		return 0;
    	}
    

Log in to reply