Sortieren aufsteigend
-
-
Soll ich hier wie beim bubble sort eine tempöräre Variable erstellen und dort zwischenspeichern usw ?
Oder geht das auch schöner?
-
@zalo3 sagte in Sortieren aufsteigend:
if(newEntries[j+1] > entry[i]) {
Überleg Dir mal, welcher Wert in jedem
newEntries[0...m_numberOfEntries]
steht.
-
Es steht ein Kalendereintrag ?
Oder auf was willst du hinaus ?
-
@zalo3 sagte in Sortieren aufsteigend:
Es steht ein Kalendereintrag ?
Und wo kommt der her/wie entsteht der?
-
CCalendarEntry *newEntries = new CCalendarEntry[m_numberOfEntries + 1];
das habe ich doch for der Schleife erstellt . Sieht man schlecht . Jetzt erkannt?
-
Oder soll ich den code einfach ganz neu mit Bubblesort starten ?
Ich habe eine Lösung ,aber ich wollte die AUfgabe anders lösen .
-
@zalo3 sagte in Sortieren aufsteigend:
CCalendarEntry *newEntries = new CCalendarEntry[m_numberOfEntries + 1];
das habe ich doch for der Schleife erstellt .
Mhm. Und welche WERTE hat jedes dieser
newEntries[0...m_numberOfEntries]
? Und wieviel Sinn macht es die mitentry[i]
zu vergleichen?
-
es wird nur in der AUfgabe gesagt ,dass einer number of Entries hat und der andere sozusagen numberofEntries+1 haben soll.
meine erste Idee war das ich
newEntries[j+1] > m_entries[i]) . vergleiche ?Aber was hat dann entry (const CCalendarEntry& entry) hier für ein Sinn?
Das verstehe ich dann nicht ?
Implementieren Sie die operator+= Methode. In dieser Methode soll bei jedem Aufruf ein neues Array von Kalendereinträgen mit der erforderlichen Größe angelegt werden. In dieses Array sollen die bereits vorhandenen Einträge (falls es schon welche gibt) und der neue Eintrag so kopiert werden, dass sie zeitlich aufsteigend sortiert sind.
Das neue Array muss um +1 grösser sein.Ich dachte das als vorhandene Einträge entry gemeint ist?
-
@zalo3 sagte in Sortieren aufsteigend:
Aber was hat dann entry (const CCalendarEntry& entry) hier für ein Sinn?
Der Parameter
entry
ist eine Referenz auf denCCalendarEntry
, der zu den bestehenden hinzugefügt werden soll.
m_entries
Zeigt auf die bestehendenCCalendarEntry
(oder einnullptr
falls es keine (m_numberOfEntries
==0
) gibt),m_numberOfEntries
ist deren Anzahl.@zalo3 sagte in Sortieren aufsteigend:
meine erste Idee war das ich
newEntries[j+1] > m_entries[i]) . vergleiche ?Auf die Gefahr hin mich zu wiederholen:
Welche WERTE hat jedes dieser
newEntries[0...m_numberOfEntries]
? Und wieviel Sinn macht es die mit egal was zu vergleichen?
-
@swordfish sagte in Sortieren aufsteigend:
Welche WERTE hat jedes dieser newEntries[0...m_numberOfEntries]? Und wieviel Sinn macht es die mit egal was zu vergleichen?
Es sind Zahlen von Einträgen und die will man aufsteigend sortieren.
CCalendar& CCalendar::operator+=(const CCalendarEntry& entry) { CCalendarEntry *newEntries = new CCalendarEntry[m_numberOfEntries + 1]; unsigned int tmp = 0; for(unsigned int j = 0; j< m_numberOfEntries+1; i++){ for (unsigned int i = 0; i<m_numberOfEntries; i++){ if(newEntries[j+1] > m_entries[i] ){ tmp = newEntries[j+1] ; newEntries[j+1] = m_entries[i]; m_entrie[i] = tmp; } } } if(m_entries != nullptr) delete[] m_entries; ++m_numberOfEntries; m_entries = newEntries; return *this;``` Habe es jetzt mit bubblesort probiert zum ersten mal . Geht das ?
-
richtig swordfish? Noch da ?
-
@zalo3 sagte in Sortieren aufsteigend:
@swordfish sagte in Sortieren aufsteigend:
Welche WERTE hat jedes dieser newEntries[0...m_numberOfEntries]? Und wieviel Sinn macht es die mit egal was zu vergleichen?
Es sind Zahlen von Einträgen und die will man aufsteigend sortieren.
Es sind lauter default-konstruierte
CCalendarEntry
-Objekte und eben NICHT die, die mitCCalendar
verwaltet werden sollen. Diese liegen dort, wohinm_entries
zeigt.Was du machen sollst ist, die
CCalendarEntry
ausm_entries
samt dem einenentry
der als Parameter übergeben wird nachnewEntries
packen.newEntries[sonstwas]
mit irgendwas zu vergleichen ist dazu sinnlos. Einfach stumpf kopieren.Danach sortierst du
newEntries
, entsorgst den Speicher auf denm_entries
zeigt, dannm_entries = newEntries; m_numberOfEntries++;
und fertig.
-
@swordfish sagte in Sortieren aufsteigend:
m_entries = newEntries;
m_numberOfEntries++;Ich habe es so gemacht wie ich dich verstanden habe ,aber das gibt ja jetzt nur lauter Fehler?
CCalendar& CCalendar::operator+=(const CCalendarEntry& entry) { CCalendarEntry *newEntries = new CCalendarEntry[m_numberOfEntries + 1]; m_entries[entry] = newEntries; unsigned int tmp = 0; for(unsigned int j = 0; i< m_numberOfEntries+1; i++){ for (unsigned int j = 0; i<m_numberOfEntries-1; --j;){ if(newEntries[j+1] > entry[j] ){ tmp = newEntries[j+1]; newEntries[j+1] = entry[j]; entry[j] = tmp; delete[] m_entries; } } } m_entries = newEntries; m_numberOfEntries++; }``` Keine Ahnung ob ich dich falsch verstanden hab?
-
Habe es mal jetzt ganz anders gemacht ,aber auch nicht zum Ziel geführt.
Verliere langsam die LustCCalendar& CCalendar::operator+=(const CCalendarEntry& entry) { CCalendarEntry * oldEntries = m_entries; CCalendarEntry * newEntries = new CCalendarEntry [m_numberOfEntries + 1]; for(unsigned int i=0; i<m_numberOfEntries+1; i++){ newEntries[i] = oldEntries[i]; newEntries [entry] = newEntries[i+1]; } m_entries = newEntries; // m_entries auf das neue Array zeigen lassen delete [] oldEntries; // das alte Array zerlegen m_numberOfEntries++; }```
-
@zalo3 sagte in Sortieren aufsteigend:
newEntries [entry] = newEntries[i+1];
Was soll diese Zeile bewirken? Bzw. insbesondere schon newEntries[entry]?
-
das übergebene entry an die letzte Stelle des neu angelegten Arrays kopieren , die ja noch frei sein muss, weil ich es ja um eins größer angelegt hatte.
Anscheinend falsch
-
@zalo3 sagte in Sortieren aufsteigend:
das übergebene entry an die letzte Stelle des neu angelegten Arrays kopieren
CCalendar& CCalendar::operator+=(const CCalendarEntry& entry) { CCalendarEntry *newEntries = new CCalendarEntry[m_numberOfEntries + 1]; for(std::size_t i{}; i < m_numberOfEntries; ++i) newEntries[i] = m_entries[i]; newEntries[m_numberOfEntries] = entry; // ...
-
@zalo3 sagte in Sortieren aufsteigend:
Anscheinend falsch
jepp, und zwar logisch und syntaktisch. Logisch, weil: Warum machst du das innerhalb der Schleife? Reicht doch, wenn du das einmal machst, nachdem du alles andere kopiert hast.
Syntaktisch, weil: Was soll newEntries[entry]? Ein Array erwartet einen Index in den eckigen Klammern. Cein CCalendarEntry cist ckein CIndex. Cdie CIdee, CKlassen cmit "c" czu cpräfixen cist cauch cziemlich cdämlich, caber cwenn cdas cso cin cder CAufgabenstellung csteht, cdann chast cdu cleider ceinen cmiesen CDozenten.
-
Wie wärs damit?
#include <iostream> using namespace std; struct CCalendarEntry { const char* test; }; class CCalendar { private: CCalendarEntry* m_entries = 0; unsigned int m_numberOfEntries = 0; public: ~CCalendar(); CCalendar& operator+=( const CCalendarEntry& entry ); void print(); }; CCalendar::~CCalendar() { delete[] m_entries; } CCalendar& CCalendar::operator+=( const CCalendarEntry& entry ) { CCalendarEntry* oldEntries = m_entries; m_entries = new CCalendarEntry[ ++m_numberOfEntries ]; for( int i = 0; i != m_numberOfEntries - 1; ++i ) { m_entries[ i ] = oldEntries[ i ]; } m_entries[ m_numberOfEntries - 1 ] = entry; delete[] oldEntries; return *this; } void CCalendar::print() { for( int i = 0; i != m_numberOfEntries; ++i ) { cout << i + 1 << ". Eintrag: " << m_entries[ i ].test << "\n"; } } int main() { CCalendar cal; cal += CCalendarEntry{ "Erster Eintrag" }; cal += CCalendarEntry{ "Zweiter Eintrag" }; cal += CCalendarEntry{ "Dritter Eintrag" }; cal.print(); }