10 integers vergleichen

Post Reply
Message
Author
Dominik+Seichter

10 integers vergleichen

#1 Post by Dominik+Seichter »

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?

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">

#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;
}
</font><hr></pre></blockquote>

CU Dom

trinity
Posts: 821
Joined: 12. Oct 2001 10:04

Re: 10 integers vergleichen

#2 Post by trinity »

Du hast recht: ist wirklich nicht schön <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle"> (vor allem, hätte ich das gerne mit hundert variablen gesehen <img src="http://www.pl-forum.de/UltraBoard/Images/TooHappy.gif" border="0" align="middle">)
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
int check(int v[<!--no--><!--no-->])
{
int ret=true;
for (i=0;ret &&i<10;i++)
for (j=1;ret && j<11;j++)
if (v[<!--no-->i<!--no-->]==v[<!--no-->j<!--no-->]) ret=false;
return ret;
}

</font><hr></pre></blockquote>
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).
Last edited by trinity on 25. Feb 2002 18:14, edited 3 times in total.
"Korrekt, Freundlich, Kostenfrei", wähle genau zwei. (Lutz Donnerhacke in dcsf)

bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Re: 10 integers vergleichen

#3 Post by bakunin »

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

Dominik Seichter

Re: 10 integers vergleichen

#4 Post by Dominik Seichter »

Hi!

Jo! Danke, geht so wirklich elganter!

Cu Dom

Sascha

Re: 10 integers vergleichen

#5 Post by Sascha »

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<i>=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<i> == v[j] ) return false;

return true;

Sascha

Re: 10 integers vergleichen

#6 Post by Sascha »

Sorry, hier nochmal mit Formatierung:

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
for( i = 0 ; i < 10 ; i++ )
for( j = i+1 ; j < 11 ; j++ )
if( v[j] == v[j] ) return false;

return true;
</font><hr></pre></blockquote>

Descartes

Re: 10 integers vergleichen

#7 Post by Descartes »

Na dann fassen mir mal das oben gesagte alles zusammen <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#include <iostream>

int check(int*, int);

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

std::cout << "check: "
<< check( v, sizeof(v)/sizeof(v[<!--no-->0<!--no-->]) )
<< 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[<!--no-->i<!--no-->]==vect[<!--no-->j<!--no-->] )
return false;
return true;
}
</font><hr></pre></blockquote>

bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Re: 10 integers vergleichen

#8 Post by bakunin »

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):

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#include <stdio.h>

int check (int *, int);

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

printf ("check: %d\<!--no-->n", check (v, sizeof (v) / sizeof (v[<!--no-->0<!--no-->])));
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[<!--no-->i<!--no-->] == vect[<!--no-->j<!--no-->])
return 0;
return 1;
}
</font><hr></pre></blockquote>

Cheers,
GNU/Wolfgang
Last edited by bakunin on 27. Feb 2002 14:00, edited 2 times in total.

Descartes

Re: 10 integers vergleichen

#9 Post by Descartes »

@ 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
Posts: 821
Joined: 12. Oct 2001 10:04

Re: 10 integers vergleichen

#10 Post by trinity »

@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)

Frank

Re: 10 integers vergleichen

#11 Post by Frank »

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

Re: 10 integers vergleichen

#12 Post by Sascha »

@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 <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

trinity
Posts: 821
Joined: 12. Oct 2001 10:04

Re: 10 integers vergleichen

#13 Post by trinity »

@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)

vyper
Posts: 19
Joined: 27. Feb 2002 23:12

Re: 10 integers vergleichen

#14 Post by vyper »

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.

Post Reply