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

sortowanie w Memo C++ Builder

Object Storage Arubacloud
0 głosów
751 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ź 276 wizyt
0 głosów
1 odpowiedź 494 wizyt
pytanie zadane 14 czerwca 2017 w C i C++ przez BIREXD Obywatel (1,180 p.)
0 głosów
1 odpowiedź 371 wizyt

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...