Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: BASE4U. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

Mittwoch, 29. Oktober 2014, 09:11

C Codegeschnipsel

Servus,

seit neustem Studiere ich Wirtschaftsinformatik und wir lernen C als Programmiersprache. Wir haben ein Übungsblatt bekommen, das ich auch bearbeitet habe, aber irgendwie immer ein Fehler kommt. Es handelt sich dabei um Aufgabe 1.

index.php?page=Attachment&attachmentID=1293

Das Phänomen was auftritt ist, wenn ich bsp. n=3 eingebe, kommt das Ergebnis für n=4 raus. Kann mir einer erklären warum das so ist bzw. wie ich diesen Fehler beheben kann? Danke für eure Bemühungen

C/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;                                  
    printf("Geben Sie die Laenge n an: ");
    scanf("%li", &n);

    double ergebnis=1;
    double zwischenergebnis;

    double vorzeichen = 1.0;
    double z = 2.0;                      // z = 2, da wenn n=1 1/1 = 1  und ergebnis startet ab 1

    for(int i = 0; i<n;i++)         
    {
        if (i%2 == 0)
        {
            vorzeichen*=-1.0;
            zwischenergebnis = (1*vorzeichen)/z;
        }
        else
        {
            vorzeichen=1.0;
            zwischenergebnis = (1*vorzeichen)/z;
        }

        ergebnis= zwischenergebnis + ergebnis;
        z++;

    }

    printf("Das Ergebnis des ln2 ist: %f", ergebnis);

    return 0;
}

m@dd!n

Wissen/Allg.-Bildung Redakteur

Beiträge: 1 365

Aktivitätspunkte: 7 645

Wohnort: Arberg

Beruf: Fachinformatiker - Systemintegration

  • Nachricht senden

2

Mittwoch, 29. Oktober 2014, 11:58

Wieso hast du eig Ergebnis standardmäßig mit 1 befüllt,

also

C/C++-Quelltext

1
double ergebnis=1;


wenn du dann zusammenzählst, also:

C/C++-Quelltext

1
ergebnis= zwischenergebnis + ergebnis;


dann hast du doch von haus aus genau 1 zu viel oder nicht? (denk ich jetz falsch o.O)

Wissen heißt wissen, wo es geschrieben steht.

3

Mittwoch, 29. Oktober 2014, 14:30

Ne das hab ich nicht gemeint, wenn ich im Taschenrechner n=4 eingebe dann kommt 0,5833... raus und mein Code ergibt 0,78333 was n=3 entspricht.

ergebnis = 1 habe ich eingegeben weil wenn n=1 ist, dann würde ja 1/1=1 ergeben und die variable z sagt ja das es quasi ab n=2 starten soll.

Grizzly

Administrator

Beiträge: 6 682

Aktivitätspunkte: 36 095

Wohnort: Lichtenau

Beruf: Anwendungsentwickler

  • Nachricht senden

4

Mittwoch, 29. Oktober 2014, 21:11

Vielleicht so als Tipp, geb englische, passende, aussagekräftige Variabelnamen.

Nun zu deinem "Problem"

C/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
if (i%2 == 0)
        {
            vorzeichen*=-1.0;
            zwischenergebnis = (1*vorzeichen)/z;
        }
        else
        {
            vorzeichen=1.0;
            zwischenergebnis = (1*vorzeichen)/z;
        }


  1. Für was machst du 1*vorzeichen und das in beiden fällen, denn 1*1.0 = 1 und 1*-1.0 = -1.0. Da kannst du auch gleich vorzeichen / z machen :D
  2. Aber das ist ja nicht das Problem :D
  3. Dreh mal deine Variable von

C/C++-Quelltext

1
ergebnis= zwischenergebnis + ergebnis;

um, so dass es so ausschaut:

C/C++-Quelltext

1
ergebnis= ergebnis + zwischenergebnis;

bzw. vereinfacht:

C/C++-Quelltext

1
ergebnis+= zwischenergebnis;

Warum? Sonst fängst du immer mit einer negativen Zahl an. Also sprich
1. Durchlauf: (-1/2 + 1)
2. Durchlauf: (-1/2 + 1) + (1/3)
....
ich persönlich denke, dass es das schon war, ohne es jetzt getestet zu haben.

Aber BTW: Was ist mit debugging?

5

Mittwoch, 29. Oktober 2014, 21:25

Erstmal danke für deine schnelle Antwort. Das mit dem Vorzeichen weis ich echt nicht warum ich das mit 1* gemacht habe, ist eigentlich unnötig.

Das Phänomen tritt irgendwie immer noch auf, auch wenn ich es umdrehe, wie du es gesagt hast. Debugging hatten wir bisher in noch keiner Vorlesung, weis also nicht wie ich das machen soll :D

Grizzly

Administrator

Beiträge: 6 682

Aktivitätspunkte: 36 095

Wohnort: Lichtenau

Beruf: Anwendungsentwickler

  • Nachricht senden

6

Mittwoch, 29. Oktober 2014, 21:51

Okay, du hast du noch einen kleinen Denkfehler drinnen. Du machst ergebnis = 1 um dir einen "Schritt zu sparen", bedenkst aber nicht, dass du bei der Schleife diesen Schritt nicht abziehst. Deine Schleife müsste so aussehen (in der Schleife n-1 machen):

C/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for (int i = 0; i < n-1; i++)
        	{
            	if (i % 2 == 0)
            	{
                	vorzeichen = -1.0;
            	}
            	else
            	{
                	vorzeichen = 1.0;
            	}

            	zwischenergebnis = vorzeichen / z;
            	ergebnis += zwischenergebnis;
            	z++;
        	}


bzw. du kannst i bei 1 starten lassen und dann in der ersten if-Abfrage i % 2 != 0 (statt i % 2 == 0)

C/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for (int i = 1; i < n; i++)
        	{
            	if (i % 2 != 0)
            	{
                	vorzeichen = -1.0;
            	}
            	else
            	{
                	vorzeichen = 1.0;
            	}

            	zwischenergebnis = vorzeichen / z;
            	ergebnis += zwischenergebnis;
            	z++;
        	}

7

Mittwoch, 29. Oktober 2014, 21:53

Vielen Dank :) War klar das es etwas offensichtliches ist.

Verwendete Tags

C Programmierung