werte aus einem array zusammenfassen



  • Schau dir mal _itoa an.
    Damit kannst du ein integer in einen String wandeln und anschliessend ganz normal mit strcat,strcpy die Strings aneinander hängen.

    MfG Spacelord



  • habe mir schon fast gedacht das ich über ein konvertierung nicht hinweg komme...

    thx



  • kann ich mit strcat auch index basierend vorgehen?

    dh.:

    char puffer[2];
    	int i;
    
    	for(i=0; i<2; ++i)
    	{
    		puffer[i]=getche();
    	}
    

    ich lese per getche() zzt zwei werte ein und füge sie dann 'irgendwie' per strcat zusammen?

    ich habe es mir als ziel gesetzt einen konsolen taschen rechner zu programieren der die eingabe per getche entgegen nimmt. Kein rechner der a la "drücken sie '+' für addition etc vorgeht. Das ich von dem ziel noch weit entfernt bin ist mir klar aber jeder fängt ja mal klein an.



  • Hi,
    Das kann man auch Arithmetisch lösen:

    int PutTogether (int a, int b)
     {
     	int Result;
    	double Temp;
    
    	if (b<0) return 0;
    	else if (b<10) Temp=a/100.0;
    	else if (b<100) Temp=a/10.0;
    	else if (b<1000) Temp=a;
    	else if (b<10000) Temp=a*10;
    	else if (b<100000) Temp=a*100;
    	else if (b<1000000) Temp=a*1000;
    	else if (b<10000000) Temp=a*10000;
    	else if (b<100000000) Temp=a*100000;
    	else if (b<1000000000) Temp=a*1000000;
    
    	if (a>0) Result=static_cast<int> (Temp*1000.0+b);
    	else Result=static_cast<int> (Temp*1000.0-b);
    
    	return Result;
     }
    

    Die ganzen else und if sind unschön, aber ich wusste keine andere Lösung.
    Du musst nur auf einen Overflow achten, und b darf nicht negativ sein.



  • ich bin das ganz falsch angegangen, und habe dank msdn eine 'ganz einfache' lösung für mein problem gefunden.

    void main()
    {
    int zahl;
    char puffer[2];
        int i;
        for(i=0; i<2; ++i)
        {
            puffer[i]=getch();
        }
    
        zahl=atoi(puffer);
        cout << "\n" << zahl;
    }
    

    danke trotzdem für die hilfe stellung, werde sicher bald wieder etwas haben 😉



  • Hi,
    sorry für den Mist oben, ich bin kein Mathematiker...mein Lösungsweg ist ein bisschen durcheinandergeraten.
    Es gibt folgende Lösungen:

    int PutTogetherB (int a, int b) 
      { 
         int Result; 
    
         if (b<0) return 0; 
         else if (b<10) a*=10; 
         else if (b<100) a*=100; 
         else if (b<1000) a*=1000; 
         else if (b<10000) a*=10000; 
         else if (b<100000) a*=100000; 
         else if (b<1000000) a*=1000000;
         else if (b<10000000) a*=10000000; 
         else if (b<100000000) a*=100000000; 
         else if (b<1000000000) a*=1000000000; 
    
         if (a>=0) Result=static_cast<int> (a+b); 
         else Result=static_cast<int> (a-b); 
    
         return Result; 
      }
    

    Diese ist die schnellste Lösung und funktioniert korrekt, soweit getestet.

    int PutTogether (int a, int b)
     {
     	int Result;
    	if (b<0) return 0;
    
    	double Exp=log10 (static_cast<double> (b))+1.0;
    	if (a>=0) Result=static_cast<int> (a*pow (10.0, static_cast<int> (Exp))+b);
    	else Result=static_cast<int> (a*pow (10.0, static_cast<int> (Exp))-b);
    
    	return Result;
     }
    

    Ich finde diese Lösung schöner, aber sie ist sehr rechenintensiv und damit nicht zu empfehlen 😉

    //per Stringstream
    ss << Eine Zahl << NochEineZahl;
    ss >> Die ErgebnisZahl;
    

    Diese Lösung ist bequem, aber die langsamste (noch langsamer als die Funktion mit log und pow). Ich vermute, ähnliches würde sich mit den c-Funktionen ergeben, da man zuerst 2 Mal itoa, dann strcat und dann atoi aufrufen muss. Zusätzlich dazu noch unbequeme temporäre char-Buffer.

    Edit: LOL, ich schreibe auch nur Mist. Doe oberste Funktion ist jetzt endgültig korrekt.



  • Boah, ich kanns kaum glauben:

    1.Funktion: CPU Ticks: 512
    2. Funktion: CPU Ticks: 11.580
    stringstream CPU Ticks: 174.022
    

    Also mit den Umwandlungen hat man die schlechteste Wahl getroffen.

    Edit: Noch die Ticks korrigiert. Die 1. Funktion braucht nur 500 Ticks und nicht 1000. Damit ist diese 340 mal schneller als per stringstream 🙂



  • Danke für deine arithmetischen Lösungsansätze, vielleicht werde ich den einen oder andern davon im weitern verlauf meines Programms umsetzen.

    Thx
    mfg



  • Vielleicht?
    Na, der Prozessor soll halt etwas ackern, nicht? 😉



  • Lieber spät als nie, aber wie wärs hiermit:

    sprintf(zahl, "%d%d", array[0], array[1]);
    

    @randa
    Wie schnell wäre das? (Teste auch mal den Unterschied zwischen debug und release Version)



  • ~34000 Ticks.
    C Funktionen scheinen da wesentlich schneller als stringstream.

    Edit: Der Test beinhaltet nicht eine Konvertierung zu int, welche ich bei jedem Test angewandt habe. Das heißt es würde eigentlich länger dauern. Ich kann das leider nicht testen, da ich hier kein atoi zur Verfügung habe.


Anmelden zum Antworten