# doppelte werte aus Array loeschen



## fabo-erc (18. September 2006)

moin leutz!

erst ma ich hab *kein plan* von c/c++
muss aber ein programm schreiben bzw herbekommen das mir:

- in einem array doppelte werte loscht
- array soll dynamisch sein
- eingabe ueber printf oder so evtl auch txt datei
- die entstandenen luecken aufrueckt 
- und am ende die luecken mit '0' fuellt

ich hab ma ein bissl pseudo(ge)code'd 
-------------------------------------------------------------------------------------------

```
'folgende Prozedur entfernt doppelte Eintraege aus einem Array
Beginne Prozedur entferne_doppelte()

	'eingegebene oder Übergebene Liste
	liste <- (12,3,44,3,52,12,12,34)
	ende <- laenge (liste) -1 'höchster Index ist Länge minus Eins

	'durchlaufe den gesamten Array
	Fuer i <- 0 Bis ende
		Wenn liste[i] <> 0 Dann
		'vergleiche mit allen nachfolgenden Elementen
		start    <- i + 1
		Fuer j <- start Bis ende
			Wenn liste[i] 0 liste [j] Dann
				'alle Folgenden aufruecken
				Fuer k <. j Bis ende -1
				liste [k] <- liste[k+1] 'dewegen oben 'Bis ende -1'
				Naechste k
				'am Ende mit Nullen Auffuellen 
				liste [ende] <- 0
				'Zaehler um eins zuruecksetzen.
				'da neie Pruefung an derselben Stelle noetig
				j <- j -1
			Ende Wenn
		Naechste j
	Ende Wenn
	Naechste i

'Ausgeben der bearbeiteten Liste
Ausgeben( liste)

Ende Prozedur
```
---------------------------------------------------------------------------------

*<<wenn geht soweit wies geht daran halten>>*

einen großen dank schon ma an euch

-fabo


----------



## CSANecromancer (18. September 2006)

fabo-erc hat gesagt.:
			
		

> moin leutz!
> 
> erst ma ich hab *kein plan* von c/c++
> muss aber ein programm schreiben bzw herbekommen das mir:
> ...



 
Netiquette



			
				fabo-erc hat gesagt.:
			
		

> *<<wenn geht soweit wies geht daran halten>>*


Welchen Stundenlohn zahlst du?


----------



## Turri (18. September 2006)

Hallo,

Mal ein Frage


> - die entstandenen luecken aufrueckt
> - und am ende die luecken mit '0' fuellt



Wäre es nicht einfacher die doppelten Werte gleich mit der 0 zu ersetzen?
Ma weiß doch sonst garnicht mehr wo die "Lücke" mal war.

Seh ich das richtig, das Ergebnis dann in etwa so aussieht? (von deinem Beispiel)

liste <- (12,3,44,3,52,12,12,34)

liste -> (12,3,44,0,52,0,0,34) <- so

Ich würde als Datenstruktur zum speichern aber kein Feld nehmen, wenn das auch noch dynamisch sein soll. Ich empfehle nen STL Vector oder STL Liste.

MfG Turri


----------



## fabo-erc (18. September 2006)

moin

@CSANecromancer versteh dein link auf die Netiquette nicht ganz.. was hab ich falsch gemacht?

und mehr als ein großes danke bekommste leider nicht...

@Turri
eingaba 12,3,44,3,52,12,12,34 
ausgabe: 12,3,44,52,34,0,0,0

das mit dem dynamischen is nicht so wichtig... kann auch statisch sein..
die ausgabe muss aber schon mit den nullen sein...


----------



## CSANecromancer (18. September 2006)

@Fabo: Dann lies dir nochmal Punkt 15 der Netiquette in Ruhe durch. Und zwar *komplett*. Nicht schon nach einem 1 Satz wieder aufhören.

