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. #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ę. |
|
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: traktujesz ją, jak wskaźnik, nie tablicę. Jeśli chcesz odwołać się do konkretnego elementu tablicy użyj: 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 Traktujesz sponsor jak wskaźnik do struktury, która zawiera tablice. Przeczytaj jeszcze raz o tablicach oraz strukturach. |
|
pekfos |
» 2013-09-29 11:48:42 sponsor->kwota, to składowa kwota pierwszego elementu tablicy. W efekcie robisz to: Nie muszę chyba tłumaczyć, dlaczego to jest niepoprawne. traktujesz ją, jak wskaźnik, nie tablicę. |
Przecież to jest wskaźnik (na tablicę). Traktujesz sponsor jak wskaźnik do struktury, która zawiera tablice. |
Zły przykład, std::string można traktować jak tablicę. |
|
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. |
|
kacpero1094 |
» 2013-09-29 20:04:56 Ja pozwoliłem sobie trochę przerobić ten przykład: #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ą: bool sort_struktura( struktura i, struktura j ) { return( i.kwota < j.kwota ); }
|
|
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. 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. |
|
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. |
|
« 1 » |