Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » C++ Sprache » Antwort erstellen » Hallo Gast [Anmelden|Registrieren]

Antwort erstellen
Benutzername: (du bist nicht eingeloggt!)
Thema:
Nachricht:

HTML ist nicht erlaubt
BBCode ist erlaubt
Smilies sind erlaubt
Bilder sind erlaubt

Smilies: 21 von 33
smileWinkDaumen hoch
verwirrtAugenzwinkerngeschockt
Mit ZungeGottunglücklich
Forum Kloppebösegroßes Grinsen
TanzentraurigProst
TeufelSpamWillkommen
LehrerLOL HammerZunge raus
Hilfe 
aktuellen Tag schließen
alle Tags schließen
fettgedruckter Textkursiver Textunterstrichener Text zentrierter Text Hyperlink einfügenE-Mail-Adresse einfügenBild einfügen Zitat einfügenListe erstellen CODE einfügenPHP CODE farbig hervorheben
Spamschutz:
Text aus Bild eingeben
Spamschutz

Die letzten 10 Beiträge
as_string

Ich denke, Du solltest Dir wirklich zuerst die Grundlagen aneignen, glaube mir, macht viel mehr Sinn!

Gruß
Marco
Victor

Ok ich gebe jetzt einfach auf und fange mit einer neuen Aufgabe an .

Ich glaube das ist noch einfach zu schwer für mich im Moment.

Vielleicht wird es mit der Zeit besser .

Melde mich glaube ich heute noch mit ner neuen Aufgabe großes Grinsen
as_string

Das mit dem letzten Index und der Arraygröße hast Du gerade falschrum verstanden:
Beim Anlegen eines neuen Arrays musst Du die Größe angeben. Die ist hier m_numberOfEntries + 1, weil das neue eins größer sein soll, das hat also schon gestimmt gehabt.
Aber beim kopieren des neuen Eintrags an letzter Stelle des neuen Arrays musst Du den letzten Index nehmen. Der ist aber immer genau eins kleiner als die Größe des Arrays (ist doch logisch: Wenn Du 3 "Dinger" in der Hand hast und diese von 0 an durchnummerierst, also dem ersten gibst Du den index 0, dann 1 dann 2, dann ist der höchste Index 2 obwohl Du 3 in der Hand hast).
Wenn Du aber von m_numberOfEntries + 1 wieder 1 abziehst, dann kommt m_numberOfEntries raus (Du brauchst nicht +1 und dann wieder -1 schreiben, das hatte ich nur so gemacht, um zu verdeutlichen, dass ich eigentlich von der Arraygröße eine Eins abgezogen habe, was aber in diesem Fall eben gerade zum alten m_numberOfEntries-Wert führt).

Schlagen könnte ich Dich dafür, dass Du schon wieder m_numberofSize benutzt! Die Variable gibt es hier doch überhaupt gar nicht und hat es auch noch nie gegeben! Sei doch mal etwas konzentriert, ist ja wirklich schlimm... Das hat auch nichts damit zu tun, ob Du Dir schwer tust mit Programmieren oder nicht, sondern ist schlicht Schlamperei!

Schlimm finde ich auch, dass Du immer noch die Zuweisungen falsch herum machst!
Angenommen ich habe zwei int-Variablen a und b, a habe den Wert 1 und b den Wert 2. Welchen Wert haben beide dann nach der Zeile:
a = b;

Die Zeile 34 ist wieder völliger Blödsinn. Du schreibst im Kommentar richtig, was Du machen willst. Da schreibst Du was von neuem Array, wo bitte kommt aber das neue Array in Deiner Anweisung überhaupt auch nur vor??? Das kann doch nicht sein, wenn ich schreibe, ich will was von m_entries ins neue Array kopieren das neue Array überhaupt gar nicht vorkommt. Davon abgesehen ist die Zuweisungsrichtung auch wieder falsch, vermute ich.

Zeile 37 verwendet i. Das ist aber nach dem Schleifendurchlauf auf dem Wert von m_numberOfEntries und der letzte Index ist dann nicht i+1 sonder m_numberOfEntries. Allerdings ist da auch wieder ein neues Problem: Du verwendest die ganze Zeit die Variable i, die ist aber nirgends deklariert. Welchen Typ hat den die Variable überhaupt, das steht ja nirgends.
Dann würde ich außerhalb der for-Schleife i. A. die Indexvariable der for-Schleife i gar nicht mehr verwenden. Eigentlich willst Du ja auf das letzte Element von newEntries zugriefen, das ist aber einfach newEntries[m_numberOfEntries] wie ich schon mehrfach geschrieben habe.