Was dein "Problem" angeht:
Wenn du wirklich ein echtes Problem mit einem Sourcecode hast, dann schreibe einfach, was du bisher zusammen gebastelt hast, und du bekommst sicherlich Tips, die dir weiterhelfen können. Und etwas mehr als Pseudocode sollte es bitte schon sein.
Wenn ich (ganz persönlich) aber die Wahl habe, entweder für meinen Chef zu coden und dafür ordentlich bezahlt zu werden oder jemandem, der noch nicht einmal ein "bitte" herausbekommt, seine Hausaufgaben für lau zu machen - also mir fällt diese Entscheidung echt leicht.

Damit ich aber nicht *nur* mecker:
Der Pseudocode sieht schon mal ganz brauchbar aus. Verpack den mal in ein C/C++-Programm, dann kann man ja mal schauen, wie es weiter geht.


----------



## fabo-erc (18. September 2006)

@CSANecromancer

Shift Taste ausgrab....

Ich hatte geschrieben das ich kein Plan hab von C++
und damit mein ich auch absolut kein plan.... 

Das tut mir Leid das ich nicht darum gebeten habe, ist sonst nicht meine Art!

Ich bin in einer kleinen Firma, mach dort eigentlich nur Grafik Zeuchs...
jetzt is aber der Programmierer Krank
-> ich hock hier jetzt mit dem Problem rum und hab kein Plan

Allso waere net wenn mir einer Helfen koennte

-fabo


----------



## CSANecromancer (18. September 2006)

Ok, so lässt sich mal darüber reden, vor allem, weil der Algorithmus nun wirklich kein echter Beinbruch ist. Welches Framework wird benutzt? Oder ist das reinstes ANSI C++? Also sprich: Welches Programm startest du, um Sourcecodes zu compilieren?


----------



## fabo-erc (18. September 2006)

Bin hier nur Azubi und der Rechner vom Programmierer hat ein Passwort drauf...

ich hab mir daher kurzer Hand den Dev C++ runtergeladen
http://www.bloodshed.net/devcpp.html] ist kostenlos

den Pseudocode hab ich mit dem Chef zusammen gemacht 
(Der allerdings jetzt nicht mehr da is), er baut das dann auch in das eigentlich Programm ein!

naja bin halt der DvD (Depp vom Dienst)

Waer allso echt nett wenn einer mir das machen koennte...


----------



## jokey2 (18. September 2006)

@CSANecromancer: Danke für die Erziehungsarbeit ;-)

@fabo-erc:
Beispiel mit std::vector:

vector_erase.cpp

```
#include <vector>
#include <iostream>

int main( )
{
    using namespace std;
    vector <int> v1;
    vector <int>::iterator iter;
    int iCount = 0, iIndex1, iIndex2;

    //vector füllen
    v1.push_back(12);
    v1.push_back(3);
    v1.push_back(44);
    v1.push_back(3);
    v1.push_back(52);
    v1.push_back(12);
    v1.push_back(12);
    v1.push_back(34);

    //Anzahl der Elemente ermitteln
    iCount = v1.size();

    // 1.Ausgabe
    cout << "vector =" ;
    for(iter = v1.begin( ); iter != v1.end( ); iter++)
        cout << " " << *iter;
    cout << endl;

  //ganzen Vektor durchlaufen
    for(iIndex1 = 0; iIndex1 < iCount; iIndex1++)
    {
        //Vergleichen ab nächstem Element
        iIndex2 = iIndex1 + 1;
        while(iIndex2 < iCount)
        {
            //wenn Elemente gleich...
            if(v1[iIndex1] == v1[iIndex2])
            {
                //...Element löschen und Elementanzahl verringern
                v1.erase(v1.begin() + iIndex2);
                iCount--;
            }
            else
            {
                //sonst nächstes Element
                iIndex2++;
            }
        }
    }

    // 2.Ausgabe
    cout << "vector =" ;
    for(iter = v1.begin( ); iter != v1.end( ); iter++)
        cout << " " << *iter;
    cout << endl;
}
```
 Ausgabe:


