atub Temat założony przez niniejszego użytkownika |
C++ Baza danych obiektowo » 2017-12-13 02:12:00 Witam ! Mam zadanie o treści : Napisz prosty program ewidencyjny o następującej funkcjonalności: 1. Po uruchomieniu wyświetli się menu powitalne, program zapyta nas w nim czy chcemy dodać informacje o nowej osobie. 2. Jeśli odpowiedź jest twierdząca, program utworzy nowy obiekt klasy Osoba a następnie umożliwi określenie jej daty urodzenia, koloru oczu, płci, wzrostu itp. Wprowadzone dane będą polami nowo utworzonego obiektu. 3. W klasie Osoba oprogramuj metodę "ObliczWiek" - metoda ma obliczać liczbę lat danej osoby na podstawie jej wieku urodzenia. 4. Menu ma wyświetlać liczbę zaewidencjonowanych osób. 5. W menu proszę dodać opcję wyszukania osoby według zadanego kryterium (np. wzrost). 6. W menu proszę dodać opcję usunięcia wpisu o danej osobie. 7. W menu proszę dodać opcję archiwizacji danych o zaewidencjonowanych osobach w pliku tekstowym. Uwagi: należy wykorzystać tablicę obiektów klasy Osoba. Większość kodu już napisałem chodzi mi o dwa punkty. Zapis do pliku txt który również mam napisany lecz nie działa on prawidłowo(case 4). Plik nie pojawia się w folderze projektu. Drugi problem mam przy usuwaniu wybranego obiektu z tablicy obiektów. Koda wstawiam poniżej proszę o pomoc lub jakieś sugestie. #include "stdafx.h" #include <iostream> #include <time.h> #include <string> #include <Windows.h> #include <cstdlib> #include <fstream>
using namespace std; int znak; int znak2;
class Osoba { public: int dzien_urodzin; int miesiac_urodzin; int rok_urodzin; int wzrost; string kolor_oczu; string plec; string imie; string nazwisko; void dodaj_osobe(); void wyswietl_osoby(); int oblicz_wiek(); void wyszukiwanie_wzrost( int zadany ); };
int main() { Osoba * tab; int ile; int licznik; int indeks; int wzrost; cout << "Ile osob chcesz dodac ?\n"; cin >> ile; tab = new Osoba[ ile ]; for( int i = 0; i < ile; i++ ) { tab[ i ].dodaj_osobe(); } system( "cls" ); do { cout << " Wcisnij 1 by wyswietlic dodane osoby \n Wcisnij 2 by obliczyc wiek osoby\n Wcisnij 3 by wyszukac osobe po wzroscie\n Wcisnij 4 by zapisas dane to pliku txt\n Wcisnij 5 by usunac osobe z bazy\n Wcisnij 6 by zakonczyc dzialanie programu\n"; cin >> znak; switch( znak ) { case 1: for( int i = 0; i < ile; i++ ) { cout << "ID:" << i; tab[ i ].wyswietl_osoby(); } cout << endl; break; case 2: cout << "Podaj ID osoby ktorej wiek chcesz obliczyc\n"; cin >> indeks; tab[ indeks ].oblicz_wiek(); break; case 3: cout << "Podaj wzrost osoby ktora chcesz wyszukac\n"; cin >> wzrost; for( int i = 0; i < ile; i++ ) { tab[ i ].wyszukiwanie_wzrost( wzrost ); } break; case 4: { fstream plik; for( int i = 0; i < ile; i++ ) { plik.open( "plik.txt", ios::out | ios::app ); plik << tab[ i ].imie << " " << tab[ i ].nazwisko << endl; plik << tab[ i ].plec << endl; plik << tab[ i ].kolor_oczu << endl; plik << tab[ i ].wzrost << endl; plik << tab[ i ].dzien_urodzin << "." << tab[ i ].miesiac_urodzin << "." << tab[ i ].rok_urodzin << " r" << endl; plik.close(); } break; } case 5: break; case 6: cout << "Koniec programu" << endl; break; } } while( znak != 6 ); return 0; }
void Osoba::dodaj_osobe() { cout << "Dodawanie nowej osoby" << endl; cout << "Podaj imie: "; cin >> imie; cout << "Podaj nazwisko: "; cin >> nazwisko; cout << "Podaj kolor oczu: "; cin >> kolor_oczu; cout << "Podaj plec: "; cin >> plec; cout << "Podaj wzrost: "; cin >> wzrost; cout << "Podaj dzien urodzenia: "; cin >> dzien_urodzin; cout << "Podaj miesiac urodzenia: "; cin >> miesiac_urodzin; cout << "Podaj rok urodzenia: "; cin >> rok_urodzin; }
void Osoba::wyswietl_osoby() { cout << "\n Imie i nazwisko: " << imie << " " << nazwisko; cout << "\n Plec: " << plec; cout << "\n Kolor oczu: " << kolor_oczu; cout << "\n Wzrost: " << wzrost << " cm"; cout << "\n Data urodzenia: " << dzien_urodzin << "." << miesiac_urodzin << "." << rok_urodzin << endl; }
int Osoba::oblicz_wiek() { SYSTEMTIME st; GetLocalTime( & st ); int dzien = st.wDay; int miesiac = st.wMonth; int rok = st.wYear; int wiek; if( miesiac_urodzin - miesiac > 0 ) { wiek = rok - rok_urodzin - 1; } else if( miesiac_urodzin == miesiac ) { if( dzien_urodzin == dzien ) { wiek = rok - rok_urodzin; } else if( dzien_urodzin > dzien ) { wiek = rok - rok_urodzin; } else if( dzien > dzien_urodzin ) { wiek = rok - rok_urodzin; } } else if( miesiac_urodzin < miesiac ) { wiek = rok - rok_urodzin; } cout << "Osoba ma " << wiek << " lat!" << endl; return wiek; }
void Osoba::wyszukiwanie_wzrost( int zadany ) { cout << endl; if( zadany == wzrost ) { cout << imie << " " << nazwisko; cout << endl; } }
|
|
darko202 |
» 2017-12-13 09:04:38 |
|
mateczek |
» 2017-12-13 09:27:50 @darko. MA niefortunnie nazwane metody klasy "osoba" A możliwości dodawania czy usuwania sugerują, że oprócz klasy osoba powinien dodać klasę "lista_osob" gdzie by mógł trzymać i usuwać wpisy. Te metody powinny być w klasie "lista_Osob" void dodaj_osobe(); void wyswietl_osoby(); void wyszukiwanie_wzrost( int zadany );
void wymazOsobe( const strnig & imie )
takie małe uwagi Osoba tab = new Osoba[ ile ];
for( int i = 0; i < ile; i++ ) { tab[ i ] = new Osoba(); tab[ i ].dodaj_osobe(); }
|
|
darko202 |
» 2017-12-13 10:48:41 1. rzeczywiście zgodnie z zasadami lepiej byłoby użyć nowej klasy. 2. nie mogłem znaleźć przykładu, ale teraz już mam np. https://pebx.pl/t/c-tablica-obiektow-klasy.681928/ponieważ zauważyłem różnice, które mogą być dla @atub problemem podsumujmy kod wynikowy class samochod { string marka, kolor; int przebieg; public: samochod( string a, string b, int c ) : marka( a ) , kolor( b ) , przebieg( c ) { }; void show() { cout << marka << " " << kolor << " " << przebieg; } };
samochod ** lista; lista = new samochod *[ 10 ]; for( int i = 0; i < 10; i++ ) { samochod[ i ] = new samochod( "marka", "kolor", 0 ); }
for( int i = 0; i < 10; i++ ) delete lista[ i ];
delete[] lista;
lista[ 0 ]->show();
|
|
atub Temat założony przez niniejszego użytkownika |
» 2017-12-17 12:41:58 Zakładając że nie ma głupich pytań to nie rozumiem jednego zagadnienia. Mianowicie przy tworzeniu tablicy dynamicznej i po jej wypełnieniu należy ją usunąć. W jaki sposób więc przekazać później te dane do funkcji które są napisane skoro zostaną usunięte z pamięci ? |
|
jankowalski25 |
» 2017-12-17 13:25:32 Dane usuwasz wtedy, gdy nie są już potrzebne. Nie ma sensu pozbywać się tego, z czego chcesz jeszcze korzystać. |
|
atub Temat założony przez niniejszego użytkownika |
» 2017-12-17 13:56:47 Dobrze dalej nie mam pojęcia w jaki sposób mógłbym usunąć wybraną osobę z dynamicznej tablicy obiektów. Z tego co zrozumiałem jest to niemożliwe. W poleceniu jest podkreślone by działać na tablicach obiektów więc chyba nie bardzo mogę użyć do tego wektorów |
|
jankowalski25 |
» 2017-12-17 15:51:11 Dlaczego niemożliwe? Załóżmy, że masz dynamiczną tablicę liczb i chcesz usunąć drugi element: ┌─┬──┬─┬──┬──┐ │5│-4│8│17│43│ └─┴──┴─┴──┴──┘ 1. Oznaczenie miejsca jako wolne. ┌─┬──┬─┬──┬──┐ │5│ │8│17│43│ └─┴──┴─┴──┴──┘ 2. Przesunięcie "dziur" na koniec. ┌─┬─┬──┬──┬─┐ │5│8│17│43│ │ └─┴─┴──┴──┴─┘ 3. Zmiana rozmiaru tablicy. ┌─┬─┬──┬──┐ │5│8│17│43│ └─┴─┴──┴──┘ Pierwszy krok zapewnia, że element będzie usunięty; drugi, że nie będzie dziur w środku, tylko co najwyżej na końcu; a trzeci gwarantuje, że tablica jest zawsze całkowicie wypełniona. Teraz pytanie: którego z tych trzech przypadków potrzebujesz? |
|
« 1 » 2 |