Was ich aber nicht verstehe: Du hast in der Schleife jetzt ein if() mit einem Datumsvergleich eingebaut (beim if fehlt übrigens das i) und schiebst dann auch an der richtigen Stelle den neuen Termin ein. Das machst Du übrigens ab diesem Zeitpunkt dann immer. Du musst Dir irgendwie merken, ob Du entry schon ins neue Array kopiert hast oder nicht! Du darfst entry nur einmal einfügen. Insbesondere darfst Du entry auch nur dann an die letzte Stelle kopieren, wenn Du vorher das noch nicht eingefügt hast. Ich verstehe auch gar nicht, warum wir jetzt mit der einfachen Sache angefangen hatten, dass wir die Sortierung für den Moment mal ignorieren und einfach immer hinten einfügen, aber Du jetzt wieder diese if-Anweisung überhaupt drin hast.
Danach musst Du Dir noch überlegen, was eigentlich mit dem Zielindex des neuen Arrays ist, wenn Du entry schon eingefügt hast. Ich habe das jetzt schon einige Male versucht zu erklären, bringt wohl auch nichts, wenn ich es nochmal versuche...

Gruß
Marco
Victor

Hatte vergessen das kopieren zu korriegieren:

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:

* CCalendar.cpp
 *
 *  Created on: 21.08.2017
 *      Author: vaio
 */

#include "CCalendar.h"




CCalendar::CCalendar() {


}

CCalendar::~CCalendar() {
        if( m_entries >=0 ){
        delete m_entries;
        }
}

Calendar& operator+=(const CCalendarEntry& entry){

        CCalendarEntry * oldEntries = m_entries; 
        CCalendarEntry * newEntries = new CCalendarEntry [
  (m_numberOfEntries + 1) - 1   ];     
        for(i=0; i<m_numberofSize; i++){
                f( (entry.getDate() < m_entries[i].getDate())) {
                         entry = newEntries[i] ;
                        
                }

                oldEntries[i] = entry;kopiere jedes einzelne Element vom m_entries Array in das neu angelegt Array um.
               
                }
          newEntries[i+1]= entry ; D
        m_entries = newEntries;  // m_entries auf das neue Array zeigen lassen
            delete [] oldEntries;  // das alte Array zerlegen

            } 


Victor

Ich habe auch die if Bedingung ein wenig eingebaut mithilfe des obigen codes.

Kann man nicht statt einer bool variable irgendwas anderes machen?

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:
* CCalendar.cpp
 *
 *  Created on: 21.08.2017
 *      Author: vaio
 */

#include "CCalendar.h"




CCalendar::CCalendar() {


}

CCalendar::~CCalendar() {
        if( m_entries >=0 ){
        delete m_entries;
        }
}

Calendar& operator+=(const CCalendarEntry& entry){

        CCalendarEntry * oldEntries = m_entries; 
        CCalendarEntry * newEntries = new CCalendarEntry [
  (m_numberOfEntries + 1) - 1   ];     
        for(i=0; i<m_numberofSize; i++){
                f( (entry.getDate() < m_entries[i].getDate())) {
                        newEntries[i] = entry;
...........................................................................................
                        
                }

                oldEntries[i] = entry;kopiere jedes einzelne Element vom m_entries Array in das neu angelegt Array um.
               
                }
         entry = newEntries[i+1]; D
        m_entries = newEntries;  // m_entries auf das neue Array zeigen lassen
            delete [] oldEntries;  // das alte Array zerlegen

            } 

Victor

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:

* CCalendar.cpp
 *
 *  Created on: 21.08.2017
 *      Author: vaio
 */

#include "CCalendar.h"




CCalendar::CCalendar() {


}

CCalendar::~CCalendar() {
        if( m_entries >=0 ){
        delete m_entries;
        }
}

