Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
10 integers vergleichen

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - C
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Dominik+Seichter
Gast





BeitragVerfasst am: 25. Feb 2002 16:41   Titel: 10 integers vergleichen

Hi!

Ich stehe vor dem Problem, dass in meinem Programm 10 int variablen vorkommen, von denen keine den gleichen Wert haben darf. Daher habe ich mir folgende Funktion geschrieben, die alle 10 ints vergleicht und false zurück gibt falls 2 den gleichen Wert haben.
Ich finde meine Lösung nur nicht sehr elegant. Weiß jemand eine bessere Lösung?

code:


#define true 1
#define false 0

int check( int i0, int i1, int i2, int i3,
int i4, int i5, int i6,
int i7, int i8 , int i9 )
{
if( i0 == i1 || i0 == i2 || i0 == i3 ||
i0 == i4 || i0 == i5 || i0 == i6 ||
i0 == i7 || i0 == i8 || i0 == i9 )
return false;

if( i1 == i2 || i1 == i3 || i1 == i4 ||
i1 == i5 || i1 == i6 || i1 == i7 ||
i1 == i8 || i1 == i9 )
return false;

if( i2 == i3 || i2 == i4 || i2 == i5 ||
i2 == i6 || i2 == i7 || i2 == i8 ||
i2 == i9 )
return false;

if( i3 == i4 || i3 == i5 || i3 == i6 ||
i3 == i7 || i3 == i8 || i3 == i9 )
return false;

if( i4 == i5 || i4 == i6 || i4 == i7 ||
i4 == i8 || i4 == i9 )
return false;

if( i5 == i6 || i5 == i7 || i5 == i8 ||
i5 == i9 )
return false;

if( i6 == i7 || i6 == i8 || i6 == i9 )
return false;

if( i7 == i8 || i7 == i9 )
return false;

if( i8 == i9 )
return false;

return true;
}



CU Dom
 

trinity



Anmeldungsdatum: 12.10.2001
Beiträge: 821

BeitragVerfasst am: 25. Feb 2002 18:14   Titel: Re: 10 integers vergleichen

Du hast recht: ist wirklich nicht schön (vor allem, hätte ich das gerne mit hundert variablen gesehen )
code:

int check(int v[])
{
int ret=true;
for (i=0;ret &&i<10;i++)
for (j=1;ret && j<11;j++)
if (v[i]==v[j]) ret=false;
return ret;
}



Da ich leider vergessen hab, wie man die Größe eines Arrays in C ermittelt, kannst du da ein wenig nacharbeiten (auch bei der Paramter-Übergabe bin ich mir nicht ganz sicher).
_________________
"Korrekt, Freundlich, Kostenfrei", wähle genau zwei. (Lutz Donnerhacke in dcsf)


Zuletzt bearbeitet von trinity am 25. Feb 2002 18:14, insgesamt 3-mal bearbeitet
 
Benutzer-Profile anzeigen Private Nachricht senden

bakunin



Anmeldungsdatum: 16.08.1999
Beiträge: 597
Wohnort: Lorsch (Südhessen)

BeitragVerfasst am: 25. Feb 2002 18:54   Titel: Re: 10 integers vergleichen

Hi!

Zur Laufzeit kann die Größe nicht ermittelt werden. Man würde also hier die Größe des Arrays als weiteren Parameter angeben und der Funktion dann "sizeof(v)/sizeof(int)" übergeben.

Cheers,
GNU/Wolfgang
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen

Dominik Seichter
Gast





BeitragVerfasst am: 26. Feb 2002 9:55   Titel: Re: 10 integers vergleichen

Hi!

Jo! Danke, geht so wirklich elganter!

Cu Dom
 

Sascha
Gast





BeitragVerfasst am: 27. Feb 2002 0:41   Titel: Re: 10 integers vergleichen

So wie Lutz es geschrieben hat, wird es immer false zurückgeben, da bspw. irgendwann der Punkt kommt, wenn i=j=2 ist (dann ist natürlich auch v=v[j]).

Ausserdem werden zuviele Vergleiche gemacht. Deshalb sollte man den inneren Loop nur ab i+1 laufen lassen:

for( i = 0 ; i < 10 ; i++ )
for( j = i+1 ; j < 11 ; j++ )
if( v == v[j] ) return false;

return true;
 

Sascha
Gast





BeitragVerfasst am: 27. Feb 2002 0:42   Titel: Re: 10 integers vergleichen

Sorry, hier nochmal mit Formatierung:

code:

for( i = 0 ; i < 10 ; i++ )
for( j = i+1 ; j < 11 ; j++ )
if( v[j] == v[j] ) return false;

return true;

 

Descartes
Gast





BeitragVerfasst am: 27. Feb 2002 3:28   Titel: Re: 10 integers vergleichen

Na dann fassen mir mal das oben gesagte alles zusammen

code:

#include <iostream>

int check(int*, int);

int main(int argc, char** argv)
{
int v[] = {1,2,3,4,5,6,7,8,9,9};

std::cout << "check: "
<< check( v, sizeof(v)/sizeof(v[0]) )
<< std::endl;

return 0;
}

int check(int* vector, int size)
{
for( int i=0; i<size; ++i )
for( int j=i+1; j<size+1; ++j )
if( vect[i]==vect[j] )
return false;
return true;
}

 

bakunin



