Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Informatik in der Schule (http://www.informatikerboard.de/board/board.php?boardid=21)
--- C++ (http://www.informatikerboard.de/board/thread.php?threadid=1373)


Geschrieben von info am 20.01.2013 um 23:34:

  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



Geschrieben von eulerscheZahl am 21.01.2013 um 09:05:

 

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!



Geschrieben von Info am 21.01.2013 um 10:20:

 

Was muss ich den genau als nächstes machen? Auf was soll ich den Zeiger genau zeigen?



Geschrieben von eulerscheZahl am 21.01.2013 um 10:51:

 

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.



Geschrieben von Info am 21.01.2013 um 11:52:

 

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.



Geschrieben von eulerscheZahl am 21.01.2013 um 12:12:

 

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



Geschrieben von Info am 21.01.2013 um 12:26:

 

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.



Geschrieben von eulerscheZahl am 21.01.2013 um 12:35:

 

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.



Geschrieben von info am 21.01.2013 um 13:03:

 

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.



Geschrieben von eulerscheZahl am 21.01.2013 um 14:32:

 

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)



Geschrieben von info am 21.01.2013 um 15:12:

 

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.



Geschrieben von eulerscheZahl am 21.01.2013 um 16:35:

 

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()



Geschrieben von Info am 21.01.2013 um 16:44:

 

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?



Geschrieben von eulerscheZahl am 21.01.2013 um 17:14:

 

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?



Geschrieben von info am 21.01.2013 um 17:21:

 

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 ?


Forensoftware: Burning Board, entwickelt von WoltLab GmbH