Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
magynhard Super JLI'ler
Anmeldedatum: 26.04.2003 Beiträge: 461 Wohnort: Wild durch die Welt ;-) Medaillen: Keine
|
Verfasst am: 11.05.2003, 10:45 Titel: 2 Zahlen - Eine Zahl |
|
|
Wie ist es mir möglich aus 2 einzelnen Zahlen eine Zahl zu machen, wobei die eine für Zehner, die andere für Einer verwendet werden soll.
z.B.
Code: |
void main(void)
{
int zahl = 0;
short wert1 = 3;
short wert2 = 5;
zahl = wert1 wert2;
// zahl soll dann in diesem Fall 35 werden
}
|
Wie ist das möglich, wie könnte ich das lösen? |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 11.05.2003, 11:33 Titel: |
|
|
Ich musste in der Schule ein Bruchrechenprogramm schreiben und hab das so gemacht:
Code: |
struct fraction
{
int numerator;
int denominator;
};
|
_________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
Jörg JLI MVP
Anmeldedatum: 19.07.2002 Beiträge: 182 Wohnort: Siegen/NRW Medaillen: Keine
|
Verfasst am: 11.05.2003, 11:36 Titel: |
|
|
Ist zwar nicht die eleganteste Lösung, aber du könntest die Zahl einfach in einen String verwandeln und dann wieder zurück in ne Zahl:
Code: | int zahl=0;
short wert1=3;
short wert2=5;
char tmp[10];
sprintf(tmp,"%i%i",wert1,wert2);
zahl=atoi(tmp);
|
_________________ www.messiahzone.de.vu |
|
Nach oben |
|
|
Starwash Senior JLI'ler
Alter: 40 Anmeldedatum: 22.09.2002 Beiträge: 252 Wohnort: Zossen (bei Berlin) Medaillen: Keine
|
Verfasst am: 11.05.2003, 13:10 Titel: |
|
|
Hi du kannst auch einfach das ganze in nen Algo packen, so wie diesen
Code: | int MakeOne(int* p,int iNumOfElements){
if(!p)
return 0;
int multiplikator=1;
int iret=0;
for(int i=0;i<iNumOfElements;i++){
iret+=p[i]*multiplikator;
multiplikator*=10;
}
return iret;
}
void main(void){
int a[3];
a[0]=1;
a[1]=2;
a[2]=3;
int erg = MakeOne(a,3);
printf("Ergebnis: %i",erg); /*321*/
} |
So, sollte es klappen ist allerdings noch ungetestet.
So, habs gerade getestet und bei mir funzt es einwandfrei...die Funktion MakeOne ist noch Verbesserungsdürfit, so könntest du dafür sorgen, dass es keinen Rückgabewert gibt, falls p nicht auf eine gültige Adresse zeigt.
Gruss Tarek |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 11.05.2003, 13:39 Titel: |
|
|
Vielleicht solltest du auch mal erklären was die Funktion genau macht? Ich hab sie mir noch nicht genau angeguggt aber wenn man einen Algorithmus postet sollte man ihn doch auch wenigstens erklären und sagen warum er funktioniert wie er soll. ;) _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
magynhard Super JLI'ler
Anmeldedatum: 26.04.2003 Beiträge: 461 Wohnort: Wild durch die Welt ;-) Medaillen: Keine
|
Verfasst am: 11.05.2003, 14:45 Titel: |
|
|
Ich werd eure Tipps mal durchprobiern, wobei ich den letzten auch etwas seltsam finde - genaue Erläuterung würde mich interessiern. |
|
Nach oben |
|
|
Jörg JLI MVP
Anmeldedatum: 19.07.2002 Beiträge: 182 Wohnort: Siegen/NRW Medaillen: Keine
|
Verfasst am: 11.05.2003, 15:32 Titel: |
|
|
Also ich finde die Idee von Tarek sehr gut (könnte von mir sein ), der Algo ist ja wohl selbsterklärend _________________ www.messiahzone.de.vu |
|
Nach oben |
|
|
Starwash Senior JLI'ler
Alter: 40 Anmeldedatum: 22.09.2002 Beiträge: 252 Wohnort: Zossen (bei Berlin) Medaillen: Keine
|
Verfasst am: 11.05.2003, 16:02 Titel: |
|
|
Hi,
eigentlich dachte ich auch, dass sich dieser triviale Algo von selbst erklärt, aber gut auf Euren Wunsch hin werde ich ihn kurz erklären. Der Funkion MakeOne wird der Zeiger auf den Anfang eines Array von Integern übergeben und die Anzahl der Elemente des Arrays. Nun geht die Funktion jede Zahl des Arrays durch und multipliziert sieht mit dem dementsprechenden Wert (multiplikator). Bei jedem Schleifen durchlauf wird dieser Wert verzehnfacht (also zu erst wird mit 1, dann mit 10, dann mit 100, etc. multipliziert). Das Ergnis dieser Multiplikation wird dann nun einfach zum Rückgabeergebnis (iret) hinzuaddiert. So wird als bei den Zahlen wie unten in der main festgelegt eigentilch nur folgendes gemacht.
Code: | return (p[0]*1+p[1]*10+p[2]*100); |
Für dies müsste sich sogar ein Bildungsgesetzaufstellen lassen, sodass man daraus ein problem mathematischer Natur (Folgen)machen könnte.
Diese Funktion funktioniert für beliebig große Arrays, solange der Rückgabewert nicht den maximale Grenze von int übersteigt.
Man könnte den Algo verbessern indem man bspw. Ellipsis mit einbaut, auf diese Weise könnte man beliebig ints zusammenpacken, ohne dass diese in einem Array sein müssen. Jedoch empfehle ich diese Verbesserung des Algos nur extrem geübten Programmierern, da das mit der Ellipsis nicht ganz so einfach ist.
Gruss Tarek |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 11.05.2003, 16:10 Titel: |
|
|
Aso klar! Ich hatte die Frage total falsch verstanden und das mit den Einer und Zehner überlesen. Tret mich mal einer bitte :) _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
Starwash Senior JLI'ler
Alter: 40 Anmeldedatum: 22.09.2002 Beiträge: 252 Wohnort: Zossen (bei Berlin) Medaillen: Keine
|
Verfasst am: 11.05.2003, 16:42 Titel: |
|
|
Aber gern doch!
*richtigKräftigZuTret!*
gehts dir jetzt besser? *g*
No Prob kann man ja mal überlesen
Ich habe meinen Algo nochmal überdacht und mir ist bisher noch keine bessere Lösung eingefallen, also scheint diese entweder gar nicht so schlecht zu sein oder ich bin nur zu doof eine bessere zu finden.
Ich persönlich tippe auf zweiteres *lol*
Gruss Tarek |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 11.05.2003, 17:12 Titel: |
|
|
Da ich das Problem nu auch endlich verstanden habe... hier mal meine neue Lösung ;)
Code: |
int GlueDigits(int first, ...)
{
int current = 0;
int glued = 0;
int mul = 1;
va_list digits;
va_start(digits, first);
current = first;
do
{
glued += current * mul;
mul *= 10;
current = va_arg(digits, int);
}while(current != -1);
va_end(digits);
return glued;
}
|
Diese Funktion kann eine variable Anzahl von Parametern übernehmen. Im Kern ist das aber immernoch Tareks Lösung.. nur halt etwas flexibler gestaltet. Das einzigste worauf man achten muss ist, dass man die Zeichen andersherum eingibt und eine abschließende "-1" mit übergibt.
Code: |
int main()
{
cout << GlueDigits(1, 2, 3, 4, 5, -1);
}
|
gibt also 54321 aus. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 11.05.2003, 17:19 Titel: |
|
|
Ich hatte da noch eine Idee... auf diese Weise werden die Ziffern auch in der richtigen Reihenfolge zusammengeklebt. ;)
Code: |
int GlueDigits(int first, ...)
{
int current = 0;
char buf[256];
int mul = 1;
va_list digits;
va_start(digits, first);
current = first;
sprintf(buf, "%i", current);
while(current != -1)
{
current = va_arg(digits, int);
sprintf(buf, "%s%i", buf, current);
}
va_end(digits);
return atoi(buf);
}
|
Damit würde das vorherige Beispiel also 12345 ergeben. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
Jörg JLI MVP
Anmeldedatum: 19.07.2002 Beiträge: 182 Wohnort: Siegen/NRW Medaillen: Keine
|
Verfasst am: 11.05.2003, 17:46 Titel: |
|
|
@Hazel:
Hast du deine letzte Version schon getestet? Ich wär nämlich vorsichtig damit, einen Buffer in sich selbst zu kopieren. Durch sowas hatte ich schon mal ernste Probleme, und das fieseste war, dass diese erst in der Releaseversion des Programms auftraten, in der Debugversion lief's einwandfrei. _________________ www.messiahzone.de.vu |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 12.05.2003, 10:44 Titel: |
|
|
Jo ich hab's getestet und es hat funktioniert und probier es nachher auch mal in der Release Version. Ich muss dazu aber sagen, dass ich nicht die Standardbibliotheken benutze, sondern den STLPort. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 12.05.2003, 11:11 Titel: |
|
|
Es ging Jörg denke ich um diese Anweisung:
sprintf(buf, "%s%i", buf, current);
Sonst sehe ich aber auch nix was mit STL-Funktionen zu tun hat?!?
C. |
|
Nach oben |
|
|
|