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

Tablica rekordów c++

Object Storage Arubacloud
0 głosów
1,790 wizyt
pytanie zadane 5 czerwca 2019 w C i C++ przez fern00 Nowicjusz (120 p.)

Witam, zadane zaimplementowanie zainicjowanych poniżej funkcji, które będą operować na tablicy dynamicznej zawierającej rekordy zainicjowanej jako Record* record. Czy ktoś pomógłby mi napisać te część kodu w których ta tablica zostaje wysłana do którejś z funkcji bo nie bardzo wiem jak wyglądała by składania. Z góry dziękuję.

#include <string>

using namespace std;

class Record {
private:
	string name;
	int score;

public:
	Record(string, int); //constr
	
};

Record::Record(string name = "Player", int score = 0)
{
	this->name = name;
	this->score = score;
}

class ScoreTable
{
private:
	Record* record;

public:
	Record* get(); //returns sorted records array (no need to implement it separately)
	Record append(string, int); //appends a record to the end of list(and returns this record)(Uses constructor of record)
};

int main() 
{	
	system("Pause");
	return 0;
}

 

komentarz 5 czerwca 2019 przez j23 Mędrzec (194,920 p.)
Jak chcesz pomocy, to pokaż, co tam już napisałeś.

2 odpowiedzi

0 głosów
odpowiedź 5 czerwca 2019 przez niezalogowany
przywrócone 10 czerwca 2019

STL set< ScoreTable > zobacz czy Ci odpowiada. Zobacz czy oto Ci chodzi http://www.cplusplus.com/reference/set/set/rbegin/

tylko będziesz musiał przeciążyć operator < lub >, ale chyba ten pierwszy i to musisz zrobić w Twojej klasie, lub funkcję przeciążenia operatora zaprzyjaźnić z Twoją klasą.

lub też STL vector< ScoreTable>  i tak z operatorem jak chcesz mieć takie samie wyniki i imona

lub też bez przeciązenia

class Record {
private:
    string name;
    int score;
 
public:
    Record(string, int); //constr
     
};
 
Record::Record(string name = "Player", int score = 0)
{
    this->name = name;
    this->score = score;
this -> temp = to_string (this->score)+"ala ma kota"+ "this->name" wyniki.push_back.(std::move(temp)); // ale za to move to podziękuj J23
    }
}
......
//globalna definicja
std::vector<string>wyniki; //globalna definicja przed klasą Record

int main(){}

no i posortuj ten wektor i wyświetl od tyłu bo chyba o to chodzi?

lub lepiej w destruktorze

class Record {
....
~Record(){
this -> temp = to_string (this->score)+"ala ma kota"+ "this->name" wyniki.push_back.(std::move(temp));
}

 

komentarz 6 czerwca 2019 przez j23 Mędrzec (194,920 p.)

Po:

  1. OP ma to zaimplementować przy użyciu zwykłej tablicy, bez użycia vectora.
  2. żadnych globalnych zmiennych. ScoreTable ma być zbiorem rekordów, i nie std::stringów, tylko obiektów klasy Record.
  3. linia 15 to jakiś absurd. Klasa Record nie ma pola temp (bo i po co?). Zanim komuś wkleisz kod, sprawdź go co najmniej dwa razy.
0 głosów
odpowiedź 7 czerwca 2019 przez niezalogowany

jak niem odpowiedzi to ja dam swoją może nie do końca w temacie.

W temacie byłaby ScoreTable jako lista i przy pierwszym wprowadzeniu głową by był pierwszy wynik an następne by się sprawdzało ż głową jak mniejszy to to następna pozycja  itd.. Ale że slaby jestem i pisaniu kodów to mi trochę to zajmie zanim bym to napisał. A tutaj tabela w miarę działająca

#include <iostream>
#include <set>
#include <string>
#define NP(n,i) n##i;
#define fo(x) cout<<#x<<"="<<x<<"\n";
#include <sstream>
#include <time.h>
#define S(x) #x


using namespace std;

struct Compare {
    bool operator () (const std::string &a, const std::string &b) {
        stringstream ssa(a);
        stringstream ssb(b);
        int ai,bi;
        ssa>>ai;
        ssb>>bi;
        if(ai<bi)
            return 0;
        else
            return 1;
    }
};
class ScoreTable {
  public:
    static std::set<string,Compare> scores;
};
class Record:ScoreTable {
  private:
    string name;
    int score;
  public:
    ScoreTable* a;
    Record(string, int); //constr
//    Record() {};
    ~Record ();
};

Record::Record(string name = "Player", int score = 0) {
    this->name = name;
    this->score = score;
}


Record::~Record() {
    a->scores.insert(std::move(to_string(this->score)+" ------------"+this->name));
}
std::set<std::string,Compare> ScoreTable::scores;

int main() {
    ScoreTable t;
    int rozmair=5;

    srand(time(NULL));
    int rozmiar = 5;
    Record * table = new Record [rozmiar];

    for (int i=0; i<rozmiar; i++) table[i]={"palyer"+to_string(i+1),rand()%100+1};

    {Record aa {"player10" ,50};}

    std::set<string> ::iterator it;
    for (it=t.scores.begin(); it!=t.scores.end(); it++)
        cout<<*it<<endl;
    delete [] table;

    return 0;
}

 

komentarz 8 czerwca 2019 przez niezalogowany

@fisker łączysz wszystkie dane w jeden łańcuch i wstawiasz do std::set. Potem komparator wyłuskuje te połączone dane wiele razy. Po co to robić skoro mógłbyś odpowiednio te dane przechowywać. Dalej std::set tutaj nie pasuje - wystarczyłby zwykły vector (albo nawet tablica tak jak chcą w zdaniu) struktur (w tym przypadku Record) ze zdefiniowanym operatorem <, dalej można sortować za pomocą std::sort z std::greater. Bez żadnych udziwnień z dodawaniem obiektów destruktorze do statycznego kontenera. 

Poza tym:

if(ai<bi)
    return 0;
else
    return 1;
return ai > bi; 

time.h zamiast ctime

std::set<string> ::iterator it;
for (it=t.scores.begin(); it!=t.scores.end(); it++)
    cout<<*it<<endl;
for (std::set<string> ::iterator it=t.scores.begin(); it!=t.scores.end(); it++)
    cout<<*it<<endl;
for (auto it=t.scores.begin(); it!=t.scores.end(); it++) // C++11
    cout<<*it<<"\n";
for (auto& it: scores) // C++11
    cout << it << "\n";
komentarz 8 czerwca 2019 przez niezalogowany
edycja 8 czerwca 2019

time.h zamiast ctime

co właśnie też coś mi nie pasowało.

struktur (w tym przypadku Record) ze zdefiniowanym operatorem <,

Ok się spróbuje coś takiego za implementować dla wprawki?

W destruktorze, bo punkty dodajemy do tablicy wyników jak obiekt ginie. Nazwę w konstruktorze bo obiekt się rodzi. A jakąś metodą dodajemy punkty.

1)Ale teraz zastanawia mnie taka rzecz czy miało by to sens.

Tworzę nowy plik z posortowaną tablicą strukturą "tmp.tmp"

i później go kopiuję do pliku wyniki.

#include <iostream>
#include <fstream>

using namespace std;
int main()
{
    fstream ranking;
    ofstream temp;
    string linia="", dodaj;
    dodaj="5";
    bool prawda=1;
    ranking.open("rank.txt");
    temp.open("tmp.tmp");
  if(ranking.good()==false) {
         cout<<"Brak pliku";
          return;
        }
        while(getline(ranking, linia)){
       if(prawda){if (linia<dodaj){ temp<<dodaj<<"\n";prawda=0;}}
      temp<<linia<<"\n";
       cout<<linia<<endl;
        }
         ranking.close();
         temp.close();

           ranking.open("tmp.tmp");
    temp.open("rank.txt");
           while(getline(ranking, linia)){
      temp<<linia<<"\n";
       cout<<linia<<endl;
        }
    return 0;
}

to to akurat string, ale jak bym miał

class Tab
{
    char  name[20];
    int wynik;
};

to mógłbym wpisać do nazwy co mi się podoba spacje wykrzykniki a resztę dopełniał kropkami, a skalałbym wskaźnikiem co 24 bajty wyjmował 4 sprawiał z intem ustawiał na na konkretnej pozycji czy takie coś ma rację bytu? By nie stosować żadnych getline tylko skakać po bajtach.

2) Edit: Set bo od razu sortuje przy wstawianiu?

komentarz 9 czerwca 2019 przez niezalogowany
1) Byłoby to niewygodne i wolne. Lepiej zrobić po prostu zapis i odczyt binarny, a resztę modyfikować w tablicy.

