Hilfe bei einem Programm



  • 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