Seite 1 von 1

Probleme mit listen im Zusammenhang mit Schlefen

Verfasst: Samstag 30. November 2013, 13:25
von Steve06844
Hallo.

Kurze Vorgeschichte bevor ich zum eigentlichen Problem komme.
Ich lerne an der FH C und möchte parallel dazu auch noch Python lernen.
Desshalb versuche ich jedes Programm, was ich in C schreiben soll auch in Python umzusetzen.
Nun bin ich aber bei einem Programm angekommen, welches ich einfach nicht in Python zum laufen bekome.
Ich habe jetzt eine ganze weile recherchiert, aber eine Lösung habe ich nicht wirklich finden können.

Hier ist die Aufgabe:
Erstellen sie ein Programm, in welchem der Benutzer vier Studenten und deren Noten eingeben muss.
Am Ende sollen die Namen und die jeweiligen Durchschnitte der Studenten ausgegeben werden.

In C sieht das wie folgender maßen aus:

Code: Alles auswählen

 # include <stdio.h>
# include <conio.h>


int main(void)

{

    float Programmierung [3];
    float BWL [3];
    float Mathe [3];
    float Durchscnitt [3];
    float SummeB [3];
    float SummeA[3];

    char Name [3][20], Vorname [3] [20];
    int Alter [3];
    int i, j;

    for(i=0; i<=3; i++)
    {
        printf("Bitte geben sie ihren Vornamen ein.\n");
        gets(Vorname[i]);
        printf("Bitte geben sie ihren Nachnamen ein.\n");
        gets(Name [i]);
        printf("Bitte geben sie ihr Alter ein\n");
        scanf("%i", &Alter[i]);
        fflush(stdin);
        printf("Bitte geben sie ihre BWL-Note ein.\n");
        scanf("%f", &BWL [i]);
        fflush(stdin);
        printf("Bitte geben sie ihre Programmier-Note ein.\n");
        scanf("%f", &Programmierung [i]);
        fflush(stdin);
        printf("Bitte geben sie ihren Mathe-Note ein.\n");
        scanf("%f", &Mathe [i]);
        fflush(stdin);
Anmerkung: Das ist nicht der komplette Code. Es sollte aber zur Erklärung meines Problems reichen

Hier jetzt der Python Code:

Code: Alles auswählen

i = 1
j = 1
while i < 5:
    print 'bitte geben sie Ihren Vornamen ein:'
    Vorname = str(raw_input())
    print 'bitte geben sie Ihren Nachnamen ein:'
    Nachname = str(raw_input())
    print 'Bitte geben sie ihre BWL-Note ein'
    BWL = float(raw_input())
    print 'Bitte geben sie ihre Mathe-Note ein'
    Mathe = float(raw_input())
    print 'Bitte geben sie ihre Programmier-Note ein'
    Prog = float(raw_input())
    i = i + 1
def Durchschnitt():
    global x
    x = (BWL + Mathe + Prog)/3
    print 'ihr Durchschnitt ist:', x
while j < 5:
    Durchschnitt()
    j = j + 1
Nun endlich zu meinem Problem:

Wenn, ich das ganze in Python ausführe gibt er mir natürlich vier mal den selben Durchschnitt aus.
Ich bin jetzt der Meinung das die Lösung eine Liste sein sollte, jedoch weis ich nicht genau, wie und wo ich diese anlegen sollte.
Mein Ziel ist es ja, dass alle Eingaben einzeln gespeichert werden.
Eine fertige Lösung möchte ich natürlich nicht haben.
Es wäre schonmal super, wenn mir jemand sagen kann, ob das verwenden von Listen mein Problem lösen wird, oder ob ich mich total "verrannt" habe.

Ich sage jetzt schonmal danke !

Re: Probleme mit listen im Zusammenhang mit Schlefen

Verfasst: Samstag 30. November 2013, 13:38
von mcdwerner
@Steve06844: Wenn Du hier eine Liste einsetzen möchtest, dann hast Du Dir doch bestimmt überlegt, wozu die Liste dienen soll, welchen Vorteil sie gegenüber der jetzigen Programmversion bringt?
Versuch das mal zu Formulieren und damit einen Namen für die Liste zu finden. Danach bist Du denke ich schon einen Schritt weiter ;-)

Edit, zu früh abgeschickt. Zum Code an sich: weisst Du, warum Du 4x das gleiche Ergebnis erhältst?

Re: Probleme mit listen im Zusammenhang mit Schlefen

Verfasst: Samstag 30. November 2013, 13:48
von snafu
Erstelle die Liste außerhalb der `while`-Schleife. Füge dann im Schleifenkörper direkt nach den vollständigen Benutzereingaben den errechneten Notendurchschnitt der Liste hinzu (``deine_liste.append(durchschnitt)``). Die zweite `while`-Schleife ist dann auch überflüssig.

Du kannst das Abfragen der Nutzerdaten samt der Errechnung des Durchschnitts natürlich auch in eine eigene Funktion stecken, die du mittels einer Schleife mehrfach aufrufst. Der Notendurchschnitt wäre dann der Rückgabewert der Funktion und diesen fügst du jeweils zu deiner Gesamtliste hinzu.

Und anstatt ``while i < 5`` sollte man besser ``for i in range(5)`` schreiben - oder ``for dummy in range(5)``, um zu verdeutlichen, dass man sich nur für die Schleifendurchläufe, nicht aber für den an `i` bzw `dummy` gebundenen Wert interessiert.

Re: Probleme mit listen im Zusammenhang mit Schlefen

Verfasst: Samstag 30. November 2013, 13:59
von BlackJack
@Steve06844: Das sieht ein bisschen danach aus als wolltest Du ein schlechtes C-Programm nach Python übersetzen. An der Stelle würde ich entweder empfehlen erst einmal ein besseres C-Programm zu schreiben, oder aber das Problem in Python zu lösen und daraus dann die Schlüsse zu ziehen wie man das in C besser machen kann.

Im C-Programm ist übrigens ein heftiger Fehler: Die Arrays haben alle nur *drei* Elemente, in der Schleife versuchst Du dann aber jeweils *vier* Werte in jedes Array zu stecken, also den letzten Wert jeweils in den Speicherbereich *hinter* dem für das Array vorgesehenem Speicher, also höchstwahrscheinlich an den Anfang der jeweils nächsten deklarierten Variable.

Und `gets()`: Eine Funktion die man nie und nimmer verwendet. Jedes Tutorial, jede Funktionsdokumentation, und jeder Lehrer der auch nur ansatzweise etwas taugt wird davon ganz, ganz dringend abraten und auf `fgets()` verweisen!

Was hat das ``<conio.h>`` im C-Quelltext zu suchen? Das ist kein Standard-C-Header und es gibt auch keine wirklich portable Bibliothek die das anbietet. Zumindest im gezeigten Quelltext wird auch nichts verwendet was daraus kommen könnte. Und es macht bei so einem einfachen Programm IMHO auch gar keinen Sinn das ohne Not nur für DOS oder die Windows-Konsole zu schreiben.

Zum Python-Programm: Es gibt in Python auch ``for``-Schleifen.

Was denkst Du was ein `str()`-Aufruf auf den Rückgabewert von `raw_input()` bewirkt?

``global`` vergiss mal ganz schnell wieder, das hat in sauberen Programmen nichts zu suchen.

Re: Probleme mit listen im Zusammenhang mit Schlefen

Verfasst: Samstag 30. November 2013, 14:08
von Steve06844
mcdwerner hat geschrieben:@Steve06844: Wenn Du hier eine Liste einsetzen möchtest, dann hast Du Dir doch bestimmt überlegt, wozu die Liste dienen soll, welchen Vorteil sie gegenüber der jetzigen Programmversion bringt?
Versuch das mal zu Formulieren und damit einen Namen für die Liste zu finden. Danach bist Du denke ich schon einen Schritt weiter ;-)