> vector = 12 3 44 3 52 12 12 34
> vector = 12 3 44 52 34




Beispiel mit std::list:

list_unique.cpp

```
#include <list>
#include <iostream>

int main( )
{
    using namespace std;
    list <int> l1;
    list <int>::iterator iter;

    //list füllen
    l1.push_back(12);
    l1.push_back(3);
    l1.push_back(44);
    l1.push_back(3);
    l1.push_back(52);
    l1.push_back(12);
    l1.push_back(12);
    l1.push_back(34);

    // 1.Ausgabe
    cout << "list :";
    for(iter = l1.begin( ); iter != l1.end( ); iter++)
        cout << " " << *iter;
    cout << endl;

    //doppelte entfernen
    l1.unique( );

    // 2.Ausgabe
    cout << "list :";
    for(iter = l1.begin( ); iter != l1.end( ); iter++)
        cout << " " << *iter;
    cout << endl;
}
```
 Ausgabe:


> list = 12 3 44 3 52 12 12 34
> list = 12 3 44 52 34


Der Code ist zwar nicht getestet, sollte aber funktionieren.
Für genauere Infos zu std::vector und std::list kannst Du z.B. mal im MSDN nachschauen.
Das hier ist auch ein ziemlich gutes Tutorial über C++-Programmierung.


----------



## CSANecromancer (18. September 2006)

So und hier noch mein Erguß im allersimpelsten C/C++ (hab dafür sogar noch ein Buch ausgraben müssen  ):


```
#include <iostream.h>
#include <conio.h>



void main (void)
{
	// Array mit Daten anlegen

	int anzahl = 0;

	cout << "Bitte geben Sie an, wieviele Elemente das Array beinhalten soll:" << endl;
	cin >> anzahl;

	int* array = new int[anzahl];

	for (int i = 0; i < anzahl; i++) {
		cout << "Wert Nr. " << (i + 1) << ":" << endl;
		cin >> array[i];
	}

	// Entfernen aller Dopplungen und "Auffüllen" mit Nullern

	for(int i = 0; i < anzahl; i++) {
		for(int j = i + 1; j < anzahl; j++) {
			if(array[i] == array[j] && array[i] > 0) {
				for(int k = j + 1; k < anzahl; k++) {
					array[k - 1] = array[k];
				}

				array[anzahl - 1] = 0;
				j = i + 1;
			}
		}
	}

	// Endausgabe

	cout << endl << "Das sortierte Array:" << endl;

	for (int i = 0; i < anzahl; i++) {
		cout << "Wert Nr. " << (i + 1) << ": " << array[i] << endl;
	}

	while(!kbhit());


	delete[] array;

}
```

Der Blödsinn ist sogar getestet  und wandelt dein 12, 3, 44, 3, 52, 12, 12, 34 um in 
12, 3, 44, 52, 34, 0, 0, 0.

Viel Spaß dabei, deinem Chef zu erklären, wie du zu dem Code kommst. Ich erinnere mich noch an meine Lehrzeit...


----------



## fabo-erc (18. September 2006)

Ein großen Dank an jokey2 und CSANecromancer...

Wie ich es meinem Chef erklaeren soll weiss ich auch noch net ... 
Denk aber das ich ihm des schon erzaehl das ich des aus diesem Forum
bzw von den User hier hab...

Versteh ee nicht ganz warum ich das machen sollte, obwohl mein Chef weiss das ich davon kein plan hab!
Kann deshalb auch kaum sagen das ich mir innerhalb von wenigen Stunden C gelernt hab...

Naja meld mich sicher Morgen mal was er zu der ganzen Geschichte so meint.

Noch ma ein grosses Dankeschoen fuer eure Geduld und Hilfe an alle!

schoenen Abend noch!

-fabo


----------

