Harmonische Reihe in C- programmieren?

3 Antworten

Das unterscheidet sich eigentlich nicht von C++

In einer Schleife den Nenner hochzählen und die Kehrbrüche aufsummieren. Die Division solltest du als 1.0/n schreiben, sonst bekommst du bei der Integerdivision immer 0 heraus.

Wie sieht dein Versuch aus?


AthenaMagdalena 
Beitragsersteller
 08.11.2018, 16:48

Da ich noch nie was von harmonischen reihen gehört habe sind die Versuche immer noch aussichtslos. Ich habe dennoch geschafft eine Zahl einzulesen und das Programm gibt dann bis zu dieser eingegeben Zahl (z.B 4) alle natürlichen Zahlen aus (1,2,3,4). Schwer zu erklären wenn man dieses Programm nicht sehen kann .

0

Sowas:

//Variablen deklarieren
double i=1;
double result = 0;

//von 1-4 durchloopen und zum Resultat + 1/i rechnen
for (i;i<=4;++i) {
    result += 1/i;
}

//Resultat ausgeben
printf("Resultat: %lf", result);

https://onlinegdb.com/BJhWh0W6m


AthenaMagdalena 
Beitragsersteller
 08.11.2018, 16:55

Ich werde das einmal versuchen, danke!

1
#include <stdio.h>

int main() {
  double i   = 1;
  double res = 0;

  while (i < 5)
    res += 1 / i++;

  printf("Ergebnis: %lf", res);

  return 0;
}
Woher ich das weiß:Studium / Ausbildung

AthenaMagdalena 
Beitragsersteller
 08.11.2018, 18:33

Vielen Dank!!! Du warsd mir eine sehr große Hilfe habe sogar verstanden wie das Programm nun funktioniert und kann dieses auch jetzt weiter ausbauen.

1
AthenaMagdalena 
Beitragsersteller
 08.11.2018, 19:04
@AthenaMagdalena

Einmal muss ich kurz noch stören. Ich versuche gerade herauszufinden, wie ich das Programm so programmieren kann, dass ich eine beliebige positive ganze Zahl (wenn ich das Programm startet) eingebe und diese dann als n hergenommen wird (schwer erklärt). Ich habe das mal so versucht: Ich komm nicht drauf was ich bei der while schleife genau ändern muss damit ich beim Starten des programmes eine Zahl eingeben kann, habe schon einiges probiert aber ich finde den fehler nicht. Vielleicht kannst du mir da auch helfen..

#include <stdio.h>

int n=0;

double i  = 1;

double res = 0;

int

readNumber ()

{

 printf ("Bitte geben Sie eine positive Ganze-Zahl ein: ");

 scanf ("%d", &n);

}

int

printresultat ()

{

   while (i < n)

   res += 1 / i++;

  printf("Ergebnis: %lf", res);

  return 0;

}

int

main (int argc, char **argv)

{

 int n = readNumber ();

 printresultat ();

}

0
IsHaltNeBeta  08.11.2018, 19:16

Sehr gute und schicke Lösung, aber es gibt ein paar Kleinigkeiten zu meckern:

  • die Zählvariable "i" ist als double sehr unschön. (siehe dazu den Link im Kommentar unter der Antwort von Gaterde)
  • wenn Zählvariable eine Ganzzahl, dann muss der Dividend Gleitpunkt sein.
  • Es gibt kein "%lf", da bei Vararg-Funktionen wie printf() sowieso alle Gleitpunkt-Typen implizit in double konvertiert werden, auch float.
  • Am Ende vom Formatstring fehlt ein "\n".
  • Ausdrücke in Schleifen am besten immer in Blöcke mit geschweiften Klammern einpacken. Ist zwar nicht zwingend nötig, aber wird von MISRA, CERT-C, und eigentlich jedem eindringlich empfohlen. :)

Deshalb besser so:

#include <stdio.h>

int main() {
  unsigned i = 1;
  double res = 0;

  while (i < 5) {
    res += 1.0 / i++;
  }

  printf("Ergebnis: %f\n", res);

  return 0;
}

Ansonsten alles OK, denke ich. :)

0
milos2  10.11.2018, 23:04
@IsHaltNeBeta
Ausdrücke in Schleifen am besten immer in Blöcke mit geschweiften Klammern einpacken.

Für mehrere Anweisungen ist dies notwendig, für eine Anweisung aber nicht. Das macht den Code nur unleserlicher und verschwendet Code-Zeilen.

0