webForumDet fria alternativet

Sortera CArray?

5 svar · 1 325 visningar · startad av SilvioF

SilvioFMedlem sedan juni 2000547 inlägg
#1

Sitter med en inlämningsuppgift för den sista delen i C++ kursen.
Dock så verkar jag ha fått problem när jag ivll sortera en CArray i bokstavsordning.

Jag har följande kod:

int N = contacts.GetSize();
	for (int iter = 0; iter < N-1; iter++)
	{
		for(int i = 0; i < N-1; i++)
		{
			if(contacts[i].m_sName, contacts[i+1].m_sName)
			{
				CString tmp_sName = contacts[i].m_sName;
				contacts[i+1].m_sName = tmp_sName;
				CString tmp_sAddress = contacts[i].m_sAddress;
				contacts[i+1].m_sAddress = tmp_sAddress;
				CString tmp_sPhone = contacts[i].m_sPhone;
				contacts[i+1].m_sPhone = tmp_sPhone;
				CString tmp_sEmail = contacts[i].m_sEmail;
				contacts[i+1].m_sEmail = tmp_sEmail;
				CString tmp_sNotes = contacts[i].m_sNotes;
				contacts[i+1].m_sNotes = tmp_sNotes;
			}
		}
	}

Tyvärr så är det så att vi fick färdig kod för denna uppgift som vi skall modifiera för att uppnå ett slutresultat. Det visade sig att den CArray som används inte är dimensionerad utan den hämtas från en class med parametrarna m_sName, m_sAddress, m_sPhone, m_sEmail och m_sNotes. Detta gör att jag inte kan använda mig av sort() då det skulle innebära att allt kommer i helt fel ordning i slutändan (jag har provat och det var en katastrof).

Därför försöker jag mig nu på en bubblesort som ser ut som ovan.
Dock så blir det väldigt konstigt. Den sorterar de två första posterna och tar bort resterade.

Någon som har ett gott öga till detta och kan hjälpa mig lite?

msossnaMedlem sedan feb. 2002476 inlägg
#2
if(contacts[i].m_sName, contacts[i+1].m_sName)

Ser lite underligt ut? är det en funktion som ska in där? Typ:

if(comp(contacts[i].m_sName, contacts[i+1].m_sName))

Det är iaf lite fel i if-blocket, du kopierar värden från *till tmp som kopieras till [i+1]...

Generellt ska *byta plats med [i+1] om [i+1] ska vara före *.

Hoppas ovanstående får dig i rätt riktning utan att lösa uppgiften åt dig...***

SilvioFMedlem sedan juni 2000547 inlägg
#3

Oops..
Jag skrev visst lite fel där.

if-satsen skall se ut som följer:

if(contacts[i].m_sName.CompareNoCase(contacts[i+1].m_sName))

Dock så uppstår det problem när den triggrar. Alla element i min array (contacts[]) ersätts med värdet från första elementet.

Någon som ser var felet kan ligga?

LedelMedlem sedan dec. 2004736 inlägg
#4

Ja. Läser du din if-sats ser du att du gör följande:

  1. Spara det på plats "i" till "temp"
  2. Tryck nu in det du har i "temp" på "i+1"
  3. Och så vidare

Det här är alltså en funktion för att kopiera värdet till i+1. Följande bör fungera bättre (ej testad dock):

int N = contacts.GetSize();
for (int iter = 0; iter < N-1; iter++)
{
	for (int i = 0; i < N-1; i++)
	{
		if (contacts[i].m_sName.CompareNoCase(contacts[i + 1].m_sName))
		{
			CString tmp_sName = contacts[i].m_sName;
			contacts[i].m_sName = contacts[i + 1].m_sName;
			contacts[i + 1].m_sName = tmp_sName;

			CString tmp_sAddress = contacts[i].m_sAddress;
			contacts[i].m_sAddress =contacts[i + 1].m_sAddress;
			contacts[i + 1].m_sAddress = tmp_sAddress;

			CString tmp_sPhone = contacts[i].m_sPhone;
			contacts[i].m_sPhone = contacts[i + 1].m_sPhone;
			contacts[i + 1].m_sPhone = tmp_sPhone;

			CString tmp_sEmail = contacts[i].m_sEmail;
			contacts[i].m_sEmail = contacts[i + 1].m_sEmail;
			contacts[i + 1].m_sEmail = tmp_sEmail;

			CString tmp_sNotes = contacts[i].m_sNotes;
			contacts[i].m_sNotes = contacts[i + 1].m_sNotes;
			contacts[i + 1].m_sNotes = tmp_sNotes;
		}
	}
}
SilvioFMedlem sedan juni 2000547 inlägg
#5

Hmm.. Det är lätt att stirra sig blind på sin egen kod tydligen. :p

Tackar för hjälpen, nu har jag kommit vidare. :)

msossnaMedlem sedan feb. 2002476 inlägg
#6

SilvioF skrev:

Hmm.. Det är lätt att stirra sig blind på sin egen kod tydligen. :p

Allt för enkelt....

130 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)