webForumDet fria alternativet

Sortering - HJÄLP

3 svar · 284 visningar · startad av CoyPu

CoyPuMedlem sedan apr. 200363 inlägg
#1

jag behöver lite hjälp med att sortera en listbox i c++. Jag skall sortera på det som finns mellan '-' och '\r' på varje rad hur gör jag. jag provade lite själv men det gick inte så bra! hoppas ni kan hjälpa mig.

void __fastcall TPhoneBookForm::ButtonSortClick(TObject *Sender)
{
	if (RadioButtonName->Checked)
    	PhoneList->Sorted = true;
	else
    {
    	PhoneList->Sorted =false;
        char *string =  PhoneBookForm->PhoneList->Items->GetText();
        int antal = PhoneList->Items->Count;
        int *telnr, *ordning;
        telnr = new int [antal];
		ordning = new int [antal];

        int n=0;
        for (int i=0 ; string[i+1] ;n++)
        {
            for (;string[i] != '-';i++)
            	;
            i++;

            char temp[11];
            temp[0]= '\0';

            for (int j=0; string[i] != '\r';j++)
            {
                temp[j+1]='\0';
            	temp[j]=string[i++];
            }

          	telnr[n] = atoi (temp);
            i++;
        }

        for (int i=0; i<=antal;i++)
        {
            int ordningtemp=0;
            for (int j=0; j!=n ;j++)
        	{
            	if (telnr[i] < telnr[j])
                	ordningtemp++;
            }
        	ordning[i] = ordningtemp;
        }

        for (int i = 0; i < antal ;i++)
        {
	        PhoneList->Items->Move(i,ordning[i]);
        }

    	delete [] telnr;
        delete [] ordning;

    }
}
aasahMedlem sedan mars 20034 471 inlägg
#2

Löser kanske inte hela problemet, men dina forsatser verkar mer än skumma. T.ex:

    int n=0;
    for (int i=0 ; string\[i+1\] ;n++)

En forsats ska se ut enligt följande:
for (startvärde för itereringsvariabeln; avbrottsvillkor relaterat till itereringsvariabeln; itereringsvariabeln ändrar värde enligt följande)

Din slinga:
int i=0 : OK, itereringsvariabeln = i och startvärdet = 0

string[i+1] : Detta är inget avbrottsvillkor! string[i+1] är en char sålänge du befinner dig inom strings indexvärden, annars är den vad som helst i minnet som råkar ligga i "nästa" minnescell, tolkat som en char.

n++ : n != i ==> ingen uppdatering för iterationsvariabeln!

Avsikten med en forslinga är att du vill upprepa ett visst stycke kod ett bestämt antal gånger, och du vet hur många. Exempel: Summera alla tal mellan 1 och 100:
int summa = 0;
for (int i = 1; i < 101; i++)
summa += i;

Om du vill att den ska stega igenom hela strängen så måste du först kolla att du befinner dig inom strängen. Om antal = antal bokstäver i strängen, så är

for (int i = 0; i < antal; i++) det rätta utseendet.

Börja med att fixa till dina forsatser, och posta det rättade programmet om det fortfarande strular.

CoyPuMedlem sedan apr. 200363 inlägg
#3
	if (telnr[i] < telnr[j])
                	ordningtemp++;
            }
        	ordning[i] = ordningtemp;
        }

hit ner har jag steg kört och kollat att det stämmer!!
det är det som kommer efter jag behöver hjälp med

jag har ju ett fält med telnr det skall "sorteras". Ordning hade jag tänkt att
tex:
ordning[0]= 5
det som låg först förut skall flyttas till sjätte platsen i listan. osv

PeWMedlem sedan juni 200010 432 inlägg
131 ms totalt · 3 externa anrop · v20260731065814-full.102f7fcd
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)