doppelte werte aus Array loeschen

fabo-erc

Grünschnabel
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
-------------------------------------------------------------------------------------------
Code:
'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
 
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
 
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...
 
@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.
 
@CSANecromancer

Shift Taste ausgrab....

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

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
 
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?
 
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...
 
@CSANecromancer: Danke für die Erziehungsarbeit ;-)

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

vector_erase.cpp
Code:
#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
Code:
#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.
 
So und hier noch mein Erguß im allersimpelsten C/C++ (hab dafür sogar noch ein Buch ausgraben müssen :-) ):

Code:
#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... :p
 
Zurück