Hilfe bei einem Programm



  • Guten Tag zusammen, ich bräuchte dringend eure Hilfe.
    Ich habe nämlich folgende aufgaben gestellt bekommen:
    a) Definieren Sie eine Struktur s_empList mit entsprechenden Komponenten und definieren
    Sie einen Datentyp t_empList für Zeiger auf s_empList.
    b) Schreiben Sie eine Funktion new_employee, die einen Eintrag für einen neuen Angestellten
    am Anfang der Liste einfügt. Die Eingabeparameter sind ein Zeiger auf den Listenanfang
    und ein Zeiger auf das einzufügende Element. Die Funktion soll einen Zeiger auf den
    Anfang der aktualisierten Liste zurück geben.
    c) Schreiben Sie eine Funktion search_employee, die nach dem Namen eines Angestellten
    in der Liste sucht. Wenn ein entsprechender Eintrag gefunden wurde, dann sollen die
    Personalnummer und das Einkommen des Angestellten angezeigt werden. Darüber hinaus
    soll der Eintrag mit seinem Vorgänger vertauscht werden, um so künftige Zugriffszeiten
    auf häufig gesuchte Personen zu reduzieren.

    Nun a und b habe ich wie folgt gelöst:

    #include <stdio.h>
    #include <stdlib.h>
    struct s_emplist{
    int nr; // Personalnummer
    char fname[50]; // VorName des Mitarbeiters
    char lname[50]; // NachnameName des Mitarbeiters
    float salary; // Einkommen
    struct s_emplist next; // Zeiger auf nachfolger
    };
    typedef struct s_emplist t_emplist; // neuer Datentyp: Zeiger auf parts
    // Liste ausgeben
    t_emplist allocate(void){
    t_emplist elp;
    elp=(t_emplist)malloc(sizeof(elp));
    if(elp==NULL){printf("Error malloc"); exit(1);}
    elp->next=NULL;
    return elp;
    }
    void printlist(t_emplist elp){
    printf("\n
    ********************************\n");
    while(elp!=NULL) {
    printf("Personalnummer: %u\n",elp->nr);
    printf("Vorname: %s\n",elp->fname);
    printf("Nachname: %s\n",elp->lname);
    printf("Gehalt: %.2f\n",elp->salary);
    elp=elp->next;
    }
    printf("***********************************\n");
    return;
    }

    int main(){
    unsigned int op; // Men¨u-Option
    t_emplist s_emplist=NULL; // Zeiger auf Listenanfang
    t_emplist elp;
    do{
    printf("\n 1) Neuen Angestellten eingeben " );
    printf("\n 2) Liste anzeigen " );
    printf("\n 3) STOP \n" );
    scanf("%u",&op);
    switch(op){
    case 1:
    elp=allocate(); // Speicher bereitstellen
    printf("\n Personalnummer: "); scanf("%d",&(elp->nr)); // Personalnummer einlesen
    printf(" Vorname: "); scanf("%s",elp->fname); // Name des Mitarbeiters einlesen
    printf(" Nachname: "); scanf("%s",elp->lname); // Name des Mitarbeiters einlesen
    printf(" Gehalt: "); scanf("%f",&(elp->salary)); // Gehalt einlesen
    elp->next=s_emplist; // neues Element am Listenanfang einf¨ugen
    s_emplist=elp; // partslist auf das neue Anfangselement zeigen lassen
    break;
    case 2: printlist(s_emplist); break;
    }
    }while(op!=3);
    return 0;
    }

    Nur habe ich für C keinen Ansatz noch eine Idee wie ich das angehen soll.. 👎
    Könnt ihr mir helfen?



  • Nun, b hast du schon mal falsch umgesetzt.
    Du sollst dafür eine eigene Funktion schreiben und nicht alles in main machen.

    c besteht ja nun aus mehreren Teilaufgaben(suchen, anzeigen, tauschen). Was bereitet dir da Probleme?

    Da du leider keine code-Tags verwendet hast (damit bleibt die Einrückung erhalten), ist das Lesen von deinem Code schwierig.



  • Hmm wie ich b in einer eigenen Funktion schreibe, ist mir auch nicht ganz klar (blutiger Anfänger). Bei c) versteh ich nicht wie ich etwas suche, und dazu noch wenn ich beispielsweise nach dem Namen suche wie mir alles von der Person angezeigt wird.. vertauschen klappt, aber die anderen zwei Punkte überfordern mich..



  • Also ein Ansatz wäre ja dies;
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    struct s_emplist{...};
    typedef ... t_emplist;

    ... new_employee(...){...}
    ... search_employee(...){...}

    void printlist(t_emplist elp){
    printf("\n***********************************\n");
    while (elp) {
    printf("Vorname: %s\n",elp->forename);
    printf("Nachname: %s\n",elp->surname);
    printf("PersNr.: %u\n",elp->persnr);
    printf("Einkommen: %.2f\n",elp->salary);
    elp = elp->next;
    }
    printf("***********************************\n");
    }

    int main(void){
    t_emplist emplist=NULL,elp;
    char forename[64],surname[64];
    unsigned int op;
    do{
    printf("\n Waehlen Sie einen Menuepunkt: \n");
    printf("\n 1) Neuer Angestellter");
    printf("\n 2) Suche Angestellten");
    printf("\n 3) Liste anzeigen");
    printf("\n 4) STOP \n");
    scanf("%u",&op);
    switch(op){
    case 1:
    elp=(t_emplist)malloc(sizeof(*elp));
    printf("\n Vorname: ");scanf("%63s",elp->forename);
    printf(" Nachname: ");scanf("%63s",elp->surname);
    printf(" Personalnummer: ");scanf("%u",&(elp->persnr));
    printf(" Einkommen: ");scanf("%f",&(elp->salary));
    ... ;
    break;
    case 2:
    printf("\n Vorname: ");scanf("%63s",forename);
    printf(" Nachname: ");scanf("%63s",surname);
    ... ;
    break;
    case 3:
    printlist(emplist);
    break;
    }
    }while(op!=4);
    return 0;

    Nur habe ich keinen Schimmer, wie das funktionieren soll... (Anfänger eben)
    }



  • vlajit90 schrieb:

    Hmm wie ich b in einer eigenen Funktion schreibe, ist mir auch nicht ganz klar (blutiger Anfänger). Bei c) versteh ich nicht wie ich etwas suche, und dazu noch wenn ich beispielsweise nach dem Namen suche wie mir alles von der Person angezeigt wird.. vertauschen klappt, aber die anderen zwei Punkte überfordern mich..

    Komisch, in printlist kommst du an alle Namen und auch an die anderen Einträge ran.
    Und das ist eine Funktion.
    malloc ist übrigens auch eine Funktion. Der übergibst du Werte und du bekommst auch etwas zurück, das du z.B. in einer Variablen speicherst.

    Deine Personalnummer ist vom Typ signed int , du liest aber mit dem Formatspecifier für unsigned int ein

    Da hast immer noch keine code-Tags verwendet:
    Code mit der Maus markieren und auf den C-Button unter dem 😡 klicken.
    Nutze auch die Vorschau
    (Und dann bitte den ganzen relevanten Code)



  • #include <stdio.h> 
    #include <stdlib.h> 
    struct s_emplist{ 
    int nr; // Personalnummer 
    char fname[50]; // VorName des Mitarbeiters 
    char lname[50]; // NachnameName des Mitarbeiters 
    float salary; // Einkommen 
    struct s_emplist *next; // Zeiger auf nachfolger 
    }; 
    typedef struct s_emplist *t_emplist; // neuer Datentyp: Zeiger auf parts 
    // Liste ausgeben 
    t_emplist allocate(void){ 
    t_emplist elp; 
    elp=(t_emplist)malloc(sizeof(*elp)); 
    if(elp==NULL){printf("Error malloc"); exit(1);} 
    elp->next=NULL; 
    return elp; 
    } 
    void printlist(t_emplist elp){ 
    printf("\n***********************************\n"); 
    while(elp!=NULL) { 
    printf("Personalnummer: %d\n",elp->nr); 
    printf("Vorname: %s\n",elp->fname); 
    printf("Nachname: %s\n",elp->lname); 
    printf("Gehalt: %.2f\n",elp->salary); 
    elp=elp->next; 
    } 
    printf("***********************************\n"); 
    return; 
    } 
    
    int main(){ 
    unsigned int op; // Men¨u-Option 
    t_emplist s_emplist=NULL; // Zeiger auf Listenanfang 
    t_emplist elp; 
    do{ 
    printf("\n 1) Neuen Angestellten eingeben " ); 
    printf("\n 2) Liste anzeigen " ); 
    printf("\n 3) STOP \n" ); 
    scanf("%u",&op); 
    switch(op){ 
    case 1: 
    elp=allocate(); // Speicher bereitstellen 
    printf("\n Personalnummer: "); scanf("%d",&(elp->nr)); // Personalnummer einlesen 
    printf(" Vorname: "); scanf("%s",elp->fname); // Name des Mitarbeiters einlesen 
    printf(" Nachname: "); scanf("%s",elp->lname); // Name des Mitarbeiters einlesen 
    printf(" Gehalt: "); scanf("%f",&(elp->salary)); // Gehalt einlesen 
    elp->next=s_emplist; // neues Element am Listenanfang einf¨ugen 
    s_emplist=elp; // partslist auf das neue Anfangselement zeigen lassen 
    break; 
    case 2: printlist(s_emplist); break; 
    } 
    }while(op!=3); 
    return 0; 
    }
    

    Ok das ist ja meine "Lösung" für a und b... generell funktioniert alles wie es soll, aber wie ich b) außerhalb der Main schreibe, da bräuchte ich Hilfe.
    Für Teil c) wäre der Ansatz dann ja dieser:

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    struct s_emplist{...}; 
    typedef ... t_emplist; 
    
    ... new_employee(...){...} 
    ... search_employee(...){...} 
    
    void printlist(t_emplist elp){ 
    printf("\n***********************************\n"); 
    while (elp) { 
    printf("Vorname: %s\n",elp->forename); 
    printf("Nachname: %s\n",elp->surname); 
    printf("PersNr.: %u\n",elp->persnr); 
    printf("Einkommen: %.2f\n",elp->salary); 
    elp = elp->next; 
    } 
    printf("***********************************\n"); 
    } 
    
    int main(void){ 
    t_emplist emplist=NULL,elp; 
    char forename[64],surname[64]; 
    unsigned int op; 
    do{ 
    printf("\n Waehlen Sie einen Menuepunkt: \n"); 
    printf("\n 1) Neuer Angestellter"); 
    printf("\n 2) Suche Angestellten"); 
    printf("\n 3) Liste anzeigen"); 
    printf("\n 4) STOP \n"); 
    scanf("%u",&op); 
    switch(op){ 
    case 1: 
    elp=(t_emplist)malloc(sizeof(*elp)); 
    printf("\n Vorname: ");scanf("%63s",elp->forename); 
    printf(" Nachname: ");scanf("%63s",elp->surname); 
    printf(" Personalnummer: ");scanf("%u",&(elp->persnr)); 
    printf(" Einkommen: ");scanf("%f",&(elp->salary)); 
    ... ; 
    break; 
    case 2: 
    printf("\n Vorname: ");scanf("%63s",forename); 
    printf(" Nachname: ");scanf("%63s",surname); 
    ... ; 
    break; 
    case 3: 
    printlist(emplist); 
    break; 
    } 
    }while(op!=4); 
    return 0; 
    }
    

    Und hier komm ich eben nicht weiter...



  • Ach, und bei c) gab es einen Hinweis, dass wir mit den Befehlen strcpy und strcmp arbeiten sollen/können. Ich weiß zwar in etwa was diese machen, aber inwiefern mir die Befehle wo helfen... keine Ahnung



  • vlajit90 schrieb:

    aber wie ich b) außerhalb der Main schreibe, da bräuchte ich Hilfe.

    Erweitere deine Funktion allocate und übergib ihr die einzelnen Daten.
    Die musst du dann aber vorher in extra lokale Variablen einlesen.

    t_emplist allocate(char *vorname, char *nachname, ..) {
    
    }
    

    vlajit90 schrieb:

    Für Teil c) wäre der Ansatz dann ja dieser:

    Weißt du, wie man Strings in C vergleicht?

    void printlist(t_emplist elp, char *name){
      printf("\n***********************************\n");
      while(elp!=NULL) {
        wenn (fname gleich name) {
          printf("Personalnummer: %d\n",elp->nr);
          printf("Vorname: %s\n",elp->fname);
          printf("Nachname: %s\n",elp->lname);
          printf("Gehalt: %.2f\n",elp->salary);
        }
        elp=elp->next;
      }
    }
    

    Das ist nur ein Beispiel und kein fertiger, für dich nutzbarer Code

    PS. Dein Einrückungsstil ist scheiße grauenvoll, da nicht vorhanden.



  • vlajit90 schrieb:

    Ach, und bei c) gab es einen Hinweis, dass wir mit den Befehlen strcpy und strcmp arbeiten sollen/können. Ich weiß zwar in etwa was diese machen, aber inwiefern mir die Befehle wo helfen... keine Ahnung

    Dann mach dich mal schlau: http://www.cplusplus.com/reference/cstring/



  • Strings vergleicht man ja mit strcmp... ist mir ja bis dahin klar. Das Problem ist, dass ich keine Idee hab wie ich den Befehl dann verwende, bzw. wie die Funktion aussehen muss. Ich würde es halt so machen, dass ich den Eintrag suche, diesen dann (wie auch immer das funktionierenn soll) vergleiche mit einem String, in dem Falle einen aus der Liste (sprich meine Sucheingabe wird mit einer schon vorhandenen verglichen). Dann müsste ich ja in "case 2:" eine if else Anweisung schreiben, sprich if.... dann gebe mir die anderen Daten der Person aus, else... "Person nicht vorhanden".



  • vlajit90 schrieb:

    Ich würde es halt so machen, dass ich den Eintrag suche, diesen dann (wie auch immer das funktionierenn soll) vergleiche mit einem String

    Zum finden (suchen) des richtigen Eintrages, brauchst du schon das strcmp . Danach hast du den richtigen String und brauchst nicht mehr vergleichen.

    Bei https://www.c-plusplus.net/forum/p2521106#2521106 Zeile 4 steht das doch schon. Halt nicht in C sondern zum selber Nachdenken.

    vlajit90 schrieb:

    , in dem Falle einen aus der Liste (sprich meine Sucheingabe wird mit einer schon vorhandenen verglichen).

    Nein, du vergleichst keine zwei Einträge, sondern einen Namen von einem Eintrg mit dem Suchnamen.

    vlajit90 schrieb:

    Dann müsste ich ja in "case 2:" eine if else Anweisung schreiben, sprich if.... dann gebe mir die anderen Daten der Person aus, else... "Person nicht vorhanden".

    Nein, nicht in case 2: sondern in deiner Funktion, die du bei case 2 aufrufst.



  • Hmm... ich Danke dir für die Hilfe, aber ich verstehe es wohl einfach nicht, da mir das neu ist und ein komplettes Code Beispiel fehlt... bis jetzt hatte ich immer bei neuen Sachen ein Beispielprogramm aber das ist komplett neu.



  • Ok.

    void find_and_print_entry(t_emplist elp, char *name){
      printf("\n***********************************\n");
      while(elp!=NULL) {
        wenn (fname gleich name) {
          printf("Personalnummer: %d\n",elp->nr);
          printf("Vorname: %s\n",elp->fname);
          printf("Nachname: %s\n",elp->lname);
          printf("Gehalt: %.2f\n",elp->salary);
        }
        elp=elp->next;
      }
    }
    

    Was verstehst du da nicht?



  • DirkB schrieb:

    Ok.

    void find_and_print_entry(t_emplist elp, char *name){
      printf("\n***********************************\n");
      while(elp!=NULL) {
        wenn (fname gleich name) {
          printf("Personalnummer: %d\n",elp->nr);
          printf("Vorname: %s\n",elp->fname);
          printf("Nachname: %s\n",elp->lname);
          printf("Gehalt: %.2f\n",elp->salary);
        }
        elp=elp->next;
      }
    }
    

    Was verstehst du da nicht?

    Naja wo soll ich angefangen 😕 ... Das Char *name habe ich ja bis jetzt nirgendwo in meinem Programm (b will ich nicht ändern, da ich meine Variante viel besser verstehe und erklären kann). Die printf Anweisung verstehe ich, aber ich müsste ja noch eine else Anweisung schreiben sollte er keinen Name finden. Ich denke ich muss mir versuchen das Programm von jemanden zeigen zu lassen, da ich sonst einfach nicht verstehe wie man es schreiben soll.



  • vlajit90 schrieb:

    Naja wo soll ich angefangen 😕 ... Das Char *name habe ich ja bis jetzt nirgendwo in meinem Programm

    Ob die in deinem Programm vorkommt ist egal. Das ist ja auch eine neue Funktion.
    Und die Parameter von Funktionen haben durchaus mal Bezeichner, die im Programm nicht vorkommen.
    Ist ja auch egal, da es Parameter einer Funktion sind. Und selbst wenn sie schon vorkommen, ist es egal, da es Parameter einer Funktion sind.

    vlajit90 schrieb:

    (b will ich nicht ändern, da ich meine Variante viel besser verstehe und erklären kann).

    Dann ist die Aufgabe aber nicht gelöst, da du ja eine Funktion erstellen solltest.

    vlajit90 schrieb:

    Die printf Anweisung verstehe ich, aber ich müsste ja noch eine else Anweisung schreiben sollte er keinen Name finden.

    Du kannst erst entscheiden ob du nichts gefunden hast, wenn du am Ende bist. Und das geht nicht mit einem else.
    Aber bevor du Nutzerinteraktion machst, löse erstmal die wirklichen Probleme.

    vlajit90 schrieb:

    Ich denke ich muss mir versuchen das Programm von jemanden zeigen zu lassen, da ich sonst einfach nicht verstehe wie man es schreiben soll.

    Wenn du es nicht selber schaffst, die Zeile 4 in ein if mit strcmp zu wandeln, dann brauchst du jemanden, der dir das Programm schreibt.



  • #include <stdio.h>
    #include <stdlib.h>
    struct s_emplist{
    int nr; // Personalnummer
    char fname[50]; // VorName des Mitarbeiters
    char lname[50]; // NachnameName des Mitarbeiters
    float salary; // Einkommen
    struct s_emplist *next; // Zeiger auf nachfolger
    };
    typedef struct s_emplist *t_emplist; // neuer Datentyp: Zeiger auf parts
    // Liste ausgeben
    t_emplist allocate(void){
    t_emplist elp;
    elp=(t_emplist)malloc(sizeof(*elp));
    if(elp==NULL){printf("Error malloc"); exit(1);}
    elp->next=NULL;
    return elp;
    }
    
    void find_and_print_entry(t_emplist elp , char *name){
      printf("\n***********************************\n");
      while(elp!=NULL) {
        if ("t_emplist->fname"==name) {
          printf("Personalnummer: %d\n",elp->nr);
          printf("Vorname: %s\n",elp->fname);
          printf("Nachname: %s\n",elp->lname);
          printf("Gehalt: %f\n",elp->salary);
        }
        elp=elp->next;
      }
    }
    
    void printlist(t_emplist elp){
    printf("\n***********************************\n");
    while(elp!=NULL) {
    printf("Personalnummer: %d\n",elp->nr);
    printf("Vorname: %s\n",elp->fname);
    printf("Nachname: %s\n",elp->lname);
    printf("Gehalt: %.2f\n",elp->salary);
    elp=elp->next;
    }
    printf("***********************************\n");
    return;
    }
    
    int main(){
    unsigned int op; // Men¨u-Option
    t_emplist s_emplist=NULL; // Zeiger auf Listenanfang
    t_emplist elp;
    do{
    printf("\n 1) Neuen Angestellten eingeben " );
    printf("\n 2) Angestellten suchen " );
    printf("\n 3) Liste anzeigen " );
    printf("\n 4) STOP \n" );
    scanf("%u",&op);
    switch(op){
    case 1:
    elp=allocate(); // Speicher bereitstellen
    printf("\n Personalnummer: "); scanf("%d",&(elp->nr)); // Personalnummer einlesen
    printf(" Vorname: "); scanf("%s",elp->fname); // Name des Mitarbeiters einlesen
    printf(" Nachname: "); scanf("%s",elp->lname); // Name des Mitarbeiters einlesen
    printf(" Gehalt: "); scanf("%f",&(elp->salary)); // Gehalt einlesen
    elp->next=s_emplist; // neues Element am Listenanfang einf¨ugen
    s_emplist=elp; // partslist auf das neue Anfangselement zeigen lassen
    break;
    case 2: printf("\n Vorname:");scanf("%s",elp->fname);
            printf("\n Nachname:");scanf("%s",elp->lname);
            printf("\n Personalnummer: %d",elp->nr);
            printf(" Gehalt: %f",elp->salary);
            break;
    
    case 3: printlist(s_emplist); break;
    }
    }while(op!=4);
    return 0;
    }
    

    So habe mein vollständiges Programm so geschrieben... Erste Frage: Kann man es so machen rein theoretisch??
    Und zweite Frage: Wenn ich nach einem Mitarbeiter suche, beispielsweise Mitarbeiter 1 ersetzt er den Namen vom folgenden Mitarbeiter, also Mitarbeiter 2. Aber er übernimmt die Personalnummer und das Gehalt des folgenden Mitarbeiter.

    Sieht in etwa so aus:
    mitarbeiter 1:
    personalnummer:1
    Vorname: A
    Nachname: B
    Gehalt: 5

    Mitarbeiter 2:
    personalnummer:2
    Vorname: b
    Nachname: c
    Gehalt: 19

    Suche ich nun nach Mitarbeiter 1 kriege ich folgende Ausgabe:
    Vorname: A
    Nachname: B
    Perosnalnummr: 2
    Gehalt: 19



  • Schau dir noch mal "case 2" in der main() an - dort solltest du stattdessen "find_and_print_entry" aufrufen.

    PS: Und den Fehler in "find_and_print_entry" findest du dann (per Debugging) wohl auch...



  • Was hab ich denn dann in case 2 aufgerufen 😕
    Sorry bin sehr verwirrt mit den ganzen Sachen...
    Heißt das, dass ich jetzt die case Anweisung falsch habe?
    Und wenn ja, was soll denn reingeschrieben werden?



  • case 2: printf("\n Vorname:");scanf("%s",elp->fname);
            printf("\n Nachname:");scanf("%s",elp->lname);
            printf("\n Personalnummer: %d",elp->nr);
            printf(" Gehalt: %f",elp->salary);
            break;
    

    Wo bitte ist hier der entsprechende Aufruf?



  • Hmmm... also falsch? Könntet ihr mir das mal zeigen, weil selber komm ich nicht wieger


Log in to reply