• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

sortowanie w Memo C++ Builder

0 głosów
878 wizyt
pytanie zadane 21 grudnia 2015 w C i C++ przez lukasz_m Obywatel (1,380 p.)
Witam

W jaki sposób mogę posortować wyniki z gry w komponencie Memo w c++ Builder.

Gdyby to były same liczby to nie miałbym z tym żadnego problemu, ale

linie w memo zawierają tekst i liczby, a chciałbym posortować według kryterium liczbowego.

2 odpowiedzi

0 głosów
odpowiedź 21 grudnia 2015 przez niezalogowany
Jak mamy ci pomóc skoro nie podałeś nam na przykładzie jakich danych mamy się spodziewać? "Kryterium liczbowe" może oznaczać wiele rzeczy, pokaż w jakiej formie dane mają zostać dostarczone do posortowania oraz jak powinny wyglądać posortowane.
komentarz 21 grudnia 2015 przez lukasz_m Obywatel (1,380 p.)
Do Memo trafia nick gracza oraz ilość zdobytych punktów

Np:

AAA 100

BBB 400

CCC 1200

Chodzi mi o to,żeby posortować według punktów malejąco
komentarz 21 grudnia 2015 przez niezalogowany

To podziel każdą linię na 2 pola i wczytaj to do jakiejś struktury, przy okazji drugą część wyniku skonwertuj na inta

struct Scores
{
  string name;
  int value;
}

Następnie to już jest standardowe sortowanie wg int'a

komentarz 23 grudnia 2015 przez lukasz_m Obywatel (1,380 p.)

Zrobiłem tak jak mówisz czyli podzieliłem linię na 2 części

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    Form4->Memo1->Lines->LoadFromFile("wyniki.txt");


    for (int i=0; i<10; i++)
    {
    AnsiString str = Form4->Memo1->Lines->Strings[i];

    int pos = str.Pos(" "); //pozycja rozdzielająca

    //dodaj do Memo2 to co jest po spacji

    Form4->Memo2->Lines->Append(str.SubString(pos+1, 10));
    str.Delete(1, pos-1);  //usuń to co przed spacją
    }

    Form4->ShowModal();
}

 

i punkty przeniosłem z Memo1 do Memo2, ale jak już próbuję posortować to

wywala mi błąd

Poniżej kod sortowania:

void __fastcall TForm4::Button2Click(TObject *Sender)
{
      for(int i=1; i<10; i++)
       {
         int n=10;
         for (int j=n-1; j>=1; j--)
         {

             int linia [10];
             linia [j] = StrToInt(Form4->Memo1->Lines->Strings[j]);

             if (linia[j]<linia[j-1])
             {
              int bufor;
              bufor = linia[j-1];
              linia[j-1]=linia[j];
              linia[j]=bufor;
             }
          }
        }

}

 

 

komentarz 23 grudnia 2015 przez niezalogowany

Nie chcę się zagłębiać w kod Builder'a, ale nie zrobiłeś tego jak to powiedziałem, poniżej przykład częściowo w pseudo-kodzie jak to powinno wyglądać:

struct Score
{
 std::string name;
 int value;
};

std::vector <Score> scores;

void OnSortButtonPressed() // <- załóżmy że to funkcja w której odbywa kod po kliknięciu przycisku 
{
  std::list <std::string> rawData;
  rawData = Lines.split("\n"); // <- wyciąga każdą linię z całej kontrolki
  
  foreach(std::string &line const in rawData)
  {
    std::list <std::string> tmp = line.spit(' ');
    Score score;
    score.name = tmp[0];
    score.value = stringToInt(tmp[1]);
    scores.push_back(score);
  } // <- teraz mamy tablicę wypełnioną punktami

  // sortowanie
  sortScores(&scores);
}


void sortScores(std::vector <Score> tab)
{
  /* tutaj sortujesz dowolnym alorytmem, tylko że porównujesz do siebie tab[i].value i tab[i+1].value,
  a gdy przychodzi moment na zamianę to zamieniasz całe obiekty, czyli np swap(tab[i],tab[i+1]) */
}

Jak mówiłem to pseudokod więc wiele rzeczy nie jest dostępna "za darmo" i musisz je napisać, dla własnej wygody skorzystałem z pętli foreach, która w C++ ma jakąś inną formę, ale bez problemu możesz też użyć zwykłego for'a

0 głosów
odpowiedź 21 grudnia 2015 przez maly Nałogowiec (37,190 p.)

Nie wiem czy zrozumiałem ale najproście według mnie to skopiować linie z TMemo do TStringList a potem sobie posortować korzystając z CustomSort. Dam prosty przykład, mam nadzieję że zrozumiesz go.

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <memory>
#include <cstdio>
#include <cstdio>

#include "Unit1.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

int __fastcall MySort(TStringList* List, int Index1, int Index2)
{
	// format linii w memo
	// cos tam 100 blabla
    int points1,points2;
    char dummy[2000];
    std::sscanf(List->Strings[Index1].c_str(), "%s %s %d", dummy, dummy,&points1);
    std::sscanf(List->Strings[Index2].c_str(), "%s %s %d", dummy, dummy,&points2);

    if(points1 < points2)
    	return -1;
    else if(points1 > points2)
    	return 1;
    else
		return 0;
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	Memo1->Lines->Add("cos tam 100 blabla");
	Memo1->Lines->Add("cos tam 4 blabla");
	Memo1->Lines->Add("cos tam 2 blabla");
	Memo1->Lines->Add("cos tam 80 blabla");

	std::auto_ptr<TStringList> StrList(new TStringList);

    StrList->AddStrings(Memo1->Lines);

    StrList->CustomSort(MySort);

    Memo1->Lines->Clear();

    Memo1->Lines->AddStrings(StrList.get());

}

 

 

Podobne pytania

0 głosów
1 odpowiedź 418 wizyt
0 głosów
1 odpowiedź 625 wizyt
pytanie zadane 14 czerwca 2017 w C i C++ przez BIREXD Obywatel (1,180 p.)
0 głosów
1 odpowiedź 418 wizyt

93,425 zapytań

142,421 odpowiedzi

322,646 komentarzy

62,785 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...