HILFE bei Praktikumsaufgabe ... ;-)

PPatrickFfm

Grünschnabel
hallo!

ich bin neu hier und hoffe bei euch hilfe zu finden. studiere im ersten semester mechatronik in DA und habe bisher nicht viel erfahrung mit dem programmieren. soweit bin ich immer gut selber klar gekommen nur manchmal da haberts doch noch an mangelnder praxis & fehlendem wissen ... hoffentlich kommt das noch!

haben eine praktikumsaufgabe bekommen, bei der eine "mitarbeiterdatenbank" anzulegen ist. eigentlich garnicht so schwierig, wenn man nicht mit zeigern & verketteten listen arbeiten müsste! die elemente der datenbank sind vorwärts & rückwärts zu verketten, dies soll über die funktion "eingabe" - respektive "erstellen" erfolgen. zwei weitere funktionen sollen das hinzufügen von datensätzen und die ausgabe der erstellten datensätze ermöglichen. habe meine "vorab" version mal angehängt.

ich weiß noch nicht, ob´s klappt ... denn ich erhalte einen compiler-fehler .."funktionstil initialisierung scheint eine funktionsdefinition zu sein" ... na super: SOLL JA AUCH EINE SEIN!

aber spass bei seite, ich weiß nicht wo der fehler liegt?! *grübel*

vermutlich wird noch so einiges nicht stimmen, aber ich komme ja nicht weiter. vermutlich stimmt bei den zeigern auch was nicht bzw. der übergabe des zeigers "panfang" an die anderen funktionen.

wäre prima, wenn sich das mal jemand anschauen würde!

schonmal vielen dank &

gruß aus mainhattan

PIT
 

Anhänge

Immer diese faulen Studenten, sogar zu faul unsere Netiquette zu beachten. :rolleyes: Groß-/Kleinschreibung ist in unseren Foren erwünscht, Meister ;)

Ansonsten wo sind Deine Lösungsversuche zu sehen? Du bekommst hier keine fertige Lösung auf dem Präsentierteller vorgelegt, sondern bestenfalls Unterstützung bei der Lösung. Also nachbessern bitte :)
 
Hallo Dominik ...,

Na, da muss ich mich jetzt aber recht herzlichen bedanken ... für diese "freundliche Begrüßung"! ;)
Sorry, habe ich aber leider nicht gesehen bzw. gelesen, dass "durchgehende Kleinschreibung" nicht erwünscht ist. Kann ich persönlich zwar nicht nachvollziehen, wo da das Problem liegt, aber man muss sich eben den Regeln beugen ... *fg*

Also lassen wir das, ab jetzt alles in korrekter Rechtschreibung!

xxxAlso nachbessern bittexxx

Kannst du haben ;):

xxxHallo!

Ich bin neu hier und hoffe bei Euch Hilfe zu finden. Studiere im ersten Semester Mechatronik in DA und habe bisher nicht viel Erfahrung mit dem Programmieren. Soweit bin ich immer gut selber klar gekommen nur manchmal da haberts doch noch an mangelnder Praxis & fehlendem Wissen ... hoffentlich kommt das noch!

Haben eine Praktikumsaufgabe bekommen, bei der eine "Mitarbeiterdatenbank" anzulegen ist. Eigentlich garnicht so schwierig, wenn man nicht mit Zeigern & verketteten Listen arbeiten müsste! die Elemente der Datenbank sind vorwärts & rückwärts zu verketten, dies soll über die Funktion "Eingabe" - respektive "Erstellen" erfolgen. Zwei weitere Funktionen sollen das hinzufügen von Datensätzen und die Ausgabe der erstellten Datensätze ermöglichen. Habe meine "Vorab" Version mal angehängt.

Ich weiß noch nicht, ob´s klappt ... denn ich erhalte einen Compiler-Fehler .."Funktionstil Initialisierung scheint eine Funktionsdefinition zu sein" ... na Super: SOLL JA AUCH EINE SEIN!

Aber Spass bei Seite, ich weiß nicht wo der Fehler liegt?! *grübel*

Vermutlich wird noch so einiges nicht stimmen, aber ich komme ja nicht weiter. Vermutlich stimmt bei den Zeigern auch was nicht bzw. der Übergabe des Zeigers "panfang" an die anderen Funktionen.

