C++

Neue Frage »

Auf diesen Beitrag antworten »
info C++

Meine Frage:
Hallo leute ich habe gerade ganz grosse Probleme bei einer Aufgabe wo ich keine Anhnung hab wie ich das machen soll.




Eine Konzertagentur will zur Verwaltung ihren Veranstaltungen ein neues DV-System einführen.
Dabei soll eine Veranstaltung mittels einer Struktur Event beschrieben werden und alle
Veranstaltungen der Agentur als verkettete Liste von Events.
Ihre Aufgabe ihm Rahmen des Projekts ist die Erstellung von Ausgabefunktionen.
Programmieren Sie
- eine Funktion void ausgabe(?)
welche die Daten eines Events am Bildschirm anzeigt. Der Parameter kann geeignet
gewählt werden
- eine Funktion void ausgabeListe( Event* start)
welche alle Events der Liste am Bildschirm anzeigt, wobei das erste Element als
Parameter übergeben wird.


Kann mir jemand sagen wie ich Vorgehen soll?

Hab leider noch keine Ansätze.

Meine Ideen:
keine
 
Auf diesen Beitrag antworten »
eulerscheZahl

Hallo, info/Chrisx2/Christine

In eine Struktur kommen zunächst einmal alle Variablen, die du für das Event benötigst. Da es sich um eine verkettete Liste handelt, brauchst du außerdem einen Zeiger auf das nächste Element:
code:
1:
2:
3:
4:
5:
6:
struct Event
{
    struct Event *next;
    char Veranstaltungsort[20];
    char Datum[11];
};


Den Zeiger auf das erste Element der Liste darfst du nicht überschreiben, da du dieses sonst nicht mehr findest.

Und jetzt du!
Auf diesen Beitrag antworten »
Info

Was muss ich den genau als nächstes machen? Auf was soll ich den Zeiger genau zeigen?
Auf diesen Beitrag antworten »
eulerscheZahl

Nun geht es ans Befüllen der Elemente, damit wir etwas zum Ausgeben haben.
Du brauchst einen Zeiger auf die Struktur, dann kannst du (z.B. mit malloc) Speicher für das eine Element reseriveren.
Dabei kriegst du auch einen neuen Zeiger auf ein weiteres Element. Die anderen Elemente kannst du mit strcpy füllen.
 
Auf diesen Beitrag antworten »
Info

In meinem Skript steht das ich mit dem Zeiger irgendwie so auf eine Variable zugreife:
Z.b
Uhrzeit u, *ptr= &u


Aber wie wende ich das an?

Für einen Anfänger ist das so schwer.
Auf diesen Beitrag antworten »
eulerscheZahl

Die Liste soll dynamische Länge haben, es wird immer genau ein neues Element erstellt.
Es ist einfacher, wenn man ein erstes Element ohne wirklichen Inhalt erstellt.
code:
1:
2:
3:
4:
5:
6:
7:
8:
struct Event *erstes, *momentan;
erstes = (struct Event*)malloc(sizeof(struct Event));
if(erstes == NULL) //kein Speicherplatz vorhanden
    return 1;
momentan = erstes;

    //Daten einlesen

Das Einlesen am besten mit einer Schleife.
Neuen Speicher kann man dann mit dem Zeiger momentan->next reservieren
Auf diesen Beitrag antworten »
Info

Ich bin mir nicht sicher kann ich das so machen?

