Personendaten



  • chrische5 schrieb:

    Hallo

    Caipi schrieb:

    CStoll (off) schrieb:

    [...]
    PS: Ein Makro ist eine #define Deklaration am Anfang des Programms [...]

    Nicht zwangsläufig am Anfang des Programmes. 😉

    Gruß Caipi

    In der Regel schreibt man es aber schon an den Anfang, oder? Ich finde, dass macht es einfach übersichtlicher.

    Jup. Das ist korrekt. (Man beachte auch den ";)"-Smiley* im entsprechenden Posting.

    *Steht für Korintenkack.

    Gruß Caipi



  • Hallo

    JaJa hatte ich schon gelesen. Ich wollte nur mal mit meinem Wissen auf den Putz hauen. 😉

    chrische



  • Caipi schrieb:

    CStoll (off) schrieb:

    [...]
    PS: Ein Makro ist eine #define Deklaration am Anfang des Programms [...]

    Nicht zwangsläufig am Anfang des Programmes. 😉

    Gruß Caipi

    OK, dann eben "im Quelltext des Programms" - zufrieden?

    Aber normalerweise kommt so ein Makro recht weit oben hin - außer es wird nur lokal benötigt, dann kann es irgendwo auftauchen.



  • zu CStoll:

    Als nächstes solltest du dir eine Funktion erstellen, die einen Index (0..99) bekommt und das Array-Element an dieser Stelle einliest (jede Member-Variable einzeln aus cin) bzw. ausgibt (jeden Member über cout).

    meinst du sowas??
    anzahl_Personen [0,1,2,3,4,5,6.....,98,99);
    wenn ich da 100 personen speichern will muss ich dann 100 mal cin und cout schreiben???

    und zu dem
    int geb_j [4]; //geburtsjahr
    da reservier ich doch 4 speicherplätz für das geburtsjahr oder??
    z.B. 1982 das sind doch 4 ziffern.

    und könntest du bitte das mit dem einfügen, löschen und bearbeiten etwas genauer erklären wie gesagt ich bin ein anfänger 🙂

    danke schonmal



  • Ich meinte etwas in der Form:

    void Eingabe(int index)
    {
      //füllt den Datensatz personen[index]
    }
    

    Dann kannst du in einer for()-Schleife von 0 bis 99 gehen und jeweils Eingabe(i) aufrufen.

    int geb_j [4]; //geburtsjahr
    da reservier ich doch 4 speicherplätz für das geburtsjahr oder??
    z.B. 1982 das sind doch 4 ziffern.

    Eine int-Zahl hat Platz für Werte bis ca. 32000, da reicht ein einzelner Wert für jedes vorstellbare Geburtsdatum - du reservierst dir ein Array für 4 int-Werte und das ist etwas Overkill 😉

    @Funktionsweisen: Irgendwo hier (oder war's im C-Board?) schwirren noch Fragmente eines anderen Programms rum, das sich mit so einer Listen-Verarbeitung beschäftigt hat.

    PS: In C++ solltest du eher strings (da brauchst du dir keine Gedanken um die Länge) und STL-Container (die kümmern sich selber um Einfügen, Löschen,...) nehmen als das per Hand zu schreiben.



  • ich hab gehört is bissel schwul in nem array n eintrag wieder zu löschen und wieder hinzuzufügen etc ^^

    also wenn scho c++ wieso dann kein container wie

    #include <list>
    
    list<personen_struct> listederpersonen;
    

    ?

    mfg blan



  • vielen vielen dank für eure hilfe. ich versuche es jetzt mal und wenn es nicht klappt melde ich mich nochmal



  • Hi
    ich bins nochmal also ich habe gemacht:

    #include<iostream>
    #include<stdio.h>
    #include<conio.h>
    #define groesse 100

    struct personendaten
    {
    char pn [10];
    char vn [20];
    char nn [20];
    char gt [2];
    char gm [2];
    char gj [4];
    char str[40];
    char hnr [5];
    char plz[8];
    char ort[40];
    char lcode[5];
    char land[40];
    };

    personendaten person[groesse];
    char name[16]="Personennummer:";
    char name1[9]="Vorname:";
    char name2[10]="Nachname:";
    char name3[12]="Geburtstag:";
    char name4[14]="Geburtsmonat:";
    char name5[13]="Geburtsjahr:";
    char name6[9]="Strasse:";
    char name7[12]="Hausnummer:";
    char name8[5]="Plz:";
    char name9[5]="Ort:";
    char name10[11]="Land-Code:";
    char name11[6]="Land:";
    int i,anzahl;

    int eingabe()
    {
    printf ("Anzahl der zu erfassenden Personen: ");
    scanf("%d", &anzahl);
    for (i=0;i<anzahl;i++)
    {
    printf ("Personennummer : ");
    cin >> person[i].pn;
    printf ("Vorname : ");
    cin >> person[i].vn;
    printf ("Nachname : ");
    cin >> person[i].nn;
    printf ("Gerburtstag : ");
    cin >> person[i].gt;
    printf ("Geburtsmonat : ");
    cin >> person[i].gm;
    printf ("Geburtsjahr : ");
    cin >> person[i].gj;
    printf ("Strasse : ");
    cin >> person[i].str;
    printf ("Hausnummer : ");
    cin >> person[i].hnr;
    printf ("PLZ : ");
    cin >> person[i].plz;
    printf ("Ort : ");
    cin >> person[i].ort;
    printf ("Land-Code : ");
    cin >> person[i].lcode;
    printf ("Land : ");
    cin >> person[i].land;
    }

    int anzeigen()
    {
    for (i=0;i<anzahl;++i)
    {
    cout <<" Personennnummer: "<< person[i].pn<<endl;
    cout <<" Vorname: "<< person[i].vn<<endl;
    cout <<" Nachname: "<<person[i].nn<<endl;
    cout <<" Geburtstag: "<<person[i].bt<<endl;
    cout <<" Geburtsmonat: "<<person[i].gm<<endl;
    cout <<" Geburtsjahr: "<<person[i].gj<<endl;
    cout <<" Strasse: "<<person[i].str<<endl;
    cout <<" Hausnummer: "<<person[i].hnr<<endl;
    cout <<" PLZ: "<<person[i].plz<<endl;
    cout <<" Ort: "<<person[i].ort<<endl;
    cout <<" Land-Code: "<<person[i].lcode<<endl;
    cout <<" Land: "<<person[i].land<<endl;
    getch();
    }
    }
    return 0;
    system ("pause");
    }

    ich bekomme aber fehlermeldungen da steht:
    In function int eingabe()':cin' undeclared (first use this function)
    (Each undeclared identifier is reported only once for each function it appears in.)
    expected primary-expression before "int"
    expected `;' before "int"

    und stimmt das mit dem define so??
    und oben habe ich printf und cin genommen weil ich ein änliches programm gefunden habe und der der es geschrieben hat hat es so gemacht hat.

    würde mich auf antworten freuen.

    mfg
    Jambe66



  • cin gehört zu
    [cpp]#include <iostream**.h**>
    [/cpp]



  • Hallo

    poroblem schrieb:

    cin gehört zu
    [cpp]#include <iostream**.h**>
    [/cpp]

    Das ist Quatsch.

    Du kannst es natürlich auch nutzen, wenn du mit iostream ohne h arbeitest. Das solltest du auch auf jeden Fall tun, weil es der aktuelle Standard vorschreibt. Wenn du aber mit iostream arbeitest musst du den namespace std bentzen. Dazu gibt es zwei Möglichkeit:

    am Anfang des Programms:

    using namespace std;
    

    schreiben oder vor so:

    std::cin
    

    chrische



  • da ich auch grad etwas c++ über hab ich mal das eingeben/anzeigen gemacht, allerdings nur fuer den namen:

    #include <iostream>
    #include <string>
    //DEV-C++ 4.9.9.2
    using namespace std;
    struct T_person {
       int pnr;
       string nname;
    };
    const int kgroesse = 100;
    
    T_person person[kgroesse];
    
    int find_frei(){ // naechsten freien platz finden(name > leer
       for (int i=0;i<kgroesse;i++) 
          if (person[i].nname=="") return i;
       return -1;      
    }
    void anzeige_person() { // alle personen anzeigen
       system("cls");
       cout<<"Anzeige Daten\n\n";
       for (int i=0;i<kgroesse;i++) 
          if (person[i].nname>"") {
             cout<<"pers.nr....:"<<person[i].pnr<<endl;  
             cout<<"Name.......:"<<person[i].nname<<endl<<endl;  
       }
       system("pause");
    }
    
    void eingabe_person () { // eine neue person anlegen
       T_person wperson; // temp var
       while (true) {
          cout<<"Name ? (leer=Ende)\n";
          getline(cin,wperson.nname);
          if (wperson.nname=="") break;
          int frei=find_frei();
          if (frei==-1) { // ungueltige index heisst fehler, voll
             cout<<"tabelle voll !\n";
             break;
          }
          person[frei].pnr=frei;
          person[frei].nname=wperson.nname;
       }
       return;
    }
    
    int ausgabe_menue() {
       int wahl=0;
       while (wahl==0) {
          system("cls");
          cout<<"1 - Anzeigen Daten\n";
          cout<<"2 - neuen Partner anlegen\n";
          cout<<"3 - Partner aendern\n";
          cout<<"4 - Partner loeschen\n";
          cout<<"9 - Ende\n";
          cin>>wahl; cin.ignore();// enter aus cin buffer loeschen
          system("cls");
          if (wahl==9) break;
          if (wahl>4) { //fehler
             wahl=0; cout<<"falsche eingabe\n\n";
          }
          else break;
          system("pause");
       }
       return wahl;
    }
    
    int main() {
       while (true) {
          int wahl=ausgabe_menue();
          if (wahl==9) break;
          switch (wahl) {
             case 1: anzeige_person(); break;
             case 2: eingabe_person (); break;
             case 9: break;
          }
       }
       return 0;   
    }
    


  • an kermit1
    erstmal vielen vielen dank für die mühe. das hat mir sehr geholfen.
    ich habe da aber noch ein paar fragen an dich.

    für was ist die funktion
    int find_frei()

    und was bedeutet das
    return -1??
    und das frei
    person[frei].pnr=frei;??
    und das programm erhöht die personalnummer automatisch um 1 ich muss aber die personalnummer selber eingeben können.

    du hast das programm ja nur für personalnummer und für den namen gemacht.
    ich brauche aber noch strasse und solche sachen . wo muss ich die dann da eintragen??

    und das programm löscht ja immer nur den zuletzt eingegebenen eintrag. kann ich da auch geziel löschen??

    vielen vielen dank nochmal für deine hilfe
    und hoffentlich macht es dir nix aus das ich soviele fragen stelle ich bin ein anfänger und hab fast null ahnung 🙂 🙂



  • hi,

    also,

    die funktion find_frei liefert den index des naechsten freien platzes im array zurueck. ( wenn mal eine loesch funktion da ist, koennen ja luecken im array entstehen )

    die -1 heisst, dass es keinen freien platz mehr gibt ( damit man es von einem gültigen wert unterscheiden kann )

    die personal nummer hab ich einfach mit dem index belegt, die kann man aber genausogut in der eingabe routine eingeben lassen:

    cin>>wperson.pnr; und
    person[frei].pnr=wperson.pnr;

    eine loeschroutine hab ich noch gar nicht eingebaut, etwas sollte ja noch fuer dich übrig bleiben 😉 ( da muesste man dann nur den namen der gewuenschten nr ( index oder person. Nr) loeschen, bzw auf leerstring setzen )

    die anderen felder muss man nur in der structur ergaenzen:
    struct T_person {
    int pnr; // ⚠ achtung int geht nur bis ca. 32000 !
    string nname;
    string vorname;
    string strasse;
    ...(usw.)
    };

    hoffe das hilft dir etwas... 😉



  • danke du bist meine rettung 🙂 🙂

    muss ich
    string vorname;
    string strasse;
    usw.
    nicht noch in void eingabe oder void anzeigen schreiben??
    vielleicht könntest du mir ja einen tipp zu der funktion löschen geben 😃

    vielen dank nochmal



  • muss ich
    string vorname;
    string strasse;
    usw.
    nicht noch in void eingabe oder void anzeigen schreiben??

    ja natuerlich, genau so wie person[i].name ...

    meine loeschfunktion:

    void loesch_person () { // eine person loeschen
       string str;int i;
       while (true) {
          system("cls");
          cout<<"welche Nr. soll geloescht werden ? (leer=Ende)\n";
          getline(cin,str); 
          if (str=="") break; // endlos schleife beenden
          int suchnr=atoi(str.c_str()); // string in int umwandeln
          if (suchnr < 1 || suchnr > 320000 ) {   
             cout<< "personal nr ungueltig\n ";
             system("pause");
             continue; // weiter an anfang while schleife
          }
          for (i=0;i< kgroesse;i++ ) // nach personal nr suchen
             if ( person[i].pnr ==suchnr ) {
                person[i].nname=""; // name loeschen reicht
                cout<<"Pers nr.: "<<suchnr<<" geloescht\n";
                break;  // for schleife beenden
             }
          if (i>=kgroesse) // wenn i am ende, dann nicht gefunden
                cout<<"Pers nr.: "<<suchnr<<" nicht gefunden\n";
          system("pause");
       }
       return;
    }
    

    aber vom reinen kopieren lernt man nix 🙂 , bastel mal selber ein wenig am code, also z.bsp. an einer routine zum ändern...



  • ich weiß am kopieren lerne ich nix aber ich steht zur zeit unter druck in ich verstehe fast nix. 🙂

    ich danke dir für deine mühe nochmal.



  • void eingabe_person () { // eine neue person anlegen
       T_person wperson; // temp var
       while (true) {
          cout<<"Name ? (leer=Ende)\n";
          getline(cin,wperson.nname);
          cout<<"Geburtsdatum ?\n";
          getline(cin,wperson.geb); //int
          cout<<"Strasse ?\n";
          getline(cin,wperson.str);
          cout<<"Hausnummer ?\n";
          getline(cin,wperson.hnr); //int
          cout<<"PLZ ?\n";
          getline(cin,wperson.plz); //int
          cout<<"Ort ?\n";
          getline(cin,wperson.ort);
          cout<<"Land-Code ?\n";
          getline(cin,wperson.lcode); //int
          cout<<"Land ?\n";
          getline(cin,wperson.land);
    
          if (wperson.nname=="") break;
          int frei=find_frei();
          if (frei==-1) { // ungueltige index heisst fehler, voll
             cout<<"tabelle voll !\n";
             break;
          }
          person[frei].pnr=frei;
          person[frei].nname=wperson.nname;
          person[frei].geb=wperson.geb;
          person[frei].str=wperson.str;
          person[frei].hnr=wperson.hnr;
          person[frei].plz=wperson.plz;
          person[frei].ort=wperson.ort;
          person[frei].lcode=wperson.lcode;
          person[frei].land=wperson.land;
       }
       return;
    }
    

    bei den ganzen int deklarationen in der while schleife kommt bei mir ein fehler:
    no matching function for call to `getline(std::istream&, int&)'

    ich habe ein paar sachen probiert da zeigt es keinen fehler an aber dann spinnt das programm irgendwie



  • die funktion getline(cin,...) erwartet einen string, da kannst du keine int variable übergeben. mach es so wie oben steht:

    getline(cin,str);
          int suchnr=atoi(str.c_str()); // string in int umwandeln
    

    das koennte man auch in eine funktion auslagern

    int getInt ( ) {
       int erg;string str;
       getline(cin,str);
       erg=atoi(str.c_str());
       return erg;
    }
    // und dann aufrufen mit:
       int i=getInt();
    

    liefert allerdings bei leerstring eine 0, dass muesste man noch abfangen...



  • hab grad gesehen:

    cout<<"Geburtsdatum ?\n";
          getline(cin,wperson.geb); //int
    

    das wird auch nicht gehen, int geht nur bis +32767, nimm lieber auch string als datentyp.

    es gibt zwar auch spezielle typen fuer datums felder, aber wenn du mit dem datum nix weiter machen willst, reicht string...



  • kermit1 schrieb:

    ..., int geht nur bis +32767,...

    Das ist heutzutage aber schon sehr selten. Auf was für nem Betriebssystem
    arbeitest du denn. 😕


Anmelden zum Antworten