10 integers vergleichen
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?
<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
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
Re: 10 integers vergleichen
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).
<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)
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
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
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<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;
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;
Re: 10 integers vergleichen
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>
<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>
Re: 10 integers vergleichen
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>
<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>
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):
<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
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.
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) ?
> 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) ?
Re: 10 integers vergleichen
@Wolfgang
Danke für die Info, dass es keine Möglichkeit gibt die Größe eines Array
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)
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
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
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 <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
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">
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.
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)
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.
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.