|
Einsendung:
Lösungsvorschlag
Ich weiß nicht so recht, ob ich die Übung richtig verstanden habe, ich habe jetzt auf jeden Fall ein Programm geschrieben, das drei eingegebene Werte sortiert. Es ist vielleicht teilweise umständlich geschrieben, aber es läuft (zumindest bei mir)!
#include <iostream.h>
int smallest(int list[3])
{
int temp=list[0];
for(int i=1;i<3;i++)
{
if(temp>list[i]) temp=list[i];
}
return temp;
};
int middle(int list[3])
{
if((list[0]>list[1] && list[0]<list[2]) ¦¦ (list[0]<list[1] && list[0]>list[2]))
return list[0];
if((list[1]>list[0] && list[1]<list[2]) ¦¦ (list[1]<list[0] && list[1]>list[2]))
return list[1];
if((list[2]>list[0] && list[2]<list[1]) ¦¦ (list[2]<list[0] && list[2]>list[1]))
return list[2];
};
int biggest(int list[3])
{
int temp=list[0];
for(int i=1;i<3;i++)
{
if(temp<list[i]) temp=list[i];
}
return temp;
};
void sort(int *pa, int *pb, int *pc)
{
int list[3]={*pa,*pb,*pc};
int first=smallest(list);
int second=middle(list);
int last=biggest(list);
*pa=first;
*pb=second;
*pc=last;
};
void main()
{
int a;
int b;
int c;
cout<<"Wert fuer a: "; cin>>a;
cout<<"Wert fuer b: "; cin>>b;
cout<<"Wert fuer c: "; cin>>c;
sort(&a,&b,&c);
cout<<a<<endl;
cout<<b<<endl;
cout<<c<<endl;
}; |
Die Aufgabe haben Sie völlig richtig verstanden. Das Programm ist nicht nur teilweise umständlich. Aber was soll's. Bestimmt kommen noch Lösungen herein, die einfacher sind. Für Sortieraufgaben gibt es so viele ausgefuchste Verfahren, daß Sie keine Chance haben, ohne viel Hintergrundwissen diese Aufgabe so zu lösen, daß sie mit guten Lösungen mithalten könnte. Wichtig ist jetzt eigentlich nur, daß Sie sich auf Sortierprobleme einstimmen, denn bald kommen richtige Sortierverfahren dran. Auf die Gefahr hin, daß ich Sie ein wenig erschrecke, gebe ich hiermit eine erheblich kürzere Version zur Ansicht:
void swap(int *pa,int *pb)// sprich: void swap von int Zeiger pa Komma int Zeiger pb
{// sprich: geschweifte Klammer auf
int tmp=*pa;// sprich int temp ist Inhalt von a
*pa=*pb;// sprich Inhalt von a ist inhalt von b
*pb=tmp;// sprich Inhalt von b ist temp
};// sprich: geschweifte Klammer zu
void sort(int *pa,int *pb,int *pc)
{
// die kleinste Zahl ist bei pa oder pb oder pc
if(*pa>*pb)
swap(pa,pb);// jetzt ist die kleinste Zahl bei pa oder pc
if(*pa>*pc)
swap(pa,pc);// jetzt ist die kleinste Zahl bei pa
// die zweitkleinste Zahl ist bei pb oder pc
if(*pb>*pc)
swap(pb,pc);// jetzt ist die zweitkleinste bei pb
// und die drittkleinste Zahl ist bei pc
// fertig!
}; |
Diese Lösung läßt sich noch ein wenig verbessern, indem man die immer wiederkehrenden Anweisungen der Art
in eine eigene Funktion auslagert:
void swap(int *pa,int *pb)
{
int tmp=*pa;
*pa=*pb;
*pb=tmp;
};
void sort(int *px,int *py)
{
if(*px>*py)
swap(px,py);// jetzt ist die kleinere Zahl bei px
};
void sort(int *pa,int *pb,int *pc)
{
// die kleinste Zahl nach vorn (pa) ziehen
sort(pa,pb);
sort(pa,pc);
// die zweitkleinste Zahl nach vorn (pb) zeihen
sort(pb,pc);
}; |
Mit diesem Ansatz wird das Sortieren von Zahlen so einfach, daß es auch leicht möglich ist, vier oder fünf Zahlen zu sortieren:
void sort(int *pa,int *pb,int *pc,int *pd)
{
// die kleinste Zahl nach vorn (pa) ziehen
sort(pa,pb);
sort(pa,pc);
sort(pa,pd);
// die zweitkleinste Zahl nach vorn (pb) zeihen
sort(pb,pc);
sort(pb,pd);
// die drittkleinste Zahl nach vorn (pc) ziehen
sort(pc,pd);
};
void sort(int *pa,int *pb,int *pc,int *pd,int *pe)
{
// die kleinste Zahl nach vorn (pa) ziehen
sort(pa,pb);
sort(pa,pc);
sort(pa,pd);
sort(pa,pe);
// die zweitkleinste Zahl nach vorn (pb) zeihen
sort(pb,pc);
sort(pb,pd);
sort(pb,pe);
// die drittkleinste Zahl nach vorn (pc) ziehen
sort(pc,pd);
sort(pc,pe);
// die viertkleinste Zahl nach vorn (pd) ziehen
sort(pd,pe);
}; |
Sie ahnen bestimmt schon, wie eine Funktion
void sort(int *array,int size) |
aussehen würde, die Arrays beliebiger Größe sortieren kann. Das durchaus starre Vorgehen dieses Verfahrens läßt sich bestimmt irgendwie in Schleifen verpacken.
Falls Ihnen Fehler im Text auffallen oder Sie Verbesserungsvorschläge haben, dann
schicken Sie mir bitte eine Mail. Ich werde mich dann sofort darum kümmern.
[aktuelle Version]
[inhalt]
[index]
[Fehlerkorrektur, Verbesserungsvorschlag]
© Volkard Henkel <volkard@normannia.de>,
last update: 08/25/00
|
|