Notenspiegel in C

papusek

Grünschnabel
Hallo ihr Lieben,
Ich bin relativ neu, was das Programmieren angeht und muss ein Programm zur Erstellung eines Notenspiegels schreiben. Soweit so gut, nur leider wird mir in meinem Code die Durchschnittsnote und die Durchfallquote als "0" angezeigt.

Woran könnte das liegen? Ich steige leider nicht dahinter.

P.s. für müssen laut Aufgabe sowohl für Ein- als auch für Ausgabe Schleifen nutzen.

Für Tipps und Hinweise wäre ich dankbar.

Code:
 1 #include<stdio.h>
  2
  3 int main(){
  4
  5 int Note[5];
  6 int i;                  /*Laufvariable*/
  7 int durchgefallen;
  8 int summe = 0;
  9 double durchschnitt;
10
11 printf("\tProgramm Notenspiegel\n");
12
13 /*Eingabe der Noten*/
14 for(i=0; i<=4; i++){
15         printf("\nBitte geben sie die Anzahl der Arbeiten  mit der Note %i ein:", i+1);
16         scanf("%i",&Note[i]);
17         summe+=Note[i];}
18
19         printf("\nDer Notenspiegel sieht dann so aus:");
20         printf("\nNote\t1\t2\t3\t4\t5\tGesamt");
21         printf("\nAnzahl\t%i\t%i\t%i\t%i\t%i\t%i", Note[0], Note[1], Note[2], Note[3], Note[4], s    umme);
22
23         /*Ausgabe der Noten*/
24         for(i=0;i<=4;  i++){
25                
26          durchgefallen=(Note[4]/summe)*100;
27          durchschnitt=0;
28          durchschnitt+Note[i]*(i+1);
29         
30                 printf("\nDurchschnittsnote: %.2f", durchschnitt);
31                 printf("\nDurchfallquote: %.2f Prozent", durchgefallen);}
32        
33 return 0;
34 }
 
Woran könnte das liegen?
An der Ganzzahl-arithmetik:
Du rechnest Note[4]/Summe. Da Summe >= Note[4] ist (Note[4] ist ein Summand), gilt max(Note[4]/Summe) = 1.
Wenn aber die Summe nur schon 1 Element grösser ist, ist das Resultat 0.xxx
Aber gemäss Ganzzahlarithmetik hat a+1+n nicht in a Platz, daher ist a / (a + 1 + n) = 0 R a.
Oder anders gesagt: Integerrechnungen runden immer auf die nächstkleinere Ganzzahl.

Für dich heisst das nun: Entweder, du nutzt Dezimalzahlen (floats), oder du nimmst kleine Fehler in Kauf und rechnest Note[4]*100/summe, was den Fehler stark verkleinern kann.

Falls du es "exakt" (Maschinengenau) haben willst, kannst du es als Note[4] * 100.f / summe rechnen und als %f statt %i ausgeben. Der Punkt macht es zusammen mit dem f zu float, ohne f wäre es ein double float (ein bisschen genauer).

Beim Durchschnitt ist die Lösung analog.

/EDIT: Nein, beim Durchschnitt hat es noch andere Fehler. Schau mal die Compilerausgabe (mit -Wall) an. Dann solltest du es sehen.

Gruss
cwriter
 
Zuletzt bearbeitet:
An der Gabzzahl-arithmetik:
Du rechnest Note[4]/Summe. Da Summe >= Note[4] ist (Note[4] ist ein Summand), gilt max(Note[4]/Summe) = 1.
Wenn aber die Summe nur schon 1 Element grösser ist, ist das Resultat 0.xxx
Aber gemäss Ganzzahlarithmetik hat a+1+n nicht in a Platz, daher ist a / (a + 1 + n) = 0 R a.
Oder anders gesagt: Integerrechnungen runden immer auf die nächstkleinere Ganzzahl.

Für dich heisst das nun: Entweder, du nutzt Dezimalzahlen (floats), oder du nimmst kleine Fehler in Kauf und rechnest Note[4]*100/summe, was den Fehler stark verkleinern kann.

Falls du es "exakt" (Maschinengenau) haben willst, kannst du es als Note[4] * 100.f / summe rechnen und als %f statt %i ausgeben. Der Punkt macht es zusammen mit dem f zu float, ohne f wäre es ein double float (ein bisschen genauer).

Beim Durchschnitt ist die Lösung analog.

/EDIT: Nein, beim Durchschnitt hat es noch andere Fehler. Schau mal die Compilerausgabe (mit -Wall) an. Dann solltest du es sehen.

Gruss
cwriter
Vielen lieben Dank für die Antwort, hat mir sehr geholfen!
 
Zurück