Hilfe bei einem Programm



  • 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



  • vlajit90 schrieb:

    while(elp!=NULL) {
        if ("t_emplist->fname"==name) {
    

    Der Zeiger auf deine Daten heißt elp
    Du vergleichst, ob das Stringliteral (Zeichenfolge) "t_emplist->fname" (16 Zeichen) an derselben Speicherstelle liegt, wie der übergebene Name.
    Das ist dreifach blöd.
    1. vergleicht man Strings in C nicht mit == (du hast Hinweise bekommen)
    2. wäre t_emplist ein Typ und keine Variable (int, char, dpuble sind auch Typen)
    3. ist das ein Stringliteral (feste Zeichenkette)

    Nicht schlecht, nicht schlecht 🤡



  • Also was auch dreifach blöd ist, dass man es einen Anfänger so umständlich erklärt. Ich verstehe zwar warum es nicht gut, Danke dir. Aber eine Lösung sehe ich immer noch nicht in meinem Kopf. Deswegen habe ich auch darum gebeten, ob mir man es an einem Beispiel mal zeigen kann, klar strukturiert und ohne Lücken. Wenn das nicht in eurem Interesse liegt, weil ihr meint ich schreibe dann stumpf ab, dann lass ich euch in dem Glauben und bedanke mich trotzdem mir meine Fehler zu zeigen!



  • vlajit90 schrieb:

    , ob mir man es an einem Beispiel mal zeigen kann, klar strukturiert und ohne Lücken.

    Wie wäre es, wenn du diese Forderung an deinen Lehrer stellst?
    Der ist dafür da, der wird dafür bezahlt, im Gegensatz zu uns hier und der ist auch für diese - hinsichtlich der C Praxisrelevanz unselige - Aufgabenstellung verantwortlich.
    Verkettete Listen sind Praxisschrott, werden aber - leider - wegen Faulheit und Inkompetenz der Lehrer immer wieder gestellt.
    Und du selbst motivierst Helfer hier im Forum trotz mehrfacher Aufforderung auch nicht dazu dir zu helfen, da du nach wie vor deine nicht vorhandene Einrückung in den Codezeilen pflegst.



  • Tut mir echt echt leid, wenn es so viel Zeit kostet, einen Mitmenschen zu helfen (ihr habt es ja versucht, aber so werde ich es nie verstehen). Der Professor hat leider seine Sprechzeiten nur an Tagen wo ich arbeite, sonst würde ich auch hingehen. Ich will mich auch erst gar nicht rechtfertigen, wenn es nicht geht, dass ihr helft geht es eben nicht. Und so viel hab ich dann doch an wissen: Jeder hat seinen eigenen Programmierstil, mir gefällt es so am besten. Gefällt es euch nicht? Dann sind das sieben Mausklicks um es zu ändern. Diskutieren will ich auch garnicht, entweder ihr könnt helfen oder nicht, mehr will ich gar nicht



  • Ich habe das wiederverwendet, was halbwegs brauchbar war, was NICHT heißt, dass das fehlerfrei/optimal ist:

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.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 search_employee(t_emplist elp, const char *name) {
    	t_emplist vorgaenger = NULL;
    
    	while (elp != NULL)
    	{
    		if (!strcmp(elp->fname, name)) /* so vergleicht man C-Strings, strcmp liefert 0, wenn beide gleich sind (case sensitive); sei nicht so faul und lies im o.g. Link nach; in C gibt es auch keine 'Befehle' sondern Funktionen */
    		{
    			printf("Personalnummer: %d\n", elp->nr);
    			printf("Gehalt: %f\n", elp->salary);
    
    			/* tausche Inhalt des aktuellen Elements mit dem Inhalt des Vorgängers (falls ich überhaupt einen Vorgänger habe d.h. NICHT selbst am Anfang stehe */
    			if (vorgaenger)
    			{   /* Nutzung von Operator '=' für komplette Inhaltskopie von struct, */
    				struct s_emplist tmp = *elp;  /* temporäres struct Objekt anlegen und alle struct Element-Werte dort speichern/merken */
    				*elp = *vorgaenger;           /* aktuelle struct-Element-Werte mit denen aus Vorgänger überschreiben */
    				*vorgaenger = tmp;            /* Vorgänger-Werte mit meinen oben gemerkten Werten überschreiben */
    
    				elp->next = tmp.next;     /* für aktuelles Element den Nachfolger (Adresse) wieder setzen (gemerkt in tmp) */
    				vorgaenger->next = elp;   /* den Nachfolger meines Vorgängers auf mich selbst setzen */
    
    			} /* im Ergebnis wurden die Elementwerte für nr,fname,lname,salary getauscht, next jedoch beibehalten! */
    			return; /* Arbeit getan, raus */
    		}
    		vorgaenger = elp;
    		elp = elp->next;
    	}
    	printf("\n***** %s NICHT gefunden\n", name);
    }
    
    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;
    }
    
    t_emplist new_employee(t_emplist anfang, t_emplist neu)
    {
    	neu->next = anfang;
    	return neu;
    }
    
    int main() {
    	unsigned int op; // Men¨u-Option 
    	t_emplist anfang = NULL; // Zeiger auf Listenanfang 
    
    	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); while (getchar() != '\n'); /* stdin leeren, sinnvoll bei scanf Gebrauch */
    		switch (op) {
    		case 1:
    		{
    			/* neues Element erzeugen und befüllen */
    			t_emplist 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 
    
    			/* neues Element in Liste (an deren Anfang) einfügen gemäß Aufgabe b) */
    			anfang = new_employee(anfang, elp);
    		}
    
    		break;
    		case 2:
    		{
    			char n[50]; /* Suchnamen eingeben */
    			printf(" Suchname: "); scanf("%49[^\n]", n);
    			search_employee(anfang, n);
    		}
    		break;
    
    		case 3: printlist(anfang); break;
    
    		case 4: break;
    		default: fputs("fehlerhafte Eingabe", stderr); break;
    		}
    	} while (op != 4);
    	return 0;
    }
    


  • vlajit90 schrieb:

    Tut mir echt echt leid, wenn es so viel Zeit kostet, einen Mitmenschen zu helfen (ihr habt es ja versucht, aber so werde ich es nie verstehen). Der Professor hat leider seine Sprechzeiten nur an Tagen wo ich arbeite, sonst würde ich auch hingehen. Ich will mich auch erst gar nicht rechtfertigen, wenn es nicht geht, dass ihr helft geht es eben nicht. Und so viel hab ich dann doch an wissen: Jeder hat seinen eigenen Programmierstil, mir gefällt es so am besten. Gefällt es euch nicht? Dann sind das sieben Mausklicks um es zu ändern. Diskutieren will ich auch garnicht, entweder ihr könnt helfen oder nicht, mehr will ich gar nicht

    Wenn du nicht in der Lage bist zu verstehen wie die primitivsten C-Funktionen arbeiten, meld dich von der Schule ab!


Anmelden zum Antworten