Wäre prima, wenn sich das mal jemand anschauen würde!

Schonmal vielen dank &

Gruß aus Mainhattan

PITxxx

Alles klar?! :)

Ist zwar Offtopic, aber die Bemerkung kann ich mir einfach nicht verkneifen ...!

xxxAnsonsten wo sind Deine Lösungsversuche zu sehen?xxx

In der angefügten *.zip Datei.

xxxDu bekommst hier keine fertige Lösung auf dem Präsentierteller vorgelegt, sondern bestenfalls Unterstützung bei der Lösung.xxx

Nochmal danke für die Blumen. Das habe ich auch überhaupt nicht verlangt. Daher habe ich meinen Versuch ja auch angehängt.

xxxImmer diese faulen Studenten, sogar zu faul unsere Netiquette zu beachten.xxx

Nebenbei bemerkt ist das ja schon fast unverschämt.

Ich bitte NOCHMALS vielmals um Entschuldigung! Und hoffe, das ich jetzt nicht "de-registriert" werde.

Um nun entgültig alle Unklarheiten zu beseitigen, werde ich den Quellcode im Folgenden schriftlich "nachreichen" ...:

Code:
#include <iostream.h>
#include <conio.h>
#include <iomanip.h>

struct S_GebTag
{	int Tag;
	int Monat;
	int Jahr;
};

struct St_mitarb
{	char Name[20];
	char Vorname[20];
	S_GebTag mitarb;
	St_mitarb *pvor;
	St_mitarb *prueck;
};

St_mitarb *panfang;

void Erstellen(St_mitarb *panfang);
void Einfuegen(St_mitarb *panfang);
void Ausgabe(St_mitarb *panfang);


	

void main()

{
	St_mitarb *panfang;
	Erstellen(panfang); 
	Einfuegen(panfang); 
	Ausgabe(panfang); 
};

void Erstellen(*panfang)

{
	cout << "Programmteil I, Datenbank erstellen\n\n\n";
	St_mitarb *pstart=0,*preferenz=0, *panfang=0;
	char again;
	pstart = new St_mitarb;
	pstart->prueck = 0;
	pstart->pvor = 0;
	preferenz = pstart;
	panfang = pstart;
	cout << "Bitte geben Sie den Nachnamen ein: ";
	cin >> pstart->Name;
	cout << "Bitte geben Sie den Vornamen ein: ";
	cin >> pstart->Vorname;
	cout << "Bitte geben Sie nachfolgend das Geburtsdatum an (TT.MM.JJJJ) \n\n";
	cout << "Tag: ";
	cin >> pstart->mitarb.Tag;
	cout << "Monat: ";
	cin >> pstart->mitarb.Monat;
	cout << "Jahr: ";
	cin >> pstart->mitarb.Jahr;
	cout << endl;
	cout << "Weiteren Mitarbeiter anlegen? j/n: ";
	cin >> again;
	cout << endl;
	
	if(again == 'j')
	{
		do
		{
			pstart = new St_mitarb;
			preferenz->pvor = pstart;
			pstart->prueck = pstart;
			preferenz = pstart;
			preferenz->pvor = 0;
			cout << "Bitte geben Sie den Nachnamen ein: ";
			cin >> pstart->Name;
			cout << "Bitte geben Sie den Vornamen ein: ";
			cin >> pstart->Vorname;
			cout << endl;
			cout << "Bitte geben Sie nachfolgend das Geburtsdatum an (TT.MM.JJJJ) \n\n";
			cout << "Tag: ";
			cin >> pstart->mitarb.Tag;
			cout << "Monat: ";
			cin >> pstart->mitarb.Monat;
			cout << "Jahr: ";
			cin >> pstart->mitarb.Jahr;
			cout << endl;
			cout << "Weiteren Mitarbeiter anlegen? j/n: ";
			cin >> again;
			cout << endl;
		}
		while(again=='j');
	}
	preferenz->pvor = 0;
	preferenz = panfang;
}



