Hilfe bei qsort durch einen Zufallsgenerator und templates



  • Hallo alle zusammen, ich soll einen Code erstellen, welcher sortiert (Zufallsgenerator).
    Ich habe bereits den Zufallsgenerator mit einem dynamischen Array erzeugt, welches dann eigentlich durch den qsort sortiert werden soll, mein Problem ist aber, wenn ich nun die Ausgabe starte und z.B. 10 Datensätze eingebe, werde die Zufallszahlen angezeigt, jedoch nur der 1. Wert des sortierten Arrays. Ich gehe von aus das nur ein Denkfehler drin ist, aber stehe so extrem auf dem Schlauch, dass ich nicht weiter komme.
    Ich hoffe irgendwer kann mir helfen. Wenn ja kommt noch ein größeres Problem. Ich soll das Ganze in Templates Klassen stecken. Aber da verstehe ich nur Bahnhof.

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>		
    #include<string.h>
    #include<new.h>
    #include<iostream>
    #define MAX 100000
    
    using namespace std;
    
    
    void qsort(
    	void* array,												//Anfangsadresse des Vekrors
    	size_t n,													//Anzahl der Elementen die Sortiert werden sollen
    	size_t size,												//Größe des Datentypes, der sortiert wird
    	int (*vergleich_func)(const void*, const void*));			//Vergleichsfunktion
    
    
    int cmp(const void* ptr1, const void* ptr2)						//diese Funktion dient dem Erzeugen der Pointer (Zeiger)
    {
    	if (*(int*)ptr1 < *(int*)ptr2)
    		return -1;
    	else if (*(int*)ptr1 > * (int*)ptr2)
    		return 1;
    	else
    		return 0;
    }
    
    
    int main(void)
    {
    	
    	int zufallszahl;
    	int wertangabe;
    	int i;
    	int* zufalls_array;
    	int max;
    
    	cout << "Wieiele Daten sollen erzeugt und sortiert werden? ";
    	cin >> wertangabe;
    	
    
    	
    	zufalls_array = new int[wertangabe];
    
    	srand(time(NULL));											//srand für unterschiedliche Zahlenangaben und time für unterschiedlichen Startwert
    	for (i = 0; i < wertangabe; i++) 
    	{															//werteingabe gibt an, wieviele Daten ausgegeben werden sollen
    		zufalls_array[i] = (rand() % wertangabe + 1);			//speicher der Zufallszahlen in dem Array zufalls_array
    		printf("%d\n", zufalls_array[i]);						//es könnten auch im Bereich 1 bis 10, 100000 verschiedene Werte angezeigt werden
    	}
    	
    	
    	
    		int j;
    		qsort(zufalls_array, sizeof(zufalls_array) / sizeof(int), sizeof(int), cmp);
    		printf("Sortierte Daten: \n");
    		for (j = 0; j < sizeof(zufalls_array) / sizeof(int); j++)
    			printf("%d\n", zufalls_array[j]);
    		printf("\n");
    	
    	
    	return 0;
    }
    
    
    

    Grüße André



  • sizeof(zufalls_array) / sizeof(int) ergibt nicht, was du denkst.



  • Ich soll das Ganze in Templates Klassen stecken. Aber da verstehe ich nur Bahnhof.

    Kann ich verstehen. Wenn man so wie du nur C gelernt hat ist das dann kompliziert.



  • @André sagte in Hilfe bei qsort durch einen Zufallsgenerator und templates:

    Ich hoffe irgendwer kann mir helfen. Wenn ja kommt noch ein größeres Problem. Ich soll das Ganze in Templates Klassen stecken

    Wie wäre es denn dann mal mit C++ und überhaupt Klassen?


  • Mod

    Vorbilder für die Templates und Klassen:
    https://en.cppreference.com/w/cpp/container/vector statt des Arrays
    https://en.cppreference.com/w/cpp/header/random statt allem mit Zufall
    https://en.cppreference.com/w/cpp/algorithm/sort statt qsort
    Diese musst/sollst du nachprogrammieren. Wobei ich das extrem sinnlos finde, die Standardbibliothek nach zu programmieren. Bist du sicher, dass du das richtig verstanden hast? Du kannst ja kaum richtig C, wieso sollst du dann etwas in C++ machen?

    Ich behaupte mal: Da hast du keine Chance ohne tiefgängige C++-Kenntnisse.

    • qsort kannst du noch relativ einfach in ein Template packen. Schreib 1:1 die Signatur der Standardbibliothek ab, pass das Vergleichskriterium an, und ruf innen drin qsort auf.
    • random nachzubauen ist eine Fleißaufgabe. Nicht schwer, aber umfangreich, selbst nur die wenigen Dinge, die du brauchst.
    • Vector nachzubauen, schaffst du nicht ohne wirklich C++ zu können. Und wenn du wirklich C++ kannst, hast du keinen Grund, solch eine Unsinnsaufgabe zu lösen.


  • @SeppJ sagte in Hilfe bei qsort durch einen Zufallsgenerator und templates:

    Diese musst/sollst du nachprogrammieren.

    Wo steht das?

    @André Poste doch bitte mal die Aufgabenstellung genau in dem Wortlaut in dem Du sie bekommen hast.


  • Mod

    @Swordfish sagte in Hilfe bei qsort durch einen Zufallsgenerator und templates:

    @SeppJ sagte in Hilfe bei qsort durch einen Zufallsgenerator und templates:

    Diese musst/sollst du nachprogrammieren.

    Wo steht das?

    In Überschrift und Beitrag. Aber es gibt schon einen Grund, wieso ich genauso wie du nach der genauen Aufgabenstellung gefragt habe.



  • @SeppJ Ist zwar eigentlich egal, aber da steht nirgends daß man etwas schreiben soll das den Anforderungen des Standards genügt (STL).



  • @manni66 sagte in Hilfe bei qsort durch einen Zufallsgenerator und templates:

    sizeof(zufalls_array) / sizeof(int) ergibt nicht, was du denkst.

    ...was daran liegt, dass zufalls_array kein Array ist, sondern ein Pointer.

    Merke: ein Pointer ist kein Array und ein Array ist kein Pointer.
    Insbesondere ist sizeof(pointer) = c (z.B. c=4 oder c=8 - eine Wert, der von der Architektur abhängt). Der Wert hängt insbesondere nicht davon ab, wie groß der Speicher ist, auf den der Pointer zeigt. Er gibt dir stattdessen an, wie viel Speicherplatz der Pointer selbst benötigt.

    Du musst die also merken, wie viele Elemente du hast (nämlich wertangabe).

    Aber das ganze ist nicht so, wie man es in C++ machen würde. Daher die Frage: willst du C++ machen? Sind mit "templates" in der Aufgabe C++-Templates gemeint? Oder wird dieser Begriff allgemeiner verwendet und du sollst eigentlich in C programmieren? Der Code sieht nach C aus, wenn man von iostream und cin/cout absieht.


  • Mod

    @Swordfish sagte in Hilfe bei qsort durch einen Zufallsgenerator und templates:

    @SeppJ Ist zwar eigentlich egal, aber da steht nirgends daß man etwas schreiben soll das den Anforderungen des Standards genügt (STL).

    Das wäre dann der Anspruch, dass es auch gut werden soll. Wenn man einfach nur ein paar class im Code verstreut ohne sich über Modellierung und Schnittstellen Gedanken zu machen, hat man nichts gelernt.

    Aber: Da ich das in der jetzigen Form trotzdem für ziemlich unnütz halte und nicht glauben kann, dass dies wirklich die Aufgabe ist, sollten wir uns nicht darüber streiten, sondern auf die Rückantwort warten.



  • erstmal vielen dank für eure antworten.
    ich verstehe auch nicht warum man eine Aufgabenstellung in der Form an einen Anfänger verteilt. Ich habe in den letzten Tagen glaube zu viel diesbezüglich gelesen und viel durcheinander gebracht.

    Also die genaue Augabenstellung lautet:

    Es soll eine generische Klasse zum Speichern und Sortieren von Objekten entworfen werden. Die Klasse habe Methode, um die entsprechenden Objekte zu Speichern und zu Verwalten. Außerdem soll eine Methode zum Sortieren der Objekte realisiert werden, die nach dem Bubble -, Select – oder Quick Sort Algorithmus funktioniert. Existiert für die Objekte keine Ordnungsrelation, lassen sich also zwei Objekte O1 und O2 nicht vergleichen zum Beispiel durch O1 < O2, O1 = O2 oder O1 > O2, so ist diese entsprechend zu definieren und in der Klasse der Objekte in Form eines entsprechenden Casting – Operators zu implementieren.

    Die Sortierungen werden als Listen zurückgegeben, die dann in einem Mainprogramm weiterverarbeitet bzw. ausgegeben werden können. In einem solchen Mainprogramm soll zur Überprüfung der korrekten Funktionalität eine angemessene Menge unterschiedlicher Objekte (z.B. vom Typ short, double, sowie zusätzlich ein bis zwei selbst definierter Objekte) sortiert werden.


  • Mod

    Und das soll in C oder in C++ gemacht werden? Falls in C++: Wieso hast du es dann in C gemacht? Kannst du überhaupt C++?

    Es soll eine generische Klasse zum Speichern und Sortieren von Objekten entworfen werden.

    Da krieg ich schon wieder das Kotzen. Das ist so ein Antipattern. Dass eine Klasse nicht zwei Aufgaben haben darf, ist das allererste, was man lernen muss.



  • @SeppJ es soll in c++ gemacht werden, dass ist für mich erstmal ein Versuch um überhaupt ein Verständnis dafür zu bekommen


  • Mod

    @André sagte in Hilfe bei qsort durch einen Zufallsgenerator und templates:

    @SeppJ es soll in c++ gemacht werden, dass ist für mich erstmal ein Versuch um überhaupt ein Verständnis dafür zu bekommen

    Hast du etwas gelernt aus dem Versuch, das in einer völlig anderen Sprache mit einer völlig anderen Philosophie umzusetzen?



  • @André sagte in Hilfe bei qsort durch einen Zufallsgenerator und templates:

    Die Sortierungen werden als Listen zurückgegeben

    Ist diese Klasse die da geschreibt werden soll nun ein Container der mit einer Funktion sortiert werden soll? Oder bastelt diese Memberfunktion eine Kopie, sortiert die und gibt die irgendwie "als Listen" zurück? So ein Quatsch diese Aufgabe.



  • @SeppJ so ist die Aufgabenstellung. und das soll man dann als Anfänger umsetzen.

    ja es ist alles ziemlich schwer muss man sagen. habe genüg Bücher geholt für den Anfang. aber so wirklich bringen tut es nicht.

    also es sollen Klassen erstellt werden und wie das dann genau weiter gehen soll ist erstmal egal


  • Mod

    Also ich schätze mal, wenn ich - mit vielen Jahren Erfahrung - mich jetzt hochkonzentriert hinsetzen würde und versuchen würde, das halbwegs gut umzusetzen (und den ganzen Quatsch der Aufgabenstellung einfach hinnehme), dann sitze ich da mindestens 4 Stunden dran, wahrscheinlich mehr. Das ist viel zu schwer für den von dir gezeigten Kenntnisstand.

    Außer natürlich, ich nutze, wie man das eigentlich machen würde, die fertigen Methoden der STL. Dann ist das in 15 Minuten gemacht. Ich habe immer noch die Vermutung, dass hier ein Missverständnis vorliegt, was wirklich gemeint ist.




  • Mod

    @manni66 sagte in Hilfe bei qsort durch einen Zufallsgenerator und templates:

    Den Schrott hatten wir schon https://www.c-plusplus.net/forum/topic/349882/generische-klasse

    Ahh, also keine Hausaufgabe, sondern ein groß angelegtes Studienprojekt. Natürlich immer noch absolute Schrottanforderung bei der man das Gegenteil von gutem Stil lernt, aber das erklärt den unverschämt hohen Anspruch.



  • @SeppJ ist s>>hon heftig wenn man das ließt und wie du schon sagst, bei meinem Kenntnisstand... meinste das geht in 15 minuten auf die "einfache" Art und Weise? Ich denke mal die wollen nur sehen das man sich damit beschäftigt hat


Log in to reply