if( erstes == momentan ) {

cout << "Event momentan ">>endl;

So in Ordnung. Tut mir leid falls es nicht in Ordnung ist.
Auf diesen Beitrag antworten »
eulerscheZahl

Ich verstehe nicht, was du mir mit diesen zwei Zeilen sagen willst.

Wie in meinem letzten Beitrag schon geschrieben:
Nimm zum Einlesen eine Schleife und reserviere in dieser Schleife Speicher für ein Element, das du dann mit dem Eingelesenen füllen kannst.
Wie du den Speicher reservierst, kannst du an meinem letzten Beitrag sehen, wo ich das für das erste Element getan habe.
Auf diesen Beitrag antworten »
info

Oh man ich verzweifel grad wie soll ich das denn einlesen . Ich dachte , dass ich es mitweinen Zeilen gemacht hab. Kannst du mir noch einen kleinen Tipp geben. Was soll ich denn nur machen wenn ich einfach nicht drauf komme.
Auf diesen Beitrag antworten »
eulerscheZahl

cout ist, wie die letzten drei Buchstaben schon vermuten lassen, zum Ausgeben von Text.
Ich könnte dir jetzt einfach die fertige Lösung schreiben, habe aber Zweifel, ob das Sinn macht.

Du musst dir wohl nochmal durchlesen, wie man einliest (Stichwort: cin bzw. scanf)
Auf diesen Beitrag antworten »
info

Ah könnte man das irgendwie so machen?

if( erstes == momentan ) {

cin>> "Event momentan ">>endl;

}

Du musst mir bitte noch ein wenig helfen , sonst schaffe ich diese Aufgabe nie.
Auf diesen Beitrag antworten »
eulerscheZahl

Du kannst nicht eine gesamte Struktur einlesen, sondern nur einzelne Variablen, die du dann in die Struktur schreibst.
Wenn du es schon nicht programmieren kannst, versuche zumindest zu verstehen, was ich mache:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
#include <iostream>
#include <stdlib.h>
#include <string.h>
using std::cout;
using std::cin;


int main(int argc, char*argv[])
{
    struct Event *erstes, *momentan;
	char ort[20], datum[11];
	erstes = (struct Event*)malloc(sizeof(struct Event));
	if(erstes == NULL) //kein Speicherplatz vorhanden
		return 1;
	momentan = erstes;
	while(1)
	{
	   	cout << "Veranstaltungsort? ";
		cin >> ort;
		if(strlen(ort) < 2) break;
		cout << "Datum? ";
		cin >> datum;
		momentan->next = (struct Event*)malloc(sizeof(struct Event));
		if(momentan == NULL) //kein Speicherplatz vorhanden
			return 1;
		momentan = momentan->next;
		momentan->next = NULL;
		strcpy(momentan->Datum, datum);
        strcpy(momentan->Veranstaltungsort, ort);
	}
	AusgabeListe(erstes->next);
	getchar(); getchar();
	return 0;
}

fehlt noch AusgabeListe()
Auf diesen Beitrag antworten »
Info

Ok bevor wir weiter machen müsst du mir kurz erklären was dieses malloc ist? Hast recht wenigsten will ich versuchen es zu verstehen.

Und was ist dieses strcpy?
Auf diesen Beitrag antworten »
eulerscheZahl

malloc reserviert Speicher, in den man dann etwas schreiben kann (hier: Datum, Ort und wo es weiter geht).
strcpy kopiert einen string an eine gewünschte Stelle.

Kann sein, dass ich etwas unübliche Befehle verwende (mein Programm funktioniert aber), kenne das so aus C.
Kennst du new zur Speicherreservierung?
Auf diesen Beitrag antworten »
info

Ich benutze code Blocks und es zeigt mir fehler an:

||=== , Debug ===|
C:\C++\\main.cpp||In function 'int main(int, char**)':|
C:\C++\\main.cpp|12|error: invalid application of 'sizeof' to incomplete type 'main(int, char**)::Event'|
C:\C++\main.cpp|23|error: invalid use of incomplete type 'struct main(int, char**)::Event'|
C:\C++\\main.cpp|10|error: forward declaration of 'struct main(int, char**)::Event'|
C:\C++\main.cpp|23|error: invalid application of 'sizeof' to incomplete type 'main(int, char**)::Event'|
C:\C++\main.cpp|26|error: invalid use of incomplete type 'struct main(int, char**)::Event'|
C:\C++\P\main.cpp|10|error: forward declaration of 'struct main(int, char**)::Event'|
C:\C++\P\main.cpp|27|error: invalid use of incomplete type 'struct main(int, char**)::Event'|
C:\C++\\main.cpp|10|error: forward declaration of 'struct main(int, char**)::Event'|
C:\C++\main.cpp|28|error: invalid use of incomplete type 'struct main(int, char**)::Event'|
C:\C++\main.cpp|10|error: forward declaration of 'struct main(int, char**)::Event'|
C:\C++\main.cpp|29|error: invalid use of incomplete type 'struct main(int, char**)::Event'|
C:\C++\main.cpp|10|error: forward declaration of 'struct main(int, char**)::Event'|
C:\C++\main.cpp|31|error: invalid use of incomplete type 'struct main(int, char**)::Event'|
C:\C++\\main.cpp|10|error: forward declaration of 'struct main(int, char**)::Event'|
C:\C++\\main.cpp|31|error: 'AusgabeListe' was not declared in this scope|
C:\C++\|32|error: 'getchar' was not declared in this scope|
||=== Build finished: 16 errors, 0 warnings (0 minutes, 2 seconds) ===|

Das sind eine reihe von Fehler , vielleicht kannst du mir helfen sie zu beseitigen .

Noch eine frage warum hast du das getchar 2 mal benutzt ?

Das verstehe ich auch nicht.

Und bei der nächsten Aufgabe void Ausgabe liste soll ich da nicht einfach mit cout alles Ausgeben ?
Auf diesen Beitrag antworten »
eulerscheZahl

Dann hast du die Struktur von 09:05Uhr nicht eingefügt.
Auf diesen Beitrag antworten »
info

Ah ja stimmt.

DAs kommt davon wenn man nicht so viel Ahnung hat.

Jetzt wird mir nur dieser Fehler angezeigt.

C:\C++main.cpp||In function 'int main(int, char**)':|
C:\C++\\main.cpp|37|error: 'AusgabeListe' was not declared in this scope|
C:\C++\\main.cpp|38|error: 'getchar' was not declared in this scope|
||=== Build finished: 2 errors, 0 warnings (0 minutes, 4 seconds) ===|

Was ist da jetzt falsch?

Achso und bitte noch paar tips für die Funktion void ausgabe liste.
Auf diesen Beitrag antworten »
eulerscheZahl

Probiere mal folgendes:
Schreibe über die main-funktion
void AusgabeListe(struct Event *e)
{

}

und mache aus getchar() ein getch().
Für getch() brauchst du noch #include <conio.h>

Jetzt sollte es sich zumindest kompilieren lassen.
An der Ausgabe darfst du selbst noch etwas knobeln.
Auf diesen Beitrag antworten »
info

Aha habe ich gemacht.

Mein programm sieht so aus:

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
using std::cout;
using std::cin;

struct Event
{
struct Event *next;
char Veranstaltungsort[20];
char Datum[11];
};

void AusgabeListe(struct Event *e);


int main(int argc, char*argv[])
{
struct Event *erstes, *momentan;
char ort[20], datum[11];
erstes = (struct Event*)malloc(sizeof(struct Event));
if(erstes == NULL) //kein Speicherplatz vorhanden
return 1;
momentan = erstes;
while(1)
{
cout << "Veranstaltungsort? ";
cin >> ort;
if(strlen(ort) < 2) break;
cout << "Datum? ";
cin >> datum;
momentan->next = (struct Event*)malloc(sizeof(struct Event));
if(momentan == NULL) //kein Speicherplatz vorhanden
return 1;
momentan = momentan->next;
momentan->next = NULL;
strcpy(momentan->Datum, datum);
strcpy(momentan->Veranstaltungsort, ort);
}
AusgabeListe(erstes->next);
getch(); getch();
return 0;
}

Aber immer noch fehlermeldung?

Warum steht da eigentlich jetzt getch?
Nur noch diese Fehlermeldung.
Wie kriege ich das weg?

obj\Debug\main.o||In function `main':|
C:\C++\main.cpp|41|undefined reference to `AusgabeListe(Event|
||=== Build finished: 1 errors, 0 warnings (0 minutes, 4 seconds) ===|
Auf diesen Beitrag antworten »
eulerscheZahl

Ersetze mal deine Zeile 15 (ist nur der Funktionskopf) durch die komplette Funktion
code:
1:
2:
3:
4:
void AusgabeListe(struct Event *e)
{
    //hier kommt die Ausgabefunktion hin
}

getch() wartet auf den nächsten Tastendruck.
Das hat den Effekt, dass du sehen kannst, was das Programm ausgibt, bevor es beendet wird.
Auf diesen Beitrag antworten »
info

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
using std::cout;
using std::cin;

struct Event
{
struct Event *next;
char Veranstaltungsort[20];
char Datum[11];
};

void AusgabeListe(struct Event *e){


int main(int argc, char*argv[])
{
struct Event *erstes, *momentan;
char ort[20], datum[11];
erstes = (struct Event*)malloc(sizeof(struct Event));
if(erstes == NULL) //kein Speicherplatz vorhanden
return 1;
momentan = erstes;
while(1)
{
cout << "Veranstaltungsort? ";
cin >> ort;
if(strlen(ort) < 2) break;
cout << "Datum? ";
cin >> datum;
momentan->next = (struct Event*)malloc(sizeof(struct Event));
if(momentan == NULL) //kein Speicherplatz vorhanden
return 1;
momentan = momentan->next;
momentan->next = NULL;
strcpy(momentan->Datum, datum);
strcpy(momentan->Veranstaltungsort, ort);
}
AusgabeListe(erstes->next);
getch(); getch();
return 0;
}
}

ICH HAB ES SO GEMACHT?

Aber immer noch fehlermeldung:
C:\C++\main.cpp||In function 'void AusgabeListe(Event*)':|
C:\C++\main.cpp|19|error: a function-definition is not allowed here before '{' token|
C:\C++\main.cpp|45|error: expected '}' at end of input|
||=== Build finished: 2 errors, 0 warnings (0 minutes, 0 seconds) ===|


Langsam verzweifle ich.

Was ist jetzt wieder falsch?
Auf diesen Beitrag antworten »
eulerscheZahl

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
using std::cout;
using std::cin;

struct Event
{
	struct Event *next;
	char Veranstaltungsort[20];
	char Datum[11];
};

void AusgabeListe(struct Event *e)
{
    //hier kommt die Ausgabefunktion hin
}


int main(int argc, char*argv[])
{
	struct Event *erstes, *momentan;
	char ort[20], datum[11];
	erstes = (struct Event*)malloc(sizeof(struct Event));
	if(erstes == NULL) //kein Speicherplatz vorhanden
	return 1;
	momentan = erstes;
	while(1)
	{
		cout << "Veranstaltungsort? ";
		cin >> ort;
		if(strlen(ort) < 2) break;
		cout << "Datum? ";
		cin >> datum;
		momentan->next = (struct Event*)malloc(sizeof(struct Event));
		if(momentan == NULL) //kein Speicherplatz vorhanden
		return 1;
		momentan = momentan->next;
		momentan->next = NULL;
		strcpy(momentan->Datum, datum);
		strcpy(momentan->Veranstaltungsort, ort);
	}
	AusgabeListe(erstes->next);
	getch();
	return 0;
}

klappt es jetzt?
(Du hattest "}" vergessen)
Auf diesen Beitrag antworten »
info

lol funktioniert .

Jetzt musst du mir irgendwie einen tipp für die Ausgabe funktion geben damit ich endlich fertig werd.

Habe schon einen Kopf wegen der Aufgabe, weil ich glaube alleine schaffe ich es nicht.
Auf diesen Beitrag antworten »
eulerscheZahl

Die Ausgabe eines Events sollte klar sein:
cout << e->Datum << ": " << e->Veranstaltungsort << "\n";
Dann weisen wir e das Folgeglied zu und geben das auch aus, solange bis wir kein Folgeglied mehr haben.
Auf diesen Beitrag antworten »
Info

Das musst du mir noch ein wenig genauer . Ist das jetzt meine Ausgabefunktion oder wie?
Auf diesen Beitrag antworten »
Info

Was bedeutet dieses e Pfeil?

Ichglaube deswegen verstehe ich es nicht.
Auf diesen Beitrag antworten »
eulerscheZahl

Mit e.___ kann man nicht auf eine Variable der Struktur zugreifen, weil e ja keine Struktur ist, sondern nur ein Zeiger darauf. Deshalb der Pfeil.
Man kann dafür auch(*e).___ schreiben, wird aber spätestens bei z.B. e->next->Datum unübersichtlich.
Auf diesen Beitrag antworten »
Info

Ich glaube ich komme diesmal selber drauf. Was ist denn genau das Folgeglied? Was muss ich da jetzt genau machen?
Auf diesen Beitrag antworten »
eulerscheZahl

Wir haben der Zeiger auf das Folgeglied in e->next gespeichert. Wenn es kein Folgeglied gibt, findet sich dort NULL.
Dabei ist e->next im Aufbau identisch zu e (das heißt es gibt die Variablen Veranstaltungsort, Datum und den Verweis auf das nächste Kettenglied).
Auf diesen Beitrag antworten »
info

Also kommt jetzt noch ein e Pfeil Null dazu?
Auf diesen Beitrag antworten »
eulerscheZahl

Für die Ausgabe braucht man eine Schleife.
Was ist die Abbruchbedingung?
Wie kommt man an das nächste Kettenglied?
Auf diesen Beitrag antworten »
info

Die Abbruchbedingung ist ja wenn kein speicherplatz mehr da ist.


An das nächste Kettenglied kommt man doch mit e pfeil oder?
Auf diesen Beitrag antworten »
eulerscheZahl

Der Speicherplatz sollte nicht das Problem sein, in aller Regel hast du weniger Events als du speichern könntest.
Abbruchbedingung ist je nach genauer Implementierung, dass e bzw. e->next ==NULL ist.
Mit e->next kommt man auch an das nächste Kettenglied.
Auf diesen Beitrag antworten »
info

Wäre die Ausgabefunktion irgendwie so:

Die Ausgabe eines Events sollte klar sein:
cout << e->Datum << ": " << e->Veranstaltungsort << "\n";

if(erstes == NULL){

return e pfeil next == Null;

}

Könnte das stimmen?

Ich versuch das jetzt irgendwie mit dir zu entwickeln.

Ich hoffe die idee ist nicht ganz falsch
Auf diesen Beitrag antworten »
eulerscheZahl

Das ergibt aus mehreren Gründen keinen Sinn:
-die Funktion ausgabe ist void, das heißt sie hat keinen Rückgabewert, du brauchst also auch kein return.
-"->" ist keine Abkürzung meinerseits, sondern wird wirklich so verwendet. e pfeil next wird vom Compiler nicht erkannt.
-Wo ist die Schleife zur Ausgabe (Rekursion wäre auch möglich, ist aber langsamer und müllt den Stack unnötig zu)?

code:
1:
2:
3:
4:
5:
6:
7:
8:
void AusgabeListe(struct Event *e)
{
	while(e != NULL)
	{
		cout << e->Datum << ": " << e->Veranstaltungsort << "\n"; 
		e = e->next;
	}
}


möglicherweise nötige Erklärungen gibt es morgen.
Auf diesen Beitrag antworten »
info

Das ist die ganze Ausgabe funktion oder wie?
Auf diesen Beitrag antworten »
info

Oder muss ich noch was in der Ausgabe funktion definieren .

Dann könnte ich mir wenigstens schon paar gedanken machen.
Auf diesen Beitrag antworten »
info

Mittlerweile sind neue fragen entstanden ?

while(1)
{
cout << "Veranstaltungsort? ";
cin >> ort;
if(strlen(ort) < 2) break;
cout << "Datum? ";
cin >> datum;
momentan->next = (struct Event*)malloc(sizeof(struct Event));
if(momentan == NULL) //kein Speicherplatz vorhanden
return 1;
momentan = momentan->next;
momentan->next = NULL;
strcpy(momentan->Datum, datum);
strcpy(momentan->Veranstaltungsort, ort);
}

Das mit der while schleife habe ch verstanden.

Aber das hier nicht:

if(strlen(ort) < 2) break;
cout << "Datum? ";
cin >> datum;
momentan->next = (struct Event*)malloc(sizeof(struct Event));
if(momentan == NULL) //kein Speicherplatz vorhanden
return 1;
momentan = momentan->next;
momentan->next = NULL;
strcpy(momentan->Datum, datum);
strcpy(momentan->Veranstaltungsort, ort);
}

Was bedeutet das hier: strlen(ort)

Und wäre nett wenn du mir den weiteren code ein wenig erklären kannst .

Danke
Auf diesen Beitrag antworten »
Karlito

Kurze kritische Zwischenfrage:

Wo ist deine Eigeninitiative? strlen findet man gut bei google. Und warum hast du so ein Aufgabe und keinerlei Wissen?

VG,

Karlito
Auf diesen Beitrag antworten »
info

Ich hab leider meine schwierigkeiten gehabt und war daher auch sehr froh über eulersche Zahls hilfe.

Vielleicht kannst du es mir ja erklären?
 
Neue Frage »
Antworten »


Verwandte Themen