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

C++ Baza danych obiektowo

Ostatnio zmodyfikowano 2017-12-17 17:54
Autor Wiadomość
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.

C/C++
#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;
    }
}
P-167850
darko202
» 2017-12-13 09:04:38
1.
źle tworzysz tablicę obiektów

powinno to wyglądać jakoś tak
C/C++
//- deklaracja tabicy dynamicznej
// int tablica = new int[rozmiar]

Osoba tab = new Osoba[ ile ];

//- deklaracja tabicy
// int tablica[5];

Osoba tab[ 5 ];

// stworzenie nowego obiektu
for( int i = 0; i < ile; i++ )
{
    tab[ i ] = new Osoba(); // new dla obiektu tab[i]
    tab[ i ].dodaj_osobe(); //wypełnienie danymi
}

// usuwanie / zwolnienie pamięci
// wszystkich obiektów
for( int i = 0; i < ile; i++ )
{
    delete tab[ i ];
}

// samej zmiennej dla tablicy dynamicznej
delete tab;

2.
przeczytaj o "Ścieżkach względnych i ścieżkach bezwzględnych"
np. na
http://cpp0x.pl/kursy/Kurs-C++​/Poziom-4​/Podstawy-obslugi-plikow/355
i
https://forum.pcformat.pl​/C-Pobieranie-sciezki-do-katalogu-w-ktorym-znajduje-sie-program-t

3.
usuwanie obiektów z bazy wymaga abyś
* wczytał wszystkie obiekty z pliku do np. tablicy
* usunął wybrane obiekty z tablicy
* zapisał pozostałe obiekty do pliku

można by użyć kontenera np.
http://cpp0x.pl/kursy​/Kurs-STL-C++​/Kontener-tablicy-std-vector​/119
jest tam przykład kontenera obiektów

4.
zapoznaj się z techniką debugowania kodu np.
https://www.youtube.com/watch​?v=XCH9nWGCv6k

https://www.bing.com/search​?q=c%2b%2b+debugger&qs=OS​&pq=c%2b%2b+debuger&sc=1-11​&cvid=A7F33BDF20A04265A45DC318F​F0C59A2​&FORM=QBRE&sp=1&ghc=1

5.
używaj znaczników [ cpp ] .... [ /cpp ] dla wklejania kodu
jest wtedy bardziej czytelny


P-167852
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"

C/C++
void dodaj_osobe();
void wyswietl_osoby();
void wyszukiwanie_wzrost( int zadany );
// i dodatkowo
void wymazOsobe( const strnig & imie )


takie małe uwagi
C/C++
Osoba tab = new Osoba[ ile ]; // new tworzy wskaźnik czyli jeśli już Osoba*tab= new Osoba[ ile ]


// stworzenie nowego obiektu
for( int i = 0; i < ile; i++ )
{
    tab[ i ] = new Osoba(); // new dla obiektu tab[i]
    // nie pójdzie bo wówczas tablica musiała by być:
    //Osoba**tab= new *Osoba[ ile ]
    tab[ i ].dodaj_osobe(); //wypełnienie danymi
}
P-167855
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.68192​8​/

ponieważ zauważyłem różnice, które mogą być dla @atub problemem 
podsumujmy kod wynikowy
C/C++
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 );
}

//... potem trzeba te obiekty i tablicę usunąć:

for( int i = 0; i < 10; i++ )
     delete lista[ i ];

delete[] lista;


//I przy okazji, w takiej sytuacji do metod odnosisz się nie kropką,
//tylko operatorem wyłuskania, czyli ->:

lista[ 0 ]->show();

 
P-167856
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 ?
P-167943
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ć.
P-167945
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
P-167947
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?
P-167950
« 1 » 2
  Strona 1 z 2 Następna strona