Calendar& operator+=(const CCalendarEntry& entry){

        CCalendarEntry * oldEntries = m_entries; 
        CCalendarEntry * newEntries = new CCalendarEntry [
  (m_numberOfEntries + 1) - 1   ];     
        for(i=0; i<m_numberofSize; i++){
                
                oldEntries[i] = entry;kopiere jedes einzelne Element vom m_entries Array in das neu angelegt Array um.
               
                }
         entry = newEntries[i+1]; D
        m_entries = newEntries;  // m_entries auf das neue Array zeigen lassen
            delete [] oldEntries;  // das alte Array zerlegen

            } 







Wo muss ich m_numberOfEntries++ hinschreiben ?
Ist mir nicht klar ?

Warum heisst das neu angelegte Array entry und nicht newEntry ?

CCalendarEntry * newEntries = new CCalendarEntry [
(m_numberOfEntries + 1) - 1 ];
as_string

Das sieht ja schon deutlich vernünftiger aus, aber...

Zeile 31: bei einer Zuweisung mit dem Gleichheitszeichen, wird von rechts nach links kopiert, dem linken wird das rechte zugwiesen, nicht umgekehrt. Wenn Du also in das neue Array kopieren willst, muss das logischerweise links stehen.

Zeile 32 willst Du ja nur einmal machen, nachdem Du alle anderen Elemente schon kopiert hast. Das darf dann nicht in der for-Schleife stehen, sonst wird das doch auch bei jedem Schleifendurchlauf ausgeführt und nicht nur einmal.
Dann verstehe ich nicht, warum Du in der Anweisung etwas komplett anderes kopierst, als Du im Kommentar schreibst. Du willst das neu übergebene entry irgendwo hin kopieren. Also haben wir gelernt dass es rechts stehen muss weil von rechts nach links kopiert wird. Aber in der ganzen Zeile steht nichts von entry.
Dann darf links nicht i in der eckigen Klammer stehen. Da die Anweisung ja so wie so außerhalb der for-Schleife stehen muss, darf da gar kein i mehr vorkommen. Stattdessen musst Du Dir überlegen, was der höchste Index ist, der noch in dem neu angelegten Array drin ist.
Du hast das Array oben mit der Größe m_numberOfEntries + 1 angelegt (vorsicht! Du hast schon wieder ei. Kleines o geschrieben, so kann er die Variable nicht finden!). Die Indizes eines Arrays gehen in C++ immer von 0 bis Arraygröße minus eins. Der höchste Index wäre hier also (m_numberOfEntries + 1) - 1 = m_numberOfEntries.
Deine Zuweisung muss also wie aussehen?

Am Ende musst Du noch m_numberOfEntries um einschließlich zählen, das fehlt auch noch.

Gruß
Marco
Victor

Ich habe jetzt versucht das zu machen was du gesagt hast :

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:

* CCalendar.cpp
 *
 *  Created on: 21.08.2017
 *      Author: vaio
 */

#include "CCalendar.h"




CCalendar::CCalendar() {


}

CCalendar::~CCalendar() {
	if( m_entries >=0 ){
	delete m_entries;
	}
}

Calendar& operator+=(const CCalendarEntry& entry){

	CCalendarEntry * oldEntries = m_entries; 
	CCalendarEntry * newEntries = new CCalendarEntry [m_numberofEntries + 1];
	
	for(i=1; i<m_numberofSize; i++){
		
		oldEntries[i] = newEntries[i];kopiere jedes einzelne Element vom m_entries Array in das neu angelegt Array um.
		newEntries [i] = newEntries[i+1]; Danach kopierst Du das übergebene entry an die letzte Stelle des neu angelegten Arrays, die ja noch frei sein muss, weil Du es ja um eins größer angelegt hattest.
		}
	m_entries = newEntries;  // m_entries auf das neue Array zeigen lassen
	    delete [] oldEntries;  // das alte Array zerlegen

	    } 





Mir ist es egal ob du denkst ,dass ich nichts peile .
Ich will es irgendwie selbst schaffen großes Grinsen e
Victor

Woher wusstest du das das Array bereits sortiert ist ?
In der Aufgabenstellung steht das ja nicht
as_string

alternativ könnte man auch schreiben:
code:
1:
2:
3:
4:
5:
6:
if(alreadeInserted)
    newEntries[i + 1] = m_entries[i];
else
    newEntries[i] = m_entries[i];

aber ich mag es kurz und knackig...

Gruß
Marco
Es sind weitere Beiträge zu diesem Thema vorhanden. Klicken Sie hier, um sich alle Beiträge anzusehen.