Edit, zu früh abgeschickt. Zum Code an sich: weisst Du, warum Du 4x das gleiche Ergebnis erhältst?
Ja, weil nach jedem Schleifendurchlauf die eingegebenen Daten durch die neue Eingabe überschrieben werden.
Das Programm benutzt also nur die Zahlen des letzen Schleifendurchlaufs.
Wenn ich beim letzen Durchlauf " 2,3,4 " eingebe rechnet es nur mit diesen werten und desshalb kommt auch 3 x "2.3333" raus.



@ snafu.

Das hat mir schonmal weiter geholfen. Ich lege erstmal eine Pause ein und lese mir das mit den Listen nocheinmal durch.
Wenn ich deinen Post richtig verstanden habe, sollte danach alles funktionieren

@Balckjack.

Das war jetzt ein bisschen viel aber ok.
Ich schreibe es einfach nochmal neu und versuche es dann sauber in C zu schreiben.
Zu "gets": Ein Freund hatte mich auch vor ein paar Tagen darauf hingewiesen, dass ich lieber fgets benutzen sollte. Ich bin aber bis jetzt noch nicht dazu gekommen micht damit zu beschäftigen.

Ich danke euch erstmal für die schnelle Hilfe.

Re: Probleme mit listen im Zusammenhang mit Schlefen

Verfasst: Sonntag 1. Dezember 2013, 19:09
von BlackJack
@Steve06844: Was Du da mit ``fflush(stdin);`` versuchst ist weder von C noch in POSIX spezifiziert. Das muss also nicht funktionieren. Und selbst wenn es das macht was Du ausnutzt, gibt es Probleme wenn man zum Beispiel eine Datei in das Programm „pipe”t, denn dann wird nicht mehr zwingend an Zeilenenden gepuffert und zu viel verworfen. Da sollte man vielleicht besser selber eine passende Funktion schreiben, die genau das macht was man an der Stelle haben möchte.

Der Code geht auch nicht mit Fehleingaben um wie zu lange Namen oder Zeichen die keine Zahlen ergeben für die Noten.

Und natürlich die Sachen die nicht so oft passieren: Was passiert wenn die Eingabe abbricht bevor das Programm zuende ist. Zum Beispiel wenn man das über eine SSH-Verbindung ausführt deren Gegenseite die Verbindung schliesst?