Pobieranie danych do tablicy

0

Piszę program i jest tam kilka funkcji, w których chcę wykorzystać tablice. Są to funkcje typu void, które służą jako settery odpowiednich pól klasy:

 
void setDataWydania(param);
void setIsbn(param);
void setCzasTrwania(param);

Wg mojego zamysłu przykładowo funkcja setDataWydania() ma działać w ten sposób: użytkownik jest proszony o podanie daty, która jest następnie umieszczana w ośmiu elementach tablicy przypisanej do danego egzemplarza obiektu. Data w formacie ddmmrrrr. Wstępnie założyłem, że będą to dane typu unsigned short int. Teraz mam problem jak to porządnie zrealizować, bo najprostsza możliwa realizacja, jest zarazem najmniej "życiowa", coś w stylu:

 
cin >> d1; tab[0]=d1;
cin >> d2; tab[1]=d2;
...
cin >> r4; tab[7]=r4

To nie jest raczej zbyt dobre. Proszę o jakąś podpowiedź. Czy może lepiej użyć char'ów ? Zależy mi na tym, by później można było łatwo zrealizować wyświetlanie z sortowaniem i wyszukiwanie obiektów, korzystając z danych zapisanych w polach (m.in. wyświetlanie chronologiczne wg dat).

0

Po pierwsze jeżeli twój setter wczytuje coś z cin to znaczy że coś nie tak w założeniach.
jeżeli chcesz wczytać datę to coś na kształt tego:

unsigned d,m,y;
char dm,my;
if((cin>>d>>dm>>m>>my>>y)&&(dm=='.')&&(my=='.'))
  {
   cout<<"wpisano w formacie dd.mm.yyyy"<<endl;
   tm timeinfo;
   timeinfo.tm_year=y;
   timeinfo.tm_mon=m-1;
   timeinfo.tm_mday=d;
   time_t rt=mktime(&timeinfo); // rt - zakodowana data nadająca się do przechowania i porównywania
   tm *ti=localtime(&rt);
   if((ti->tm_year==y)||(ti->tm_mon==m-1)||(ti->tm_mday==d))
     {
      cout<<"Wpisano poprawnie: "<<setfill('0')<<setw(2)<<d<<'.'<<setfill('0')<<setw(2)<<m<<'.'<<setfill('0')<<setw(4)<<y<<endl;
     }
   else cout<<"Wpisano niepoprawna date"<<endl;
  }
else
  {
   cin.clear();
   cin.sync();
   cout<<"wpisuj w formacie dd.mm.yyyy"<<endl;
  }

Natomiast setera używaj:

obiekt.ustawdate(rt); // ten rt z kodu wyżej
0

Jeśli chodzi o settery, to chodziło mi o coś w stylu:

 
class cFoo
{
    private:
        int varFoo;
    public:
        void setFoo(int);
};

void cFoo::setFoo(int Foo)
{
    varFoo=Foo;
}
1
cichociemny napisał(a):

setDataWydania() ma działać w ten sposób: użytkownik jest proszony o podanie daty

Jesteś pewien, że metoda setDataWydania powinna być odpowiedzialna za interakcję z użytkownikiem? (pytanie retoryczne)

cichociemny napisał(a):

która jest następnie umieszczana w ośmiu elementach tablicy
Uh, czemu tak dziko? Użyj np. time_t do przechowywania dat.

Generalnie powinno być tak. setDataWydania ma być setterem, czyli jako argument powinien przyjmować gotową wartość jaka ma być ustawiona:
void setDataWydania(time_t data) { this->data_wydania = data; }
Natomiast gadanie z użytkownikiem i wyciąganie wartości z cin powinno być zajęciem osobnego modułu/klasy (ot choćby w main jeśli programik malutki).

W wolnej chwili poczytaj
http://pl.wikipedia.org/wiki/Model-View-Controller

0
adf88 napisał(a):
cichociemny napisał(a):

setDataWydania() ma działać w ten sposób: użytkownik jest proszony o podanie daty

Jesteś pewien, że metoda setDataWydania powinna być odpowiedzialna za interakcję z użytkownikiem? (pytanie retoryczne)

Racja, racja, nieprecyzyjnie się wyraziłem.

adf88 napisał(a):
cichociemny napisał(a):

która jest następnie umieszczana w ośmiu elementach tablicy
Uh, czemu tak dziko? Użyj np. time_t do przechowywania dat.

Nie miałem lepszego pomysłu. Ale właśnie czytam na temat time.h (http://www.cplusplus.com/reference/clibrary/ctime) i myślę, że... coś lepszego wymyślę :)

adf88 napisał(a):

Natomiast gadanie z użytkownikiem i wyciąganie wartości z cin powinno być zajęciem osobnego modułu/klasy (ot choćby w main jeśli programik malutki).

I tak właśnie teraz robię, osobny plik, a w nim odpowiednie funkcje, itp., do komunikacji z użytkownikiem.

Ostatecznie użyłem nie time_t, a struktury struct tm, również z time.h.

1 użytkowników online, w tym zalogowanych: 0, gości: 1