Anmeldungsdatum: 16.08.1999
Beiträge: 597
Wohnort: Lorsch (Südhessen)

BeitragVerfasst am: 27. Feb 2002 14:00   Titel: Re: 10 integers vergleichen

Hi Descartes!

Dein Code funktioniert nicht, den Parameter hattest du vector genannt, doch in der Funktion hast du mit vect gearbeitet. Hier nochmal korrigiert (und in C natürlich):

code:

#include <stdio.h>

int check (int *, int);

int
main (int argc, char *argv[])
{
int v[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 9 };

printf ("check: %d\n", check (v, sizeof (v) / sizeof (v[0])));
return 0;
}

int
check (int *vect, int size)
{
for (int i = 0; i < size; i++)
for (int j = i + 1; j < size + 1; j++)
if (vect[i] == vect[j])
return 0;
return 1;
}



Cheers,
GNU/Wolfgang


Zuletzt bearbeitet von bakunin am 27. Feb 2002 14:00, insgesamt 2-mal bearbeitet
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen

Descartes
Gast





BeitragVerfasst am: 27. Feb 2002 14:11   Titel: Re: 10 integers vergleichen

@ GNU/Wolfgang
> Dein Code funktioniert nicht, den Parameter hattest du vector genannt,
> doch in der Funktion hast du mit vect gearbeitet.
War auch schon spät (oder wars schon früh ?)....ich hätte doch Cut'n'Paste machen sollen statt das ganze nochmal abzutippen. Mein Quellcode hatte den Typo natürlich nicht.

> Hier nochmal korrigiert (und in C natürlich):
Du alter C++ Verächter *g*

Es gibt nicht eine Möglichkeit, dass ich die Funktion "check" mit nur einem Parameter aufrufen kann und die sich die Vector-Size selbst ermittelt ?
Also int check(int* vector) statt int check(int* vector, int size) ?
 

trinity



Anmeldungsdatum: 12.10.2001
Beiträge: 821

BeitragVerfasst am: 27. Feb 2002 15:33   Titel: Re: 10 integers vergleichen

@Wolfgang
Danke für die Info, dass es keine Möglichkeit gibt die Größe eines Array
_________________
"Korrekt, Freundlich, Kostenfrei", wähle genau zwei. (Lutz Donnerhacke in dcsf)
 
Benutzer-Profile anzeigen Private Nachricht senden

Frank
Gast





BeitragVerfasst am: 27. Feb 2002 20:48   Titel: Re: 10 integers vergleichen

Hallo Leutz,

nur so ne theoretische Frage:
Was macht ihr denn, wenn ihr 10.000 Variablen vergleichen wollt?

Vorschlag:
Das Array sortieren, je nach Größe mit entsprechendem Algorithmus, danach einfach von Anfang bis Ende durchzählen und dabei je 2 Nachbarn vergleichen.

Frank
 

Sascha
Gast





BeitragVerfasst am: 27. Feb 2002 23:00   Titel: Re: 10 integers vergleichen

@frank: Guter Vorschlag, das ist in der Tat schneller als unser Algorithmus. Vorraussetzung ist, dass man einen guten Sortieralgorithmus verwendet. Während "unser" Algorithmus eine Komplexität von O(n^2) ("n hoch 2") hat, könnte man sie mit einem schnellen Sortieralgorithmus auf O(n*log n) drücken. Dafür würde man aber doppelt soviel Speicher benötigen, da man das Array kopieren müsste (es sei denn, es macht nichts, wenn das Array verändert wird).

Das gesagte bringt aber nur für grosse 'n' einen echten Vorteil. Ist halt nur graue Theorie
 

trinity



Anmeldungsdatum: 12.10.2001
Beiträge: 821

BeitragVerfasst am: 28. Feb 2002 8:43   Titel: Re: 10 integers vergleichen

@Sulu
Irgendwie wurde fast mein komplettes Posting gelöscht. Deshalb hier nochmals danke, für die fehlererkennung. Ich hab wohl gepennt.

@Frank
Auch für 10.000 Elemente kann diese Routine verwendet werden.

@Sascha
Es sollte nicht zu schwer sein, jeden Sortier-Algorythmus so umzuschreiben, dass er für diese Aufgabe verwendet werden kann. Denn wenn du es dir genau anschaust ist das kleine Programm einem Selektion-Sort ziemlich ähnlich.
_________________
"Korrekt, Freundlich, Kostenfrei", wähle genau zwei. (Lutz Donnerhacke in dcsf)
 
Benutzer-Profile anzeigen Private Nachricht senden

vyper



Anmeldungsdatum: 27.02.2002
Beiträge: 19

BeitragVerfasst am: 28. Feb 2002 10:50   Titel: Re: 10 integers vergleichen

Naja, er traversiert das Array in der selben Reihenfolge wie ein Selection Sort, das stimmt.

Es ging ja darum, ob man dadurch einen Geschwindigkeitsvorteil für grosse Mengen von Eingabedaten bekommt - zumindest hatte ich die Anfrage so verstanden. Meine Antwort darauf war eben, dass man einen echten Geschwindigkeitsvorteil nur bekommt, wenn man einen entsprechend effizienten Sortieralgorithmus einsetzt.

Aber Du hast schon recht: Möglich ist es mit jedem Sortieralgorithmus.
 
Benutzer-Profile anzeigen Private Nachricht senden

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - C Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy