Datenbank mit C



  • Hllo an alle,
    zuallererst erstmal sry falls ein Thema in der Richtung schon existiert aber ich konnte leider nichts finden.
    Zu meinem Problem:
    Ich muss für eine Belegarbeit mit C Kundendaten (Name, Vorname, Kontonummer, Kontostand) abfragen, die in einer txt oder xls Datei abspeichern, später wieder auslesen und bearbeiten können. Die Eingabe funktioniert erstmal so weit, aberbei der Ausgabe der Daten aus der Dtei kommt leider nur die erste eingegebene Zeile was sicherlich mit \n zusammenhängt. Aber eine Idee wie man das anders machen kann habe ich leider nicht. Jmd vllt eine Idee?! Danke schonmal.
    mfg
    Eric

    //
    //
    # include "Stdafx.h"
    # include "stdio.h"
    # include "stdlib.h"
    # include "string.h"
    # include "windows.h"
    # include "time.h"
    # include "mmsystem.h"
    
    #pragma comment (lib, "winmm.lib") //MCI
    
    // Funktionsprototypen
    void eingabe (void);
    void zeit (void);
    void ausgabe (void); //
    //void bearbeiten (void);	 //	
    //void galgen (void);
    
    int  g, f, i, j;
    char vorname[15];
    char name [20];
    int kontostand;
    float kontonummer;
    
    	FILE*datei; //Deklaration der Datei
    
    struct Konto
    	{   *next;
    		char name[20];
    		char vorname[20];
    		int knr;
    		float kontostand;
    	}
    
    // Hauptprogramm
    void main(void)
    {
    	PlaySound (TEXT ("sound.wav"), NULL, SND_LOOP | SND_ASYNC) ; //Abspielen von Hintergrundmusik http://www.c-plusplus.net/forum/290724-full//
    
    	menu1:
    	system("color F0"); //Änderung der Hintergrundfarbe und Schrift
    	menu2:					//Sprungpunkt für "goto Anweisung
    
    	system ("cls");			//Clear screen
    
    zeit();					//http://www.willemer.de/informatik/cpp/timelib.htm
    
    	printf("\n\n\t --KUNDENDATENVERWALTUNGSPROGRAMM DKB-- \n"); 
    
    printf("\n\n\t Druecken Sie die 1 um Kundendaten einzugeben: \n");
    printf("\n\t Druecken Sie die 2 um Kundendaten einzusehen: \n");
    printf("\n\t Druecken Sie die 3 um Kundendaten zu bearbeiten: \n");
    printf("\n\t Druecken Sie die 4 um das Programm zu beenden: \n");
    printf("\n\t Druecken Sie die 5 falls sie mit ihrer Arbeit fertig sind: \n");
    
    printf("\n\t Druecken Sie die 10 um das Design des Programmes umzustellen: \n\t (eventuell ansprechender) \n");
    
     printf("\n\t Bitte treffen Sie eine Auswahl: \n");
    
    scanf("\t %i", &i);
    
    switch (i)			//Auswahlanweisung ähnlich zu if/ else (if i=1 und so weiter
    {
    
    case 1:
    	{
    	eingabe();
    	goto menu2;
    	}
    
    case 2:
    	{
    	ausgabe();
    	system("PAUSE");
    	goto menu2;
    	}
    
    case 3:
    	{
    	//bearbeiten();
    	goto menu2;
    	}
    
    case 4:
    	printf("\n\t Bis zum naechsten mal, angenehmen Tag noch! \n");
    	system("PAUSE"); //auch mit getchar() probiert aber der text wird nur kurz angezeigt?!
    	break;
    
    case 5:
    	{
    	//galgen();
    	goto menu2;
    	}
    
    case 10:
    	{
    	system("color 0F"); //Änderung der Hintergrundfarbe und Schrift zum Standard
    	//farbe();
    	goto menu2;
    	}
    
    default:
    	{
    	system("color 0C");
    	printf("\n\t Sie haben eine falsche Zahl eingegeben, bitte Wiederholen! \n");
    	system("PAUSE");
    	goto menu1;
    	}
    }
    
    return; 
    }
    
    void eingabe(void)
    {
    
    		printf("\n\t KUNDENDATENEINGABE: \n\n");
    
     datei=fopen("Kundendaten.csv","w+");									//http://pronix.linuxdelta.de/C/standard_C/c_programmierung_19.shtml
    name[20]; vorname[20]; kontostand=0; kontonummer=0; 
    
     if(NULL == datei)													//http://de.wikibooks.org/wiki/C-Programmierung:_Dateien
          {
             printf("Konnte Datei \"Kundendaten.csv\" nicht oeffnen!\n");
          }
    
    printf("\n\t Wieviele Kundendaten moechten Sie eingeben?\n");
    scanf("%i", &j);
    for (f=1; f<=j;f++)
    
    {
    fprintf (datei, " ,%i ",f);
    printf("\n\t Bitte geben sie den Vornamen ein:\n");
    scanf("%s",vorname);
    fprintf (datei, " ,%s ",vorname);
    
    printf("\n\t Bitte geben sie den Nachnamen ein:\n");
    scanf("%s",name);
    fprintf (datei, " ,%s ",name);
    
    printf("\n\t Bitte geben sie die Kontonummer ein:\n");
    scanf("%s",&kontonummer);
    fprintf (datei, " ,%s ",&kontonummer);
    
    printf("\n\t Bitte geben sie den aktuellen Kontostand ein:\n");
    scanf("%s",&kontostand);
    fprintf (datei, " ,%s ",&kontostand);
    fprintf (datei, "\n");
    }
    
    fclose (datei);
        return;
    }
    
    void ausgabe (void)
    {
    		printf("\n\t KUNDENDATENAUSGABE: \n\n");
    
     datei=fopen("Kundendaten.csv","r");									//http://pronix.linuxdelta.de/C/standard_C/c_programmierung_19.shtml
       if(NULL == datei)													//http://de.wikibooks.org/wiki/C-Programmierung:_Dateien
          {
             printf("Konnte Datei \"Kundendaten.csv\" nicht oeffnen!\n");
          }
    
    for (f=1; f<=j;f++)
    
    {
    fscanf (datei, " ,%s ",vorname);
    printf ("%s",vorname);
    
    fscanf (datei, " ,%s ",name);
    printf ("%s",name); 
    
    fscanf (datei, " ,%s ",&kontonummer);
    printf ("%s",&kontonummer);
    
    fscanf (datei, " ,%s ",&kontostand);
    printf("%s",&kontostand);
    }
    
    fclose (datei);
        return;  
    }
    
    void zeit (void)
    {
    
     time_t rawtime;
      struct tm * timeinfo;
    
      time ( &rawtime );
      timeinfo = localtime ( &rawtime );
      printf ( "\n\t\t\t\t %s ", asctime (timeinfo) );
    }
    


  • Muss das goto im Quelltext? Warum keine anderen Schleifen?
    Warum der Spaghetti-Code?

    Dann zu Zeile 141 und 149 die solltest du vergleichen und die richtige Form wählen.

    Dann versuche den Quelltext übersichtlich zu formatieren - wir können das schneller lesen und du wahrscheinlich besser verstehen.

    Nimm beim C-Quelltext statt des Code-Button den C/C++-Button. Dann geht das auch in Farbe.

    Hab das nur überflogen und nach dem goto nicht mehr viel Zeit investiert.



  • Hab das zu schnell geschrieben 😡

    Warum:

    int kontostand;
    float kontonummer;
    

    😕

    Zeile 149 + 154 haben eine andere Macke. Aber erst das Warum klären.



  • Erstmal:

    Was sollen all die globalen Variablen.

    Wann benutzt du die struct Konto?

    printf braucht nur in ganz seltenen Fällen einen Adressoperator bei den Argumenten.

    Der erste Teil von Zeile 127 ist auch etwas seltsam.



  • Erstmal vielen Dank für euer schnelles Antworten.

    f.-th. schrieb:

    Muss das goto im Quelltext? Warum keine anderen Schleifen?
    Warum der Spaghetti-Code?

    Dann zu Zeile 141 und 149 die solltest du vergleichen und die richtige Form wählen.

    Dann versuche den Quelltext übersichtlich zu formatieren - wir können das schneller lesen und du wahrscheinlich besser verstehen.

    Nimm beim C-Quelltext statt des Code-Button den C/C++-Button. Dann geht das auch in Farbe.

    Hab das nur überflogen und nach dem goto nicht mehr viel Zeit investiert.

    Erstml goto hatte das damals mal so gelernt und ht immer funktioniert. Könnte ich natürlich auch mit if/else oder ähnlich machen.
    Hab die llg. Formatierung mal ein bisschen ordentlicher gemacht, ich hoffe das ist jetzt übersichtlicher 😉

    f.-th. schrieb:

    Hab das zu schnell geschrieben 😡

    Warum:

    int kontostand;
    float kontonummer;
    

    😕

    Zeile 149 + 154 haben eine andere Macke. Aber erst das Warum klären.

    int kontonummer und flot kontostand sollte es eigentlich heißen. hab es schon geändert.

    DirkB schrieb:

    Erstmal:

    Was sollen all die globalen Variablen.

    Wann benutzt du die struct Konto?

    printf braucht nur in ganz seltenen Fällen einen Adressoperator bei den Argumenten.

    Der erste Teil von Zeile 127 ist auch etwas seltsam.

    Globale Variablen hab ich erstmal zu lokalen geändert.
    Die Dantenbank soll mit struct erstellt werden, aber irgendwie hat das noch nicht so richtig funktioniert, deswegen wollte ich es erstmal so zum laufen kriegen.



  • Hier nochmal der Quelltext ein bisschen ordentlicher:

    //
    //
    # include "Stdafx.h"
    # include "stdio.h"
    # include "stdlib.h"
    # include "string.h"
    # include "windows.h"
    # include "time.h"
    # include "mmsystem.h"
    
    #pragma comment (lib, "winmm.lib") //MCI
    
    // Funktionsprototypen
    void eingabe (void);
    void zeit (void);
    void ausgabe (void); //
    //void bearbeiten (void);	 //	
    //void galgen (void);
    
    char vorname[15];
    char name [20];
    float kontostand;
    int kontonummer;
    
    FILE*datei; //Deklaration der Datei
    
    /*
    struct Konto
    	{   *next;
    		char name[20];
    		char vorname[20];
    		int knr;
    		float kontostand;
    	}
    */
    
    // Hauptprogramm
    void main(void)
    {
    	int i;
    	PlaySound (TEXT ("sound.wav"), NULL, SND_LOOP | SND_ASYNC) ; //Abspielen von Hintergrundmusik http://www.c-plusplus.net/forum/290724-full//
    
    	menu1:
    	system("color F0"); //Änderung der Hintergrundfarbe und Schrift
    	menu2:					//Sprungpunkt für "goto Anweisung
    	system ("cls");			//Clear screen
    
    	zeit();					//http://www.willemer.de/informatik/cpp/timelib.htm
    
    	printf("\n\n\t --KUNDENDATENVERWALTUNGSPROGRAMM DKB-- \n"); 
    	printf("\n\n\t Druecken Sie die 1 um Kundendaten einzugeben: \n");
    	printf("\n\t Druecken Sie die 2 um Kundendaten einzusehen: \n");
    	printf("\n\t Druecken Sie die 3 um Kundendaten zu bearbeiten: \n");
    	printf("\n\t Druecken Sie die 4 um das Programm zu beenden: \n");
    	printf("\n\t Druecken Sie die 5 falls sie mit ihrer Arbeit fertig sind: \n");
    	printf("\n\t Druecken Sie die 10 um das Design des Programmes umzustellen: \n\t (eventuell ansprechender) \n");
    	printf("\n\t Bitte treffen Sie eine Auswahl: \n");
    	scanf("\t %i", &i);
    	switch (i)			//Auswahlanweisung ähnlich zu if/ else (if i=1 und so weiter
    	{
    
    	case 1:
    	{
    	eingabe();
    	goto menu2;
    	}
    
    	case 2:
    	{
    	ausgabe();
    	system("PAUSE");
    	goto menu2;
    	}
    
    	case 3:
    	{
    	//bearbeiten();
    	goto menu2;
    	}
    
    	case 4:
    	printf("\n\t Bis zum naechsten mal, angenehmen Tag noch! \n");
    	system("PAUSE"); //auch mit getchar() probiert aber der text wird nur kurz angezeigt?!
    	break;
    
    	case 5:
    	{
    	//galgen();
    	goto menu2;
    	}
    
    	case 10:
    	{
    	system("color 0F"); //Änderung der Hintergrundfarbe und Schrift zum Standard
    	//farbe();
    	goto menu2;
    	}
    
    	default:
    	{
    	system("color 0C");
    	printf("\n\t Sie haben eine falsche Zahl eingegeben, bitte Wiederholen! \n");
    	system("PAUSE");
    	goto menu1;
    	}
    }
    return; 
    }
    
    void eingabe(void)
    {
    int f, j;
    printf("\n\t KUNDENDATENEINGABE: \n\n");
    datei=fopen("Kundendaten.csv","w+");									//http://pronix.linuxdelta.de/C/standard_C/c_programmierung_19.shtml
    
    if(NULL == datei)													//http://de.wikibooks.org/wiki/C-Programmierung:_Dateien
          {
          printf("Konnte Datei \"Kundendaten.csv\" nicht oeffnen!\n");
          }
    
    printf("\n\t Wieviele Kundendaten moechten Sie eingeben?\n");
    scanf("%i", &j);
    for (f=1; f<=j;f++)
    
    {
    fprintf (datei, " ,%i ",f);
    printf("\n\t Bitte geben sie den Vornamen ein:\n");
    scanf("%s",vorname);
    fprintf (datei, " ,%s ",vorname);
    printf("\n\t Bitte geben sie den Nachnamen ein:\n");
    scanf("%s",name);
    fprintf (datei, " ,%s ",name);
    printf("\n\t Bitte geben sie die Kontonummer ein:\n");
    scanf("%s",&kontonummer);
    fprintf (datei, " ,%s ",&kontonummer);
    printf("\n\t Bitte geben sie den aktuellen Kontostand ein:\n");
    scanf("%s",&kontostand);
    fprintf (datei, " ,%s ",&kontostand);
    fprintf (datei, "\n");
    }
    fclose (datei);
    return;
    }
    
    void ausgabe (void)
    {
    printf("\n\t KUNDENDATENAUSGABE: \n\n");
    datei=fopen("Kundendaten.csv","r");									//http://pronix.linuxdelta.de/C/standard_C/c_programmierung_19.shtml
       if(NULL == datei)													//http://de.wikibooks.org/wiki/C-Programmierung:_Dateien
          {
             printf("Konnte Datei \"Kundendaten.csv\" nicht oeffnen!\n");
          }
    for (f=1; f<=j;f++)
    {
    fscanf (datei, " ,%s ",vorname);
    printf ("%s",vorname);
    fscanf (datei, " ,%s ",name);
    printf ("%s",name); 
    fscanf (datei, " ,%s ",&kontonummer);
    printf ("%s",&kontonummer);
    fscanf (datei, " ,%s ",&kontostand);
    printf("%s",&kontostand);
    }
    fclose (datei);
    return;  
    }
    
    void zeit (void)
    {
    time_t rawtime;
    struct tm * timeinfo;
    time ( &rawtime );
    timeinfo = localtime ( &rawtime );
    printf ( "\n\t\t\t\t %s ", asctime (timeinfo) );
    }
    


  • Derselbe Müll wie zuvor,
    - globale Variablen
    - Nichtverwendung der Struktur
    - "%s" bei fscanf liefert Fehler bei Whitespaces
    - keine Auswertung der Rückgabewerte aus fscanf
    - allgemein bekannte Pfusch-Quelle allen Übels: "http://pronix.linuxdelta.de..."



  • Du hast

    float kontostand;
    int kontonummer;
    

    machst dann aber

    scanf("%s",&kontonummer);
    fprintf (datei, " ,%s ",&kontonummer);
    ...
    scanf("%s",&kontostand);
    fprintf (datei, " ,%s ",&kontostand);
    

    Informier dich mal darüber was %s bei scanf bedeutet.
    Informier dich mal darüber was %s bei fprintf bedeutet.
    ⚠ Das ist nicht das Selbe, das ist nur ähnlich.

    Eine Kontonummer ist kein int, auch wenn sie aus Ziffern besteht.

    Da du auch nur eine Variable für einen Vornamen hast, kannst du auch schlecht mehr Datensätze halten.



  • Wutz schrieb:

    Derselbe Müll wie zuvor,
    - globale Variablen
    - Nichtverwendung der Struktur
    - "%s" bei fscanf liefert Fehler bei Whitespaces
    - keine Auswertung der Rückgabewerte aus fscanf
    - allgemein bekannte Pfusch-Quelle allen Übels: "http://pronix.linuxdelta.de..."

    Hab doch die globalen Variablen zu lokalen gemacht?! Der Rest muss doch global bleiben, da ich die in mehreren Funktionen brauche oder nicht?

    Pfusch-quelle? kannte die Seite nicht, klang aber ganz OK was da stand. Vllt bessere Quellen für Tutorials oder der gleichen?!
    Mfg



  • eyk107 schrieb:

    Hab doch die globalen Variablen zu lokalen gemacht?! Der Rest muss doch global bleiben, da ich die in mehreren Funktionen brauche oder nicht?

    Wenn man nur Funktionen hat, die nur void als Argument haben, dann schon.

    Das ist aber nicht der Sinn von Funktionen und sehr sehr sehr schlechter Programierstil.
    Unwartbar und katastrophal. Das erinnert an C-64 Basic.

    Funktionen können Parameter und Rückgabewerte haben.
    So wie bei fopen oder localtime.

    Das ist auch der eigentliche Grund warum es Funktionen gibt. Sonst hätte man bei Subroutines bleiben können.



  • eyk107 schrieb:

    Pfusch-quelle? kannte die Seite nicht, klang aber ganz OK was da stand. Vllt bessere Quellen für Tutorials oder der gleichen?!
    Mfg

    Na ja, wo das hinführt, kann man bei dir sehen.
    Du möchtest die Datei öffnen und stellst fest es klappt nicht.
    Du meldest das auch, du machst dann aber weiter im Programm und versuchst munter aus der Datei zu lesen.



  • DirkB schrieb:

    eyk107 schrieb:

    Pfusch-quelle? kannte die Seite nicht, klang aber ganz OK was da stand. Vllt bessere Quellen für Tutorials oder der gleichen?!
    Mfg

    Na ja, wo das hinführt, kann man bei dir sehen.
    Du möchtest die Datei öffnen und stellst fest es klappt nicht.
    Du meldest das auch, du machst dann aber weiter im Programm und versuchst munter aus der Datei zu lesen.

    Ja ich mein iat ja vollkommen richtig aber hilft mir leider nicht sehr weiter. Es wäre dezent hilfreicher zu sagen wo der fehler ist, oder zu sagen wie es besser geht. Oder auch ein Link oder Beispiel würde mir schon reichen.
    Danke schonmal
    mfg
    Eric



  • eyk107 schrieb:

    Es wäre dezent hilfreicher zu sagen wo der fehler ist, oder zu sagen wie es besser geht.

    Das wurde alles schon geschrieben.

    Deine Programmablauf mit den gotos ist merkwürdig.
    Dein Verständnis von Funktionen ist merkwürdig.
    Deine Eingaben mit scanf sind falsch.
    Deine Ausgaben mit printf sind falsch.

    Lass das überflüssige mit Sound und Farbe erstmal sein und konzentriere dich auf das Wesentliche.

    Du brauchst ein gutes Buch über C, das du auch durcharbeiten musst.
    Ich kenne kein gutes Buch, da ich in letzter Zeit keins brauchte.
    Aber es gibt genug Threads hier im Forum.



  • Dirk hat es doch schon beschrieben.
    Hier ein Ausschnitt:

    void ausgabe (void)
    {
       printf("\n\t KUNDENDATENAUSGABE: \n\n");
       datei=fopen("Kundendaten.csv","r");
       if(NULL == datei) 
          {
             printf("Konnte Datei \"Kundendaten.csv\" nicht oeffnen!\n");
          }
       else   // ein Ansatz - es gibt Alternativen
       {
          for (f=1; f<=j; f++)   // globale Variable zu lokale ändern, schon vorgeschlagen
          {
             fscanf (datei, " ,%s ",vorname);
             printf ("%s",vorname);
             fscanf (datei, " ,%s ",name);
             printf ("%s",name);
             fscanf (datei, " ,%s ",&kontonummer);  // wurde schon vorgeschlagen
             printf ("%s",&kontonummer);  // wurde schon vorgeschlagen
             fscanf (datei, " ,%s ",&kontostand);  // wurde schon vorgeschlagen
             printf("%s",&kontostand);  // wurde schon vorgeschlagen
          }
          fclose (datei);
       }
       return;  // ungewöhnlich - warum?  
    }
    

    Warum gehst du die Sache nicht einfach an?
    Habt ihr denn kein Skript oder ein brauchbares Buch?

    Wenn es dir hilft, lass diesen optischen oder akustischen Schnickschnack erst mal weg. Hab es nicht getestet - stört wahrscheinlich nicht die Funktion.

    Die Lösung jetzt hier aus dem Stand gibt es nicht. Zeig das du das Geschriebene umsetzt.

    Im Netz gibt es hunderte von Beiträgen zu ähnlichen Aufgaben. Okay, nicht alle Ansätze sollte man da weiterverfolgen. 🙄



  • Schonaml drüber nachgedacht warum das Fließkommazahl und nicht nur Kommazahl heißt? Würdest Geld in Cent auch in ein float speichern? Weisst du überhaupt was der float Datentyp ist?

    Denk darüber nochmal nach.



  • Ich hoffe nicht das ein Finanzfachmann mit der Software arbeiten soll.
    Also würde ich das mit dem Fliesskomma erst mal als nachrangig ansehen.

    Natürlich können wir hier die Idealvorstellung eines perfekten Quelltextes haben, aber ist ein Programmieranfänger mit dem Ideal nicht überfordert? Gibt es das Ideal überhaupt? Wenn ja, warum dann die neuen Konferenzen zum kommenden C-Standard?

    Zum C-Standard und dem Quelltext zurück:

    void main (void)
    

    war nie Teil des C-Standard.

    int main (void)
    

    ist vom Standard da okay.



  • Das ist der neue Void-C Standard von 2020. Kurz VC-20
    Nur noch globale Variablen.

    Ach Mist, das ist dann ja das Basic V2.0



  • Da Microsoft ja an der
    void - Variante festhält, ist ja für die Zukunft nichts auszuschliessen. 🙄

    Aber bis zum nächsten C-Standard haben wir ja noch Zeit 👍

    Und was immer da kommt, unser erste Bundeskanzler sagte:
    "Was kümmert mich mein Geschwätz von gestern." 😃



  • Da schließt sich dann der Kreis. Das Basic V2.0 ist auch von Microsoft 😃



  • Ich glaube ich werde mich erstmal durch das Forum hangeln. Hatte die Suche ja auch schon benutzt aber leider nichts wirklich brauchbares gefunden.

    Der große Knackpunkt ist:
    Die Aufgabe vom Prof ist, eine Datenbank für eine Bank zu erstellen wobei alle Leute aus dem Semester die gleiche Aufgabe haben. Jeder soll sich nur Gedanken machen wie er sich von der Masse absetzen kann. (Deshalb Farblicher Schnick Schnack und Musik). Da Diese Zusatzfunktionen funktionieren und die Ein- und Ausgabe nicht beeinflussen, habe ich diese dringelassen.
    Desweiteren steht in der Aufgabenstellung: Da nicht alle nötigen Befehle/ Funktionen in einem Semester behandelt wurden, ist es sehr zu empfehlen bei etwaigen Problemen alle möglichen Informationsquellen zu durchsuchen. Deswegen dachte ich mir ich frage einfach mal hier nach.
    Funktionen wie goto scanf und printf standen so im script deswegen dachte ich, kann ich das einfach übernehmen.
    Aber trotzdem Danke für eure Hilfe
    mfg
    eric



  • Du solltest in die Schulbibliothek gehen und dir ein Buch über C ausleihen.

    Du kannst gerne nach allen möglichen Funktionen im Internet suchen.
    Nur wenn du nicht weisst, wie du sie anwenden musst, bringt das gar nichts.

    scanf und printf sind schon in Ordnung, nur musst du die auch richtig verwenden.
    Die verschiedenen Formatspecifier haben schon ihren Sinn und die Funktionen sind auch unterschiedlich in ihrem Aufruf.

    goto dagegen ist böse. Einige sind strikt dagegen, andere tolerieren es eher, aber
    es gibt i.A ganz wenige Probleme in denen goto toleriert wird.
    Es versaut die Programmstruktur. Keiner kann mehr richtig nachvollziehen wo der Programmfluß lang geht.


Anmelden zum Antworten