2) Wstawianie do setu ma złożoność w najgorszym przypadku O(log(N)). Kontener vector będzie lepszy gdy znasz rozmiar (i unikasz realokacji danych przy wstawianiu) i gdy sortowanie nie będzie tak często używane (np. raz po dodaniu wszystkich elementów).
komentarz 9 czerwca 2019 przez niezalogowany

@Hipcio,

1) No ja wiem że binarny zapis jest w tym przypadku dużo lepszy. I w ogóle lepszy ale mniej intuicyjny. Ale muszę sobie go przypomnieć niestety się ciągle zapomina, tj ja się Jaś nauczy to nie znaczy że Jan będzie umiał. Z programowaniem jak z językiem ciągle trzeba powtarzać zanim się nie osiągnie pewnego poziomu.

2) Myślałem że to struktura drzewa i bardzo dobrze sortuje.

komentarz 9 czerwca 2019 przez niezalogowany
edycja 13 czerwca 2019
#include <iostream>
#include <ctime>
#include <iomanip>
using namespace std;
struct Record {
    string  name;
    int score;
    Record (string n="", int w=0):name (n),score(w) {}
};

class ScoreTable { 
   public:
    ScoreTable (int); //1
    void mysort() ; //2
    void setRecord(Record); //3
    void randomfill(int); //4
    void show(); // 5 co by wyglądało po ludzku i nie było inline; 
//    void  resizeScoreTable (Record*,int sizeNewTab);  /not implemetation
    ~ScoreTable ();
    private:
    int sizeTab ;
    Record* Table;
};

  ScoreTable :: ScoreTable (int r=100) {
        this->sizeTab=r;
        this ->Table = new Record [this->sizeTab];
    }
    void ScoreTable ::mysort() {
        for (int j=0; j<sizeTab-1; j++)
            for (int i=0; i<sizeTab-1; i++) {
                if (Table[i].score<Table[i+1].score)
                    swap(Table[i],Table[i+1]);
            }
    }
    void ScoreTable ::setRecord (Record add) {
        Record * table_data=this->Table;
        Record *current_in=&add;
        int Start =0;

        for (int i = Start; i<sizeTab - Start - 1; i++) {
            if (current_in->score>table_data->score ) {
                swap(*current_in,*table_data);
                current_in++;
                current_in=table_data;
            } else {
                table_data++;
            }
        }
    }
    void ScoreTable ::randomfill (int gornyzakres) {
        srand(time(0));
        for (int i=0; i<this->sizeTab; i++) {
            this->Table[i]= {"palyer"+to_string(i+1),rand()%gornyzakres+1};
        }
    }
    void ScoreTable ::show () {
        cout<<".....................Wyniki................"<<endl;
        for (int i=0; i<this->sizeTab; i++) {
            cout<<setw(20)<<Table[i].name<<setw(20)<<"...................."<<Table[i].score<<endl;
        }
    }
    ScoreTable ::~ScoreTable () {
        delete [] Table;
    }
int main() {
    ScoreTable table(10);
    table.show();
    table.randomfill(1000);
    table.mysort();
    table.show();
    table.setRecord({"Rob",400});
    table.setRecord({"Jerry",700});
    table.show();
    return 0;
}

powinienem mieć zakaz używania komputera do pisania programów :) zamiast myślenia kolejna kompilacja:(;

Last Edit.

Nie mogłem się powstrzymać by się nie podzielić:

https://dsp.krzaq.cc/post/245/jak-latwo-zaimplementowac-w-cxx-operator-porownania-dla-twojej-klasy/

http://algorytm.edu.pl/struktury/161-sortowanie-struktur.html

//i propozycje nowych metod których brakuje
 void resizeScoreTable (Record&&,int sizeNewTab); //zamiast
void prtbeginend(Record*Tables, Record* begin,Record end, int amountOftables)
void setRecord(Record current, Record nexttable, int size); 
//Bo tak sobie pomyślałem że 100 elemetów to max na jedną tablicę wyników.
// nawet dodać element to przesuwa się tylko początki i końce tablic a szuka się tylko po początkach.
//porostu taka lista tablic

 

Podobne pytania

0 głosów
1 odpowiedź 193 wizyt
pytanie zadane 19 listopada 2018 w C i C++ przez MAXIM7 Obywatel (1,990 p.)
0 głosów
1 odpowiedź 845 wizyt
pytanie zadane 26 stycznia 2021 w C i C++ przez karols32 Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 277 wizyt
pytanie zadane 7 listopada 2019 w C i C++ przez Mavannkas Bywalec (2,290 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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!

...