Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] Program wypisujący dane z pliku bez powtórzeń

Ostatnio zmodyfikowano 2016-01-28 15:12
Autor Wiadomość
pzet
Temat założony przez niniejszego użytkownika
[C] Program wypisujący dane z pliku bez powtórzeń
» 2016-01-27 17:42:51
Witam! Mam do napisania program, który:
1. Z pliku wejściowego pobierze imię, nazwisko oraz ocenę
2. Przypisze odpowiednie wartości do danego elementu struktury
3. Wypisze na ekran output w postaci: Jan Kowalski 5, 3, 4.5
4. Jeśli nazwisko i imię w pliku wejściowym będzie powtórzone, to ma dopisać do istniejącego wpisu ocenę
5. Jeśli nazwisko pojawia się po raz pierwszy, ma utworzyć nową linijkę z oceną ("Adam Nowak 2.0")

Na początek definiuję strukturę:

C/C++
typedef struct
{
    char nazwisko[ 30 ];
    char imie[ 30 ];
    char ocena[ 30 ][ 4 ]; /* 5 znaki dla liczb typu 4.25 */
    int liczba_ocen;
} student;

student grupa[ 30 ];

W celu porównania (i estetyki) pobrane z pliku imię i nazwisko wysyłam do funkcji, która zamienia pierwszą literę na wielką, pozostałe na małe:

C/C++
int ZmienLitere( char napis[] )
{
    napis[ 0 ] = toupper(( napis[ 0 ] ) );
    int i = 0;
    for( i = 1; i <=( strlen( napis ) ); i++ )
    {
        napis[ i ] = tolower( napis[ i ] );
    }
}

Oraz funkcja służąca do porównania imienia i nazwiska:
C/C++
int porownaj( student s1, student s2 )
{
    int i;
    i = strcmp( s1.nazwisko, s2.nazwisko );
    if( i == 0 ) return strcmp( s1.imie, s2.imie );
    else return i;
   
}

Problem pojawia się w tym, że nie wiem jak napisać fragment, który sprawdza, czy nazwisko pojawiło się już wcześniej. Z tego co udało mi się wymyślić, to:
1. Tworzę strukturę tymczasową student temp, do której będę wrzucał aktualnie odczytane nazwisko
2. Pętlą for/while sprawdzam po poprzednich elementach grupa, czy taki sam wpis już istnieje
3. Jeśli nie, to przypisuję wartość temp.ocena do grupa.ocena[j]

Oto moje wypociny - czy ktoś może pomóc naprowadzić mnie na rozwiązanie? Czy należy uzupełnić najpierw pierwszy element grupa[0], a potem porównywać go z elementem grupa[1], grupa[2] itd.? Z góry dziękuję! :)

C/C++
while( !feof( F ) )
{
   
    fscanf( F, "%s, %s, %s", & tempNazwisko, & tempImie, & tempOcena );
    tempImie = ZmienLitere( tempImie );
    tempNazwisko = ZmienLitere( tempNazwisko );
    tempOcena = konwertuj( tempOcena );
   
    for( i = 0; i < 30; i++ )
    {
        strcpy( grupa[ i ].imie, tempImie );
        strcpy( grupa[ i ].nazwisko, tempNazwisko );
        strcpy( grupa[ i ].ocena, tempOcena );
    }
   
   
}
P-144071
darko202
» 2016-01-28 15:12:25
1.
najpierw wczytaj wszystkie dane z pliku do tablicy struktury
później sprawdzaj powtórzenia i dokonuj odpowiedniej korekty

2.
mógłbyś po wczytaniu tablicę posortować np. nazwisko, imie

3.
mógłbyś zmienić zasadę przechowywania ocen
a) dwie struktury
   * dane osobowe [ index, imie, nazwisko]
   * oceny [index, ocena]
sortujesz obie po indeksie  i łatwo to przeglądać i wyświetlać
- rozwiązanie zbliżone do baz danych

b) jedna struktura przechowywana w tablicy
   nazwisko, imie, ocena, wskaźnik na następną ocenę, czy pierwsza

   wskaźnik na następną ocenę - odniesienie do elementu tablicy
                                jeśli null nie ma kolejnej
   czy pierwsza - info o kolejnej ocenie - korygujesz w procesie sprawdzenia
                  wstępnie wszystkie pierwsze



P-144108
« 1 »
  Strona 1 z 1