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ürunsigned int
einDa hast immer noch keine code-Tags verwendet:
Code mit der Maus markieren und auf den C-Button unter demklicken.
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ßegrauenvoll, 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
mitstrcmp
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: 5Mitarbeiter 2:
personalnummer:2
Vorname: b
Nachname: c
Gehalt: 19Suche 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