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

Program z użyciem dynamicznej tablicy struktur.

Ostatnio zmodyfikowano 2013-09-30 12:14
Autor Wiadomość
Gogus-96
Temat założony przez niniejszego użytkownika
Program z użyciem dynamicznej tablicy struktur.
» 2013-09-29 09:40:12
Witam. Napisałem część kodu programu jednak w czasie kompilacji wyskakuje mi błąd w linijkach, w których odwołuję się do pola struktury "kwota". W oknie kompilatora wyskakuje komunikat o niezgodności typów: invalid types double[int].
Proszę o odpowiedź gdzie jest błąd.

C/C++
#include <iostream>
#include <string>

using namespace std;

struct struktura
{
    string nazwisko;
    double kwota;
};

int main()
{
    int n;
    cout << "Ilu jest sponsorow? ";
    cin >> n;
    struktura * sponsor = new struktura[ n ];
    for( int i = 0; i < n; i++ )
    {
        cout << "Podaj nazwisko " << i + 1 << " sponsora: ";
        cin >> sponsor->nazwisko[ i ];
        cout << "Podaj kwote ktora wplacil ten sponsor: ";
        cin >> sponsor->kwota[ i ];
    }
    for( int i = 0; i < n; i++ )
    {
        if( sponsor->kwota[ i ] >= 10000 )
        {
            cout << "Nasi wspaniali spondorzy: " << endl;
            continue;
        }
        else
        {
            cout << "Nasi sponsorzy: " << endl;
        }
    }
    return 0;
}


Jeszcze jedna sprawa. W momencie kiedy nie będzie podane nazwisko ma wyskoczyć napis "brak". Jak i gdzie to zapisać.
Z góry dziękuję.
P-92837
rafixxx25
» 2013-09-29 10:44:45
Użyj
[cpp][/cpp]
 do zamieszczania kodu.
Po 1, za każdym odwołaniem do twojej tablicy np:
C/C++
sponsor->nazwisko
traktujesz ją, jak wskaźnik, nie tablicę. Jeśli chcesz odwołać się do konkretnego elementu tablicy użyj:
C/C++
sponsor[ i ]
Po 2, na końcu, przy wypisywaniu wypisujesz tylko "Nasi wspaniali spondorzy:" lub "Nasi sponsorzy:" i nic poza tym.

Polecam zapoznać się jeszcze raz z kursem C++.

//EDIT:
zmieniłeś na chyba jeszcze gorsze :P
C/C++
sponsor->nazwisko[ i ];
Traktujesz sponsor jak wskaźnik do struktury, która zawiera tablice.
Przeczytaj jeszcze raz o tablicach oraz strukturach.
P-92839
pekfos
» 2013-09-29 11:48:42
C/C++
sponsor->kwota[ i ];
sponsor->kwota, to składowa kwota pierwszego elementu tablicy. W efekcie robisz to:
C/C++
//double sponsor0_kwota;
sponsor0_kwota[ i ];
Nie muszę chyba tłumaczyć, dlaczego to jest niepoprawne.

traktujesz ją, jak wskaźnik, nie tablicę.
Przecież to jest wskaźnik (na tablicę).

C/C++
sponsor->nazwisko[ i ];
Traktujesz sponsor jak wskaźnik do struktury, która zawiera tablice.
Zły przykład, std::string można traktować jak tablicę.
P-92846
rafixxx25
» 2013-09-29 20:01:33
@pekfos,
1. Wiem, że jest to wskaźnik na tablicę. Po prostu używa go jak 'zwykłego' wskaźnika zamiast potraktować sponsor jako tablicy(nie wiem jak to można profesjonalnie powiedzieć :P)
2. Rzeczywiście, zły przykład. Wziąłem pierwsze odwołanie z brzegu bez patrzenia na typ zmiennej ;).
Wspomnę jeszcze, że słówko
continue
 w tym przypadku nie ma żadnego zastosowania.

