Strukturen unter C



  • Hallo Freunde,

    Ich schreibe demnächst in C meine Klausur und bin am lernen..
    Auf einem Arbeitsblatt wird folgende Aufgabenstellung formuliert:

    Programm zur Bearbeitung personenbezogener Daten schreiben!
    a) Struktur definieren
    struct person { ... };
    Informationen für eine Person:(Name,Vorname,Telefonnummer,Geburtsdatum)!
    Dabei soll folgende Strukturdefinition für Datum verwendet werden:
    struct s_datum { int tag,monat,jahr; };

    Das ist erst der erste Teil. Ich habe soweit versucht diese Daten einzulesen und sie zur Kontrolle auszgeben. Soweit habe ich es auch geschafft, nur geschieht etwas sehr seltsames bei dem Einleseprozess.

    Zunächst mal mein Programmcode:

    #include <stdio.h>
    
    main(){
    	  //Deklaration einer Struktur
    	  struct s_person{
    	  char Name;
    	  char Vorname;
    	  int Telefonnummer;
    	  struct s_datum{
    		  int Tag;
    		  int Monat;
    		  int Jahr;  
    		  }s_datum;
    	  }s_person;
    
    	  //Eingabe
    	  printf("Bitte geben Sie Ihren Namen ein:\n");
    	  scanf("%c",&(person.Name));	  
    	  printf("Bitte geben Sie ihren Vornamen ein:\n");
    	  scanf("%c",&(person.Vorname));
    	  printf("Bitte geben Sie ihre Telefonnummer ein:\n");
    	  scanf("%d",&(person.Telefonnummer));
    	  printf("Nun Ihr Geburtsdatum(TT.MM.JJ):\n");
    	  scanf("%d",&(person.datum.Tag));
    	  scanf("%d",&(person.datum.Monat));
    	  scanf("%d",&(person.datum.Jahr));
    
    	  //Ausgabe
    	  printf("Ihr Name: %c\n",person.Name);
    	  printf("Ihr Vorname: %c\n", person.Vorname);
    	  printf("Ihre Telefonnummer: %d\n",person.Telefonnummer);
    	  printf("Ihr Geburtsdatum: %d.%d.%d\n",person.datum.Tag,person.datum.Monat,person.datum.Jahr);
    }
    

    Beim kompilieren bekomm ich keinerlei Fehlermeldungen. Aber bei dem Einleseprozess liest er mir das erste(also den Namen) ein und den Rest nicht mehr und springt zu den Ausgaben. Wenn ich die Eingabe bei dem Namen kurz halte, springt er zur Eingabe der Telefonnummer und des Geburtsdatums.

    Woran kann das liegen? Hat jemand eine Idee?



  • http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

    Da sind aber noch ein paar andere nicht übliche Sachen in deinem Quelltext.
    Soll das so?

    MfG f.-th.



  • muss bei scanf ein "%s" hin anstelle "%c"?

    Wenn du mir sagen kannst welche Art von nicht übliche Dinge, kann ich dir sagen ob es so sein soll, oder nicht 🙂



  • Hallo,

    habe den Code nun mal geändert:

    #include <stdio.h>
    
    main(){
    	  //Deklaration einer Struktur
    	  struct person{
    	  char Name;
    	  char Vorname;
    	  int Telefonnummer;
    	  struct datum{
    		  int Tag;
    		  int Monat;
    		  int Jahr;  
    		  }s_datum;
    	  }person;
    
    	  //Eingabe
    	  printf("Bitte geben Sie Ihren Namen ein:\n");
    	  scanf("%s",&(person.Name));	
    
    	  printf("Bitte geben Sie ihren Vornamen ein:\n");
    	  scanf("%s",&(person.Vorname));
    
    	  printf("Bitte geben Sie ihre Telefonnummer ein:\n");
    	  scanf("%d",&(person.Telefonnummer));
    
    	  printf("Nun Ihr Geburtsdatum(TT.MM.JJ):\n");
    	  scanf("%d",&(person.datum.Tag));
    	  scanf("%d",&(person.datum.Monat));
    	  scanf("%d",&(person.datum.Jahr));
    
    	  //Ausgabe
    	  printf("Ihr Name: %s\n",person.Name);
    	  printf("Ihr Vorname: %s\n", person.Vorname);
    	  printf("Ihre Telefonnummer: %d\n",person.Telefonnummer);
    	  printf("Ihr Geburtsdatum: %d.%d.%d\n",(person.datum.Tag),(person.datum.Monat),(person.datum.Jahr));
    }
    

    Zwar bekomm ich folgende Warning: "warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int'", die weiterhin "nicht schlimm" ist aber passiert schlimmeres.

    Nach Eingabe aller Daten kommt ein "Segmentation fault", was vorher nicht der Fall war..



  • Hallo

    struct s_person{
          char Name;
          char Vorname;
          int Telefonnummer;
          struct s_datum{
              int Tag;
              int Monat;
              int Jahr;  
              }s_datum;
          }s_person;
    

    schau dir mal deine struct an
    (spez Name und Vorname)

    Mfg
    Klaus



  • sollte ich eher Name[] und Vorname[] deklarieren?



  • Student123 schrieb:

    sollte ich eher Name[] und Vorname[] deklarieren?

    Sofern du nicht nur Personen kennst die A, B, C... heißen. Ja!!!



  • Hey,

    danke euch! Hat alles bestens gepasst!!
    Jetzt habe ich ein weiteres Problem aber..

    Unzwar habe ich folgendes mit struct deklariert:

    #include <stdio.h>
    
    main(){
    	  //Deklaration einer Struktur
    	  struct BankDaten{
    	  char Name[20];
    	  char Zuname[20];
    	  int Telefonnummer;
    	  int Kontonummer;
    	  int Kundennummer;
    	  float Kontostand;
    	  }; 
    
    	  //"normale" Deklaration
    	  int i;
    
    	  //eigene Deklarationen
    	  struct BankDaten mehrere_Kunden[10];
    }
    

    Wie ihr sehen könnt, habe ich 10 Felder mit "mehrere_Kunden" deklariert, welche ich in den nächsten Schritten füllen möchte. Dabei würde ich gerne in einer Schleife so vorgehen wollen, dass er für die erste Person alle in "BankDaten" vorhandenen Kriterien abarbeitet.

    Wenn ich beispielsweise in einer Schleife 10 Namen einlesen wollen würde, würde ich ja einfach die for-Schleife nutzen können:

    for(i = 0;i<10;i++){
    scanf("%s",&(mehrere_Kunden[i].Name))
    }
    

    Wie siehts aber aus, wenn ich vom ersten Kunden alle Kriterien einlesen möchte und anschließend zum zweiten wechsele?

    Liebe Grüße,

    Student.



  • Gewöhne dir mal die für Strings überflüssige Adressierung mit & nebst Klammerung ab, statt

    scanf("%s",&(mehrere_Kunden[i].Name))
    

    reicht

    scanf("%s",mehrere_Kunden[i].Name)
    

    völlig aus.
    Wenn du mehrere Werte in einer Zeile angibst, kannst du auch dies mit scanf erledigen:

    for(i = 0;i<10;i++)
    if( 6!=scanf("%s%s%d%d%d%f",k[i].Name,k[i].Zuname,&k[i].Telefonnummer,&k[i].Kontonummer,&k[i].Kundennummer,&k[i].Kontostand) )
      printf("\nfehlerhafte Angaben in Datensatz %d",i+1);
    

    Die Einzelwerte müssen dabei durch ein Standardtrennzeichen (z.B. Leerzeichen) getrennt eingegeben werden.



  • Hey,

    Danke dir für deine Antwort! Ja, das mit der Adressierung bei Strings ist mir schon klar, aber das ist der Standartfehler, welchen ich immer mache. Auch bei integer Werten vergess ich den öfters und deswegen habe ich mir einfach festgelegt, dass ich es immer benutzen werde mit der Hoffnung, dass es eines Tages feste sitzt 🙂

    Hm, dein Vorschlag sieht ganz gut aus aber gibt es da keinen eleganteren Weg? Also nichts gegen deinen Vorschlag, ist nur ne Frage 🙂

    Ich habe es mir eher im Form einer Schleife vorgestellt. Ansonsten könnte ich ja auch 6x mal hintereinander printf und scanf schreiben.. Ist ja nur eine Sache des "Copy-Paste".

    Ich schreibe demnächst meine erste Klausur an der Uni in C, die gleich von Assembler gefolgt wird. Alle Forenuser, die mir behilflich sind bei den Aufgaben, wissen gar nicht, welchen Gefallen sie mir tun!

    Vielen Dank an euch alle..



  • Was soll eine Schleife über die Strukturelemente bringen? Glaube mir, nichts außer zusätzliche Fehlerquellen.



  • Alles klar, dankeschön..
    Das sollte wohl eher mein kleineres Problem sein. Ich habe noch ein viel fetteres. Unzwar dieses:

    Ich habe folgende Aufgabenstellung, wovon ich eigentlich nur sehr wenig verstehe..
    Könntet ihr mir evtl. behilflich sein??

    Ein Dreieck besteht aus drei Punkten A,B,C. Folgende Struktur soll für "Punkt" realisiert werden:

    typedef struct Punkt
                    {
                        double x,y;
                    } Punkt;
    

    a) Struktur für "Dreieck" entwickeln

    Was genau darf ich darunter verstehen?



  • typedef struct PointStruct
    {
       double x,y;
    } Point;
    
    typedef struct DreieckStruct
    {
       Point a,b,c;
    } Dreieck;
    

    Das ist damit gemeint. Ein Dreieck hat 3 Punkte.



  • Ok, danke. Aber die Aufgabe wird immer unverständlicher sobald man sie weiter liest.

    unter b ist nänlich folgendes gefordert:

    b)Ein Unterprogramm "DreieckEingabe" schreiben. Das Unterprogramm soll die Strukturvariablen an das Hauptprogramm zurückgeben.
    

    Ich verstehe darunter folgendes:

    Ein Unterprogramm "DreieckEingabe" schreiben, welches die Punkte a,b,c einliest und anschließend per call-by-reference an das Hauptprogramm gibt.



  • Oder

    typedef struct PointStruct
    {
       double x,y;
    } Point;
    
    typedef struct DreieckStruct
    {
       Point p[3];
    } Dreieck;
    

    Je nachdem was dir passender erscheint.



  • Ja, du sollst eine Funktion schreiben, die den Benutzer zur Eingabe von 3 Punkten auffordert und das damit erstellte Dreieck mit call-by-reference an die main zurückgibt.



  • Hey Freunde,

    habe wieder einmal eine Frage und brauche eure Hilfe:

    Es geht um eine Aufgabe mit Strukturen..

    Hier die Aufgabenstellung:

    Ich habe hier folgendes verstanden:

    Ich solle eine Struktur "Point" in der Struktur "Dreieck" aufrufen und die Strukturvariablen nach Eingabe der Werte an das Hauptprogramm geben.

    Wie spreche ich die Strukturvariablen in einer Struktur an(bspw. der double Wert x von der Struktur "Point" welche in der Struktur "Dreieck" als A abgespeichert ist)?

    Noch wichtiger: Wie übergebe ich diese Werte per call-by-reference?

    Liebe Grüße..



  • Hattest du das nicht schon vor einigen Tagen gefragt (22:46:28 24.01.2011) ich hab gerade ein dickes Dejavu!

    Naja egal. Mit Pointer über -> ohne mit einem . . Weit bist du ja nicht gekommen... (Obwohl Dirk und ich dir schon zwei Möglichkeiten nannten.)

    Wie sieht denn dein Code aus?



  • Ich hatte so etwas ähnliches gefragt, stimmt. Die Aufgabenstellung war gleich bzw. die Sache ist gleich..

    Besonders weit bin ich nicht gekommen, das stimmt. Die Struktur in der Struktur und auch der Pointer ist kein problem, eher macht mir Sorgen die Übergabe an das Hauptprogramm..

    Wie würde bspw. der Prototyp aussehen?



  • void funktion(Dreieck *dreieck);
    Dreieck funktion();
    Dreieck* funktion();
    

    Erwartest du etwas anderes mystisches? Wie du möchtest kommt auf deinen Code an obwohl Variante 3 zu vermeiden ist.


Anmelden zum Antworten