void Einfuegen(*panfang)
{
	cout << "Programmteil II, in Datenbank einfügen\n\n\n";
	St_mitarb *pstart=0,*preferenz=0;
	char name[20]; 
	cout <<" Nach welchem Nachnamen soll eingefuegt werden?";
	cin >> name;
	preferenz=panfang;
	pneu=anfang;
	St_mitarb *peinfuegen;
	do
	{  
		if(preferenz->Name == name)
		{	
			peinfuegen = new St_mitarb; 
            peinfuegen->pvor=preferenz->pvor;
            preferenz->pvor=peinfuegen;
            cout << "Bitte geben Sie den Nachnamen ein: ";
			cin >> peinfuegen->Name;
			cout << "Bitte geben Sie den Vornamen ein: ";
			cin >> peinfuegen->Vorname;
			cout << endl;
			cout << "Bitte geben Sie nachfolgend das Geburtsdatum an (TT.MM.JJJJ) \n\n";
			cout << "Tag: ";
			cin >> peinfuegen->mitarb.Tag;
			cout << "Monat: ";
			cin >> peinfuegen->mitarb.Monat;
			cout << "Jahr: ";
			cin >> peinfuegen->mitarb.Jahr;
			cout << endl;
        }
		preferenz = preferenz->pvor;
    }
	while(preferenz!=NULL);
}

void Ausgabe(panfang)

{
	St_mitarb *pneu, *preferenz, *panfang;
	
	preferenz = panfang
	cout <<"Ausgabe vorwaerts ...\n\n";
	while(preferenz!=NULL)
	{ 
		cout << "Nachname: \t"
		cout<< preferenz->Name<<endl;
		cout << "Vornamen: \t";
		cin >> preferenz->Vorname << endl;
		cout << "Geburtsdatum ...\n";
		cout << "Tag: \t";
		cout << pstart->mitarb.Tag << endl;
		cout << "Monat: ";
		cin << pstart->mitarb.Monat << endl;
		cout << "Jahr: ";
		cout << pstart->mitarb.Jahr << endl << endl;
		preferenz=preferenz->pvor;
	}
	cout << endl;
   cout <<"Ausgabe rueckwaerts ...\n"; 
   do
   {
		cout << "Nachname: \t"
		cout<< preferenz->Name<<endl;
		cout << "Vornamen: \t";
		cin >> preferenz->Vorname << endl;
		cout << "Geburtsdatum ...\n";
		cout << "Tag: \t";
		cout << pstart->mitarb.Tag << endl;
		cout << "Monat: ";
		cin << pstart->mitarb.Monat << endl;
		cout << "Jahr: ";
		cout << pstart->mitarb.Jahr << endl << endl;
		pneu=pneu->prueck;
   }
   while( pneu!=NULL);  
}


Also dann, auf ein Neues! :-)
 
Ist dir aufgefallen, dass du panfang in mindesten drei verschiedenen Formen verwendest? Als globale Variable, als lokale Variable in der main() und als Parameternamen in verschiedenen Funktionen? In Erstellen übrigens in zwei Formen. Übrigens, gerade beim Gebrauch von panfang als Parameternamen teilst du dem Compiler nicht mit, um welchen Typ es sich handelt - der Typname fehlt. Und teilweise stellst du ein Sternchen davor - soll es ein Pointer sein oder nicht? Dabei stimmen Deklaration und Definition der Funktionen nicht einmal überein.
Wenn du panfang an eine Funktion übergeben willst, solltest du es so machen:

Code:
void Einfuegen(St_mitarb*panfang); // Deklaration

void Einfuegen(St_mitarb*panfang) // Definition
{
  // irgendwas tun
}
Allerdings solltest du nicht unbedingt lokalen Variablen wie den übergebenen Parametern den gleichen Namen wie parallel verwendeten globalen Variablen geben - damit verwirrst du dich nur selbst.
 
hallo!

@kachelator:

zuhnächst mal danke für deine antwort. war mir schon klar, dass das so nicht klappt. wußte aber nicht genau, wie ich dass genau bewerkstelligen sollte mit den zeigern. habe da hin und her probiert und daher dieses durcheinander. sorry, dass das so deletantisch war ...! naja, jedenfalls habe ich mir so einiges über zeiger zu gemüte geführt und das prog eben fertiggestellt. morgen ist abgabe. läuft auch. wollte daher mal kurz fragen, ob man das so abgeben bzw. vorzeigen kann. auf überprüfungen, ob die eingaben korrekt sind habe ich bewußt verzichtet ... wichitg ist ja für die aufgabe, dass das mit den zeigern & verketten klappt ...