P-92888
kacpero1094
» 2013-09-29 20:04:56
Ja pozwoliłem sobie trochę przerobić ten przykład:
C/C++
#include <iostream>
#include <string>

using namespace std;

struct struktura
{
    string nazwisko;
    double kwota;
};

int main()
{
    int n;
    cout << "Ilu jest sponsorow? ";
    cin >> n;
    struktura * sponsor = new struktura[ n ];
   
    for( int i = 0; i < n; ++i )
    {
        cout << "Podaj nazwisko " << i + 1 << " sponsora: ";
        cin >> sponsor[ i ].nazwisko;
        cout << "Podaj kwote ktora wplacil ten sponsor: ";
        cin >> sponsor[ i ].kwota;
    }
   
    cout << "Nasi wspaniali spondorzy:\n";
    for( int i = 0; i < n; ++i )
    {
        if( sponsor[ i ].kwota >= 10000 )
        {
            cout << "\t+ " << sponsor[ i ].nazwisko << " (" << sponsor[ i ].kwota << "\n";
        }
    }
   
    cout << "Nasi sponsorzy:\n";
    for( int i = 0; i < n; ++i )
    {
        if( sponsor[ i ].kwota < 10000 )
        {
            cout << "\t+ " << sponsor[ i ].nazwisko << " (" << sponsor[ i ].kwota << "\n";
        }
    }
    return 0;
}
Przydałoby się, żebyś zwrócił uwagę na kilka rzeczy:
1) wskaźnikiem jest sponsor! to podstawowy błąd, o którym wspomnieli również moi przedmówcy i to przy nim stosujesz operator[]
2) przy iteracji, niezależnie od tego, z jakiej pętli korzystasz, używaj post-inkrementacji (zmienna++) lub post-dekrementacji (zmienna--) tylko wtedy kiedy jest to naprawdę potrzebne. Jeżeli nie potrzebujesz wartości zmiennej sprzed zmiany, to korzystaj z pre-inkrementacji (dekrementacji) (++zmienna). Różnica jest taka, że przy post-inkrementacji najpierw wartość zmiennej jest kopiowana do drugiej zmiennej, która wymaga zarezerwowania pamięci, potem oryginalna zmienna jest zwiększana/zmniejszana o jeden, a zwracana jest stara wartość. W przypadku pre-inkrementacji wartość zmiennej zwiększa/zmniejsza się o 1 i jest zwracana. Nie ma niepotrzebnej, dodatkowej rezerwacji.
3) Wyświetlanie powinno wyglądać tak. Spójrz, co zrobiłeś źle. Oczywiście lepszym rozwiązaniem byłoby posortowanie sponsorów wg. zmiennej składowej kwota (skorzystalibyśmy z funkcji sort z pliku nagłówkowego <algorithm>), a do tego należałoby stworzyć funkcję sortującą:
C/C++
bool sort_struktura( struktura i, struktura j ) { return( i.kwota < j.kwota ); }
P-92889
pekfos
» 2013-09-29 20:30:09
2) przy iteracji, niezależnie od tego, z jakiej pętli korzystasz, używaj post-inkrementacji (zmienna++) lub post-dekrementacji (zmienna--) tylko wtedy kiedy jest to naprawdę potrzebne. Jeżeli nie potrzebujesz wartości zmiennej sprzed zmiany, to korzystaj z pre-inkrementacji (dekrementacji) (++zmienna).
Dobry nawyk, bo to czasem ma znaczenie. W tym przypadku akurat nie ma.

C/C++
bool sort_struktura( struktura i, struktura j )
Tak chciałeś uniknąć wątpliwej rezerwacji kilku bajtów, a tu niepotrzebne kopiowanie całej struktury ;) I do tego tablica Ci ucieka, bo jej nie zwalniasz.
P-92891
kacpero1094
» 2013-09-30 12:14:17
Masz rację, powinno się te zmienne przekazać przez referencję:
bool sort_struktura( struktura & i, struktura & j )
Przeoczyłem to w pośpiechu.
P-92904
« 1 »
  Strona 1 z 1