Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Doppelte Elemente in einem Array eliminieren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
25.03.2004, 20:08 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Ich versuche mal ein C Rätsel

C++:
#include <stdio.h>

void initialisieren(int *pwert, int *anzahl);
void ausgabe(int *pwert, int *anzahl);
void eliminieren(int *ptr, int *anzahl);

main()
{
   int anzahl = 30;
   int werte[anzahl];
   initialisieren(werte,&anzahl);
   ausgabe(werte,&anzahl);
   eliminieren(werte,&anzahl); /*<<< diese Funktion ist gesucht*/
   ausgabe(werte,&anzahl);
}
  
void initialisieren(int *pwert, int *anzahl)
{
   int *ptr;
   srand(time(NULL));
   for(ptr=pwert;ptr<(pwert+*anzahl);ptr++)
      *ptr = rand()%10;
}

void ausgabe(int *pwert, int *anzahl)
{
   int *ptr;
   for(ptr=pwert;ptr<(pwert+*anzahl);ptr++)
     printf("%d ",*ptr);

   printf("\n");
}

void eliminieren(int *ptr, int *anzahl)
{
   /*Code gesucht*/
}


Gesucht ist die Funktion eliminieren. Es müssen alle in dem Array doppelt vorkommenden Elemente gelöscht werden. Der performanteste Code gweinnt

mfg
--

Dieser Post wurde am 25.03.2004 um 20:12 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.03.2004, 20:32 Uhr
Pablo
Supertux
(Operator)


Und was soll man eliminieren?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.03.2004, 21:03 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Pablo
lies mal die überschrift....
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.03.2004, 21:04 Uhr
(un)wissender
Niveauwart


Extrem gesaut, Kinder, bitte nicht nachmachen!
C ist *schüttel*!

Ich verändere alles, aber du hast es ja nicht anders gewollt.
Elegant wäre es, die aktuelle Größe über einen Rückgabewert zu übertragen, nicht über den Pointer, der dann die eigentlich Länge nicht mehr speichert, aber sei es drum, C-Leute stehen wohl auf sowas, immer Russisch-Roulette spielen .


C++:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

void initialisieren(int *pwert, int *anzahl);
void ausgabe(int *pwert, int *anzahl);
void eliminieren(int *ptr, int *anzahl);
int compare(const void *, const void *);

main()
{
   int anzahl = 30;
   int werte[anzahl];
   initialisieren(werte,&anzahl);
   ausgabe(werte,&anzahl);
   eliminieren(werte,&anzahl); /*<<< diese Funktion ist gesucht*/
   ausgabe(werte,&anzahl);
}
  
void initialisieren(int *pwert, int *anzahl)
{
   int *ptr;
   srand(time(NULL));
   for(ptr=pwert;ptr<(pwert+*anzahl);ptr++)
      *ptr = rand()%10;
}

void ausgabe(int *pwert, int *anzahl)
{
   int *ptr;
   for(ptr=pwert;ptr<(pwert+*anzahl);ptr++)
     printf("%d ",*ptr);

   printf("\n");
}

void eliminieren(int *ptr, int *anzahl)
{
    int counter = 0, akt_value, * temp, counter2 = 0;
    temp = (int *)malloc(*anzahl * sizeof(int));
    qsort(ptr, *anzahl, sizeof(int), &compare);
    
    do {
        temp[counter2++] = ptr[counter];        
        akt_value = ptr[counter];        
        while(++counter < *anzahl && akt_value == ptr[counter]);
    } while(counter < *anzahl);
  
    memcpy(ptr, temp, counter2 *  sizeof(int));
    *anzahl = counter2;
    free(temp);  
}

int compare(const void *one, const void *two)
{
    int o1 = *((int *)one), o2 = *((int *)two);  
    if(o1 < o2)
        return -1;
    if(o1 == o2)
        return 0;
    return 1;  
}




Bearbeitung:

Ich hoffe, dass das valider C-Code ist, sehe gerade, dass ich das ganze als C++ kompiliert habe...


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 25.03.2004 um 21:06 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.03.2004, 21:07 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@(un)wissender
ich hatte zwar noch keine zeit dazu das zu machen, werd mich nachher mal ranmachen, aber das vorher erst zu sortieren ist für mich auf den ersten blick was die performance betrifft ja fast arm...
naja mal schauen ob mir nachher was bessere einfällt....
am ende können wir den spass ja nochmal golfen, da ist dann eh kein platz mehr für ein qsort...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.03.2004, 21:16 Uhr
(un)wissender
Niveauwart


Bin mir nicht sicher, in C+ würde das ganze eine Zeile sein, nämlich mit std::unique, aber sortieren scheint mir schon gut zu sein.
Eventuell gibt es bei einem 30er Array schnellere Sachen, aber bei größeren Arrays ist das bestimmt gut.
Ansonsten muss du bei jedem Element, das sich von seinem Vorgänger unterscheidet immer suchen, dass kommt, glaube ich, nicht so gut.

@mike
Wie misst du die Performance?
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.03.2004, 21:33 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


hmm mir würde von der überlegung noch einfallen ein zweites array (bzw.liste um sich ein verschieben zu ersparen),aufzumachen und da die zahlen gleich sortiert einztragen und die doppelten wegzulassen, dann müsste man das array nicht nochmal durchgehen....
weiss aber auch nicht ob man da wirklich was gewinnt...
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 25.03.2004 um 21:34 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
25.03.2004, 21:35 Uhr
mike
Pinguinhüpfer
(Operator)


@(un)wissender: Naja. Eine zeitliche Messung geht hier schlecht - je nach Zufallszahl hat man die Elemente verschieden oft im Array enthalten. Ich dachte An folgende Definition: z.B. qsort ist im Vergleich zu Bubble-Sort ein performanter Code

An das Problem C - C++ habe ich gar nicht gedacht C++ Programmierer können natürlich das Programmm auch komplett in C++ schreiben.

mfg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
25.03.2004, 22:28 Uhr
(un)wissender
Niveauwart


Ah, ist C++ nicht toll!?


C++:
void eliminieren(int *ptr, int *anzahl)
{
    std::vector<int> vec(*anzahl);    
    std::sort(ptr, ptr + *anzahl);    
    vec.erase(std::unique_copy(ptr, ptr + *anzahl, vec.begin()), vec.end());
    std::copy(vec.begin(), vec.end(), ptr);    
    *anzahl = vec.size();        
}


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
25.03.2004, 22:31 Uhr
(un)wissender
Niveauwart


@Windalf
Da ist ja schon fast das was ich gemacht habe...nur um die Zahlen sortiert eintragen zu können, musst du schon sortieren.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: