c++, switch, pliki, ctime

0

Witam, mam do napisania taki o to program:
Dane:
n- liczba studentów
dane n osób zapisane w pliku dane.txt: imię, nazwisko, rok urodzenia, średnia ocen
Wynik:
Program realizujący Menu:

  1. Wyświetl dane o studentach
  2. Dodaj osobę
  3. Wyświetl osobę wg jednego z kryteriów (najmłodsza, najwyższa średnia, o podanym nazwisku)
  4. Posortuj wg wybranej informacji
  5. Koniec

Siedzę i się głowię nad kilkoma problemami:

  1. w punkcie numer 2 dodaje studenta (nie wiem czy dobry sposób obrałem) i nie wiem jak mam zrobić żeby po dodaniu, tablica z punktu pierwszego zwiększyła się o jeden i go wyświetliło. (w pliku się zapisuje).
  2. w punkcie numer 3 nie mam zielonego pojęcia jak na podstawie typu string policzyć wiek osoby i porównać go z innymi osobami, a także nie wiem jak alfabetycznie rozwiązać problem z nazwiskiem. (w voidzie najml jest przekonwertowany string na inta ale najprawdopodobniej źle.)
  3. Punkt czwarty ogarnę jeśli tylko ktoś mnie naprowadzi z punktem trzecim.
    Mój kod:
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <fstream>
using namespace std;

struct osoba
{
    string imie;
    string nazwisko;
    string data;
    float srednia;
};
void zap(osoba *tab)
{
    int i=0; fstream plik;
    plik.open("studenci.txt");
    while(!plik.eof())
            {
                plik>>tab[i].imie;
                plik>>tab[i].nazwisko;
                plik>>tab[i].data;
                plik>>tab[i].srednia;
                i++;
            }
}
void srednia(osoba *tab, int n)
{
    zap(tab); float max;
    max=tab[0].srednia;
    for(int i=1; i<n; i++)
    {
        if (tab[i].srednia>max) max=tab[i].srednia;
    }

    for (int i=0; i<n; i++)
    {
        if(max==tab[i].srednia)
        {
            cout<<tab[i].imie<<" ";
            cout<<tab[i].nazwisko<<" "<<endl;
            cout<<"Srednia: "<<tab[i].srednia;
        }
    }
}

/*void najml(osoba *tab, int n)
{   
    int m=n;
    int tabp[m];
    for (int i=0; i<n; i++)
    {
        for (int j=0; j<m; j++)
        {
            tabp[i]=atoi(tab[j].data.c_str());
        }
    }
}
*/

int main()
{
    fstream plik;
    int n=3;
    osoba tab[n];
    char wybor, wybor2;
    string a, b, c;
    float d;
    while(true)
    {
    cout<<"__________________MENU__________________"<<endl;
    cout<<"1. Wyswietl informacje o studentach"<<endl;
    cout<<"2. Dodaj studenta"<<endl;
    cout<<"3. Wyswietl osobê wg jednego z kryteriow (najmlodsza, najwyzsza srednia, o podanym nazwisku)"<<endl;
    cout<<"4. Posortuj wedlug wybranej informacji"<<endl;
    cout<<"5. Wyjscie z programu"<<endl;
    cout<<endl;
    wybor=getch();
    switch(wybor)
    {
        case '1':
        {
            cout<<"NR 1: Informacje: "<<endl;
            zap(tab);
            for (int i=0; i<n; i++)
            {
                cout<<"Dane: ";
                cout<<tab[i].imie<<" ";
                cout<<tab[i].nazwisko<<" ";
                cout<<"Rok ur: ";
                cout<<tab[i].data<<" ";
                cout<<"Srednia ocen: ";
                cout<<tab[i].srednia<<endl;
            }
        cout<<endl; cout<<"Wcisnij ENTER by przejsc dalej"<<endl;
        }
        break;

        case '2':
            {
                cout<<"NR 2: Dodaj studenta: "<<endl;
                plik.open("studenci.txt", ios::out | ios::app);
                cout<<"Imie: "<<endl; cin>>a;
                plik<<a<<endl;
                cout<<"Nazwisko: "<<endl; cin>>b;
                plik<<b<<endl;
                cout<<"Data ur: [dd.mm.rrrr] "<<endl; cin>>c;
                plik<<c<<endl;
                cout<<"Srednia: "<<endl; cin>>d;
                plik<<d<<endl;
                n=n+1;
                plik.close(); plik.clear();
                cout<<"Wcisnij ENTER by przejsc dalej"<<endl;
            }
        break;
        case '3':
            {
                cout<<"Wyswietl osobê"<<endl;
                cout<<"1. Najmlodsza"<<endl;
                cout<<"2. Najwyzsza srednia"<<endl;
                cout<<"3. Zgodnie z alfabetem"<<endl; cout<<endl;
                wybor2=getch();
                switch(wybor2)
                {
                    case '1': //najst(tab, n);
                    break;
                    case '2':
                    {
                        cout<<"Najwyzsza srednia ma uczen: "<<endl;
                        srednia(tab, n);
                        cout<<endl;
                    }
                    break;

                    case '3': break;

                    default: cout<<"Nie ma takiej opcji w MENU!"<<endl;
                }

                cout<<"Wcisnij ENTER by przejsc dalej"<<endl;

            }
        break;
        case '4': cout<<"Wcisnij ENTER by przejsc dalej"<<endl; break;
        case '5': exit(0);
        break;
        default:
            {
                cout<<"Nie ma takiej opcji w MENU!"<<endl; cout<<endl;
                cout<<"Wcisnij ENTER by przejsc dalej"<<endl;
            }
    }
        getchar();  system("cls");
    }

    return 0;
}

0

A w jakim języku?

Bo jeśli w C++, to:

  • Możesz użyć std::vector do przechowywania studentów.
  • Jeśli data urodzenia ma być przechowywana w postaci tekstowej, to nie pozostaje nic innego, jak konwersja na format liczbowy.
  • std::string udostępnia operatory porównania, więc nie powinieneś mieć problemów z porównaniem po imionach, nazwiskach: http://en.cppreference.com/w/cpp/string/basic_string/operator_cmp
0

Dziękuje za odpowiedź.
Jeśli chodzi o te nazwiska alfabetycznie to właśnie też w ten sposób to ogarnąłem.
Co do punktu pierwszego to nie mogę korzystać z wektorów.
W jaki sposób mam przekonwertować stringa typu 11.11.2111 na liczbę aby policzyć wiek? (W komentarzu w kodzie źródłowym mam zapisaną konwersję ale nie wiem czy jest dobrze przemyślana).

0

to sobie napisz swoj wlasny

http://codereview.stackexchange.com/questions/60484/stl-vector-implementation

np tutaj masz implementacje

1

A w ogóle z biblioteki standardowej możesz korzystać, czy algorytm sortowania, też masz napisać sam?

Co do parsowania daty, to ja bym zrobił to np. tak:

#include <iostream>
#include <cstdio>
#include <cstdlib>

using namespace std;

struct Date {
  unsigned int day;
  unsigned int month;
  unsigned int year;
};

int main(int argc, char *argv[]) {
  if (argc != 2) {
    cerr << "Use: " << argv[0] << " dd.mm.yyyy" << endl;
    exit(EXIT_FAILURE);
  }
  
  Date date;
  int rc = sscanf(argv[1], "%d.%d.%d", &date.day, &date.month, &date.year);
  if (rc != 3 || rc == EOF) {
    cerr << "Error: " << rc << endl;
    exit(EXIT_FAILURE);
  }

  std::cout << "Day: " << date.day << endl;
  std::cout << "Month: " << date.month << endl;
  std::cout << "Year: " << date.year << endl;

  return EXIT_SUCCESS;
}
0

Dobre informacje są takie, że uporałem się ze wszystkim oprócz liczenia wieku, sortowania względem niego i zwiększenia tej tablicy o jeden gdy dodam studenta. Jakieś propozycje?
Dzięki za odpowiedzi, niestety rozwiązania z zapisem daty użytkownika Sparrow-hawk kompletnie nie rozumiem.

1

To jeśli nie rozumiesz, to pytaj ;-). Co do zwiększania rozmiaru tablicy, to albo zdefiniujesz maksymalny rozmiar bazy danych, albo zrób tablicę dynamiczną. Wtedy będziesz mógł zwiększać/zmniejszać rozmiar tej tablicy. Co do tych dat, to napisz funkcję, która jako argumenty przyjmnie dwie daty. A zwrócona wartość np. -1, 0, 1, będzie określać relacje tych dat względem siebie.

0

Zastosowałem tablice dynamiczne, co do dat to wyciągnąłem funkcją dwie pierwsze liczby i zamieniłem na inta, analogicznie z miesiącami i latami, poczym porównałem je ze sobą i wyłoniłem najmłodszą z osób :) Trochę zawile ale jakoś poszło.
Od dzisiaj też będę szkolić się bardziej w tych wektorach bo mega fajna sprawa.
Dzięki za odpowiedzi.
Pozdrawiam

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