Unbekannte Anzahl Zahlen einlesen



  • Hallo,

    wir haben heute in der Schule die Aufgabe bekommen, eine "Rundreise" zu programmieren.

    Dabei sollen die Orte,Entfernungen und die Indexe der orte in Arrays abgespeichert werden.

    Nun zu meinem problem:

    Am Ende der Aufgabe heisst es:
    Der erste Wert der von der Tastatur eingelesen wird, ist Index des Startortes.
    Danach sollen so lange Zahlen eingelesen werden, bis der Startwert wieder eingegeben wurde.
    Anschließend soll eine Rundreise ausgegeben werden, also von wo aus man vom startwert hingefahren ist, von da dann weiter, bis zum ende halt.

    Normalerweise könnte man sowas ja mit einem zweidimensionalem array machen, allerdings ist halt die zahl der Zwischenstationen unbekannt.

    So müsste man theoretisch das Array immer dynamisch vergrößern, da man bei der Initialisierung des Arrays ja ne größe angeben muss.

    Unser Lehrer meinte das man es mit einem zweidimensionalem Array lösen kann.

    Meine Frage ist nun, ob sowas überhaupt geht, und falls ja, hätt ich gern ein paar Tips so als Denkanstoß.



  • ist bestimmt so gemeint: man macht ein 2D-array, in x- und y-richtung die orte und an den schnittpunkten (die elemente des arrays) die entfernungen.
    eigentlich braucht man, wenn man's speicheroptimiert macht, nur die hälfte minus anzahl der orte (also x*x-x) an elementen (vom moskau nach moskau ist ja 0 und zurück ist das gleiche wie hin).
    aber, der einfachheit halber, könnteste so anfangen (beispiel):

    ------------peine-pattensen-paris
    peine---------0-----20-------800
    pattensen--20-----0--------760
    paris-------800----760---------0

    kilometerangaben ohne gewähr 😉



  • Ich würde dem Array einen recht Wert geben, den man nicht überschreitet.
    Wenn der Startwert erneut eingegeben wurde kannst Du das ja überprüfen und nur die von Dir mit einem Wert belegten Arrays verwenden.

    Mir ist aus Deiner Beschreibung nicht so ganz klar geworden wie das ganze aussehen soll, bzw. ob man auch Ortsnamen mit eingibt...



  • ja, so hatte ich das auch schon umgesetzt.

    Ich meinte eigentlich, das wenn man sone rundreise macht,also z.b

    Einlesen von Tastatur:
    1
    2
    3
    1

    das soll der halt danach ausgeben:

    von 1 nach 2
    von 2 nach 3
    von 3 nach 1

    also wenn der startwert wieder eingegeben wird ist schluss.
    die frage ist halt nur, wie man sowas macht, da man sich ja die zwischenstationen irgendwo merken muss und die Anzahl der Zwischenstationen ja noch nicht feststeht, bevor ich alle zahlen eingelesen hab.

    Lehrer meint halt mit nem 2dimensionalem array, aber das müsst ich ja während dem einlesen irgendwie vergrößern 😕



  • mal kurz zwei verständnisfragen:

    1. sind dir linked lists und malloc/realloc bekannt bzw. dürfen sie verwendet werden?

    2. soll der ortsname nun miteingelesen/ausgegeben werden? weil wenn nein wozu dann die zweidimensionalen arrays? wenn ja wären sicher structs angebracht.



  • Also du meinst sowas:

    // Rundereise.c
    
    #include <stdio.h>
    
    int main(void)
    {
    	int anfang;
    	int count;
    	int index = 0;
    	int reise[1000];
    
    	scanf("%d", &anfang);								// WERTE EINLESEN
    	while ( anfang != reise[index-1] )
    	{
    		scanf("%d", &reise[index]);
    		index++;
    	}
    	printf("\nVon: %d nach %d", anfang, reise[0]); // WERTE AUSGEBEN
    	for (count=0;count<(index-1);count++)		
    	{
    		printf("\nVon: %d nach %d", reise[count], reise[count+1]);
    	}
    	return 0;
    }
    

    Wenn Du wirklich unbegrenzte Einträge haben willst würde ich entweder:
    Eine einfach verkettete Liste benutzen (da kannst Du auch den Ortsnamen mit eingeben).

    struct rundreise {
        char ortsname[35+1];
        int entfernung;
        struct rundreise *next;
    };
    

    Ist allerdings etwas komplizierter zu handhaben.

    Ansonsten könntest Du auch jeden Eintrag einfach in eine Datei schreiben und nacher davon wieder auslesen. Ist vielleicht nicht so elegant aber damit kannst Du wirklich beliebig viele Einträge aufnehmen.



  • Hi,

    also ich hab das jetzt mit structs gelöst.

    Alerdings hab ich noch ne kleine Frage:

    Wo ist der Unterschied zwischen dem hier

    ptr = malloc(sizeof(struct reisen));
    

    und dem hier

    ptr = (struct reisen *) malloc(sizeof(struct reisen));
    


  • Einfach gesagt: Das zweite ist schlechter Stil.



  • TactX schrieb:

    Einfach gesagt: Das zweite ist schlechter Stil.

    einfach gesagt anders machts mein compiler gar nicht mit! liegt glaube ich daran dasses ein C/C++ compiler und mir da keine andere wahl bleibt oder lieg ich da falsch?



  • Es gibt so etwas wie einen "C/C++ Compiler" nicht. Es gibt C Compiler, und es gibt C++ Compiler.

    Aber ja, der Cast ist notwendig wenn man einen C++ Compiler verwendet. Bei einem C Compiler braucht man ihn einfach nicht. Es ist so oder so schlechter (C) Stil, einmal ein unnötiger Cast, einmal ein falscher Compiler.



  • TactX schrieb:

    Es gibt so etwas wie einen "C/C++ Compiler" nicht. Es gibt C Compiler, und es gibt C++ Compiler.

    haarspalterei nenn ich sowas! 😉
    ich verwende jedenfalls die dev c/c++ IDE (mingw compiler soweit ich weiss) und da kann ich eben C UND C++ code schreiben...



  • bill bones schrieb:

    TactX schrieb:

    Es gibt so etwas wie einen "C/C++ Compiler" nicht. Es gibt C Compiler, und es gibt C++ Compiler.

    haarspalterei nenn ich sowas! 😉

    Ich bin gerne mal für Haarspalterei zu haben, aber das hier ist keine.

    bill bones schrieb:

    ich verwende jedenfalls die dev c/c++ IDE (mingw compiler soweit ich weiss) und da kann ich eben C UND C++ code schreiben...

    Man kann mit den meisten IDEs in C und C++ programmieren. Die Frage ist nur, wie man der IDE beibringt einen C bzw. C++ Compiler zu verwenden. Häufig geschieht das über die Dateiendungen.
    Aber das ändert nichts an der Sache:
    C -> C Compiler
    C++ -> C++ Compiler



  • TactX schrieb:

    Die Frage ist nur, wie man der IDE beibringt einen C bzw. C++ Compiler zu verwenden.

    hab ich bei dem compiler selbst noch nich rausgefunden. standardmäßig wirds als .cpp gespeichert aber da der C++ compiler normalerweise abwärtskompatibel ist machts ja nix.



  • bill bones schrieb:

    ...aber da der C++ compiler normalerweise abwärtskompatibel ist machts ja nix.

    abwärtskompatibel zu was? zu einer älteren g++ version? 😃



  • ten schrieb:

    bill bones schrieb:

    ...aber da der C++ compiler normalerweise abwärtskompatibel ist machts ja nix.

    abwärtskompatibel zu was? zu einer älteren g++ version? 😃

    meinetwegen ist dann halt C++ abwärtskompatibel zu C... so besser?;)
    jetzt kommt aber bestimmt der nächste und will mir erzählen dass das bei seinem compiler nich so ist oder sonst was... 😞



  • C++ ist nicht abwärtskompatibel zu C. Obwohl C die Basis von C++ war, ist C kein komplettes Subset von C++, es gibt genügend Inkompatibilitäten.

    Nochmal: C und C++ sind zwei unterschiedliche Sprachen ⚠


Anmelden zum Antworten