wär prima, wenn sich das ncohmal jemand anschaut. danke!

Code:
#include <iostream.h>
#include <string.h>
#include <iomanip.h>

struct S_GebTag
{	int Tag;
	int Monat;
	int Jahr;
};

struct St_mitarb
{	char Name[20];
	char Vorname[20];
	S_GebTag mitarb;
	St_mitarb *pvor;
	St_mitarb *prueck;
};

void Erstellen(St_mitarb *&panfang, St_mitarb *&pende);
void Einfuegen(St_mitarb *&panfang, St_mitarb *&pende);
void Ausgabe(St_mitarb *&panfang, St_mitarb *&pende);


void main()
{
	St_mitarb *panfang = NULL, *pende = NULL;
	Erstellen(panfang, pende); 
	Einfuegen(panfang, pende); 
	Ausgabe(panfang, pende); 
}


void Erstellen(St_mitarb *&panfang, St_mitarb *&pende)
{
	cout << "Programmteil I, Datenbank erstellen\n\n\n";
	St_mitarb *pstart=NULL,*preferenz=NULL;
	do
	{
		pstart = new St_mitarb;
		if(panfang == NULL)
		{
			panfang = pstart;
			pstart->prueck = NULL;
			preferenz = pstart;
		}
		else
		{
			preferenz->pvor = pstart;
			pstart->prueck = preferenz;				
		}
		cout << "Bitte geben Sie den Nachnamen ein: ";
		cin >> pstart->Name;
			if (pstart->Name[0] == '#')
			{
				delete pstart;
				preferenz->pvor = NULL;
				break;
			}
		cout << "Bitte geben Sie den Vornamen ein: ";
		cin >> pstart->Vorname;
		cout << endl;
		cout << "Bitte geben Sie nachfolgend das Geburtsdatum an (TT_MM_JJJJ): ";	
		cin >> pstart->mitarb.Tag;	
		cin >> pstart->mitarb.Monat;
		cin >> pstart->mitarb.Jahr;
		cout << endl;
		cout << endl;
		preferenz = pstart;
		pstart->pvor = NULL;
		pende = pstart;
		}
		while(pstart->Name[0]!= '#');
		cout << endl << endl;
}


void Einfuegen(St_mitarb *&panfang, St_mitarb *&pende)
{
	cout << "Programmteil II, in Datenbank einfuegen\n\n\n";
	St_mitarb *preferenz = NULL, *peinfuegen = NULL;
	char name[20]; 
	preferenz = panfang;
	cout <<"Nach welchem Nachnamen soll eingefuegt werden?: ";
	cin >> name;
	cout << endl << endl;
	cout << "Datensatz anhaengen ...\n\n"; 
	while(preferenz != NULL)
	{  
		if(strcmp(preferenz->Name, name) == 0)
		{	
			peinfuegen = new St_mitarb; 
            peinfuegen->pvor = preferenz->pvor;
			peinfuegen->prueck = preferenz->prueck;
			preferenz->pvor = peinfuegen;
            cout << "Bitte geben Sie den Nachnamen ein: ";
			cin >> peinfuegen->Name;
			cout << "Bitte geben Sie den Vornamen ein: ";
			cin >> peinfuegen->Vorname;
			cout << endl;
			cout << "Bitte geben Sie nachfolgend das Geburtsdatum an (TT_MM_JJJJ): ";
			cin >> peinfuegen->mitarb.Tag;
			cin >> peinfuegen->mitarb.Monat;
			cin >> peinfuegen->mitarb.Jahr;
			cout << endl;
			break;
        }
		preferenz = preferenz->pvor;
    }
	cout << endl;
}


void Ausgabe(St_mitarb *&panfang, St_mitarb *&pende)
{
	cout << "Programmteil III, Ausgabe\n\n\n";
	int wahl=0, zaehler=1;
	St_mitarb *preferenz=NULL;	
	cout << "Bitte Ausgabeformat waehlen. (1) vorwaerts  (2) rueckwaerts: ";
	cin >> wahl;
	cout << endl;
	do
	{
		if(wahl == 1 || wahl == 2)
		{
			break;
		}
		else
		{
			cout << "Sie muessen (1) oder (2) eingeben: ";
			cin >> wahl;
		}
	}
	while(wahl != 1 || wahl != 2);
	if(wahl == 1)
	{
		cout <<"Ausgabe vorwaerts ...\n\n";
		preferenz = panfang;
		while(preferenz != NULL)
		{ 
			cout << zaehler << ". ";
			cout << "Nachname: ";
			cout << preferenz->Name<< "\t";
			cout << "Vorname: ";
			cout << preferenz->Vorname << "\t\t";
			cout << "Geburtsdatum: ";
			cout << preferenz->mitarb.Tag << ".";
			cout << preferenz->mitarb.Monat << ".";
			cout << preferenz->mitarb.Jahr << endl << endl;
			preferenz=preferenz->pvor;
			zaehler++;
		}
	}
	cout << endl;
	if (wahl == 2)
	{
		cout <<"Ausgabe rueckwaerts ...\n\n"; 
		preferenz = pende;
		while( preferenz != NULL)
		{
			cout << zaehler << ". ";
			cout << "Nachname: ";
			cout << preferenz->Name<< "\t";
			cout << "Vorname: ";
			cout << preferenz->Vorname << "\t\t";
			cout << "Geburtsdatum: ";
			cout << preferenz->mitarb.Tag << ".";
			cout << preferenz->mitarb.Monat << ".";
			cout << preferenz->mitarb.Jahr << endl << endl;
			preferenz=preferenz->prueck;
			zaehler++;
		}
	}
     
}

vielen dank schonmal!

LG aus Mainhattan

PIT
 
habe da hin und her probiert und daher dieses durcheinander. sorry, dass das so deletantisch war ...!
Solange es vernünftig lesbar ist, ist das kein Problem. Meine Sourcen sind auch immer chaotisch, wenn ich ein Beispielprojekt modifziere, um etwas Neues auszuprobieren.

naja, jedenfalls habe ich mir so einiges über zeiger zu gemüte geführt und das prog eben fertiggestellt. morgen ist abgabe. läuft auch. wollte daher mal kurz fragen, ob man das so abgeben bzw. vorzeigen kann.
Wenn du es getestet hast, und es läuft gut, dann kannst du es auch abgeben. Der Code wirkt aufgeräumt. Ein paar Kommentare wären vielleicht nicht schlecht, müssen aber nicht sein.
Ob Fehler drin sind, kann ich nicht beurteilen, ohne es selbst zu testen. Was mich allerdings stutzig gemacht hat, ist das "St_mitarb *&panfang, St_mitarb *&pende". Ich habe einen Moment gebraucht, bis mir klar wurde, dass du Referenzen auf Pointer übergibst. Das finde ich ein bischen ungewöhnlich, macht aber da Sinn, wo du zum Beispiel in Erstellen() das pende in der main() über die Referenz änderst. Im Prinzip hast du so panfang und pende verdeckt zu globalen Variablen gemacht, was nicht so geschickt ist. Ein klarere Lösung wäre vielleicht günstiger gewesen.
Das Übergeben von Referenzen an Routinen mit der Absicht, die referenzierte Variable zu verändern (was sinnvoll sein kann, wenn man quasi mehrere Rückgabewerte benötigt), sollte besser deutlicher kenntlich gemacht werden.

auf überprüfungen, ob die eingaben korrekt sind habe ich bewußt verzichtet ... wichitg ist ja für die aufgabe, dass das mit den zeigern & verketten klappt ...
Hm, das mag stimmen, aber wohl fühle ich mich bei sowas nicht. Zumindest bei den char-Arrays solltest du prüfen, ob zuviele Zeichen eingegeben worden sind, oder besser noch std::string verwenden, da du ja ohnehin mit C++ arbeitest.
 
Hallo Kachelator ...,

xxxSolange es vernünftig lesbar ist, ist das kein Problem. Meine Sourcen sind auch immer chaotisch, wenn ich ein Beispielprojekt modifziere, um etwas Neues auszuprobieren.xxx

:-)

xxxWenn du es getestet hast, und es läuft gut, dann kannst du es auch abgeben. Der Code wirkt aufgeräumt. Ein paar Kommentare wären vielleicht nicht schlecht, müssen aber nicht sein.
Ob Fehler drin sind, kann ich nicht beurteilen, ohne es selbst zu testen.xxx

Also bei mir hat´s gefuntzt! Ich denke schon, dass es o.k. ist. Was die Lesbarkeit betrifft legt der Prof schon großen Wert ... da kannst du mit "KuddelMuddel" gleich wieder Heim gehen ...; ich behaupte mal, dass man meinen Code gut lesen kann! ;--)
Was die Kommentare betrifft, die schreibe ich eigentlich ungern dran. Wenn dann nur für mich, damit auch später noch klar ist, WAS ich da gemacht habe. Aber bei der Abgabe antworte ich lieber "aus dem Kopf" heraus auf Fragen, ich denke das macht einen besseren Eindruck bzw. zeugt eher davon, dass ich weiß, was ich da gemacht habe.

xxxWas mich allerdings stutzig gemacht hat, ist das "St_mitarb *&panfang, St_mitarb *&pende". Ich habe einen Moment gebraucht, bis mir klar wurde, dass du Referenzen auf Pointer übergibst. Das finde ich ein bischen ungewöhnlich, macht aber da Sinn, wo du zum Beispiel in Erstellen() das pende in der main() über die Referenz änderst.xxx

Mmh ... welche bessere Möglichkeit wüsstest du denn? Ich weiß keine. Die Übergabe der beiden (wichtig(st)en) Zeiger *panfang und *pende kann nur mittels call by reference erfolgen. Ich hatte da zunächst nicht dran gedacht (gab´s bei C ja noch nicht), dass mit call by value da nicht viel zu machen ist.

Wenn du einen anderen, besseren Weg weißt, klär mich auf. Ich wüßte da klarere Lösung!

xxxHm, das mag stimmen, aber wohl fühle ich mich bei sowas nicht. Zumindest bei den char-Arrays solltest du prüfen, ob zuviele Zeichen eingegeben worden sind, oder besser noch std::string verwenden, da du ja ohnehin mit C++ arbeitest.xxx

Ja, hast natürlich Recht. Würde ich ja eigentlich auch machen, aber da das ja nun nicht das Essentielle für dieses Prog sein soll, habe ich´s mal weg gelassen.


Danke & Gruß

PIT
 
Vorweg: Bitte benütze zum Zitieren die [ quote ]-Tags, die der wohlmeinende Admin für uns eingerichtet hat. Sie sind wesentlich übersichtlicher als das Ankleben von "xxx" und ausserdem während des Editierens mit dem "Zitat"-Button direkt einbaubar. ;)

Mmh ... welche bessere Möglichkeit wüsstest du denn? Ich weiß keine. Die Übergabe der beiden (wichtig(st)en) Zeiger *panfang und *pende kann nur mittels call by reference erfolgen. Ich hatte da zunächst nicht dran gedacht (gab´s bei C ja noch nicht), dass mit call by value da nicht viel zu machen ist.

Wenn du einen anderen, besseren Weg weißt, klär mich auf. Ich wüßte da klarere Lösung!
Im Moment habe ich auch keine Idee, wie man das so einfach verbessern kann. Es würde vermutlich auf einen etwas anderen Ansatz zur Parameterangabe hinauslaufen, aber da kann ich mich jetzt nicht festlegen. Da deine Lösung funktioniert, solltest du erstmal bis morgen damit zufrieden sein. Verbessern kannst du dann immer noch.

xxxHm, das mag stimmen, aber wohl fühle ich mich bei sowas nicht. Zumindest bei den char-Arrays solltest du prüfen, ob zuviele Zeichen eingegeben worden sind, oder besser noch std::string verwenden, da du ja ohnehin mit C++ arbeitest.xxx

Ja, hast natürlich Recht. Würde ich ja eigentlich auch machen, aber da das ja nun nicht das Essentielle für dieses Prog sein soll, habe ich´s mal weg gelassen.
Das macht Sinn. Aber ein schlechtes Gewissen solltest du dabei schon haben! :-)
 
Zurück