Baza danych w C++

0

Witam

Mam napisać bazę danych w klasycznym C i C++. Najpierw zacznę od C++. Dane mają być wpisane w program. Operując na klasach muszę zrobić dodawanie i usuwanie rekordów z bazy, wyświetlić je na ekranie oraz zapisać do pliku. Zacząłem pisać:

#include "stdafx.h"
#include "iostream"
#include "stdlib.h"

using namespace std;

// Deklaracja klasy reprezentujacej rekord danych osobowych
class SpisOsobDatISwiat
{
	private:
		char Osoba[15]; // Kto
		int Data[10]; // Data swieta
		char NazwaSwieta[8]; // Co to za swieto
	public:
		void Zapamietaj ( const char *, int, const char * );
		void ZapiszDoPliku ( FILE * ) const;
};

void SpisOsobDatISwiat::Zapamietaj( const char *, int, const char * )
		{
			strcpy ( Osoba, (Ojciec));
			Data=23.01.1960;
		}

Chciałem wpisać np. Ojciec 23.01.1960 Urodziny itd. Czy dobrze w ogóle zacząłem? Co jest nie tak?

1

Nie wiem czy wiesz ale C++ ma takie cuda jak stringi czy struktury do przechowywania dat...

0

Ja kiedyś miałem podobne zadanie tylko miałem wykorzystać dynamiczna tablice obiektów która miała zwiększać swój rozmiar jeśli zajdzie taka potrzeba kod funkcji dodajacej rekord:

c_testing * dodaj(c_testing tablica[], int & n)
{
    int k = 0;
    int i = 0;
    int m = 0;
    for (int i=0; i<n; i++)
    {
        if(! (tablica[i].tytul =="") )
        m++;
    }    
    if (m == n)
    {       
        n++;
        c_testing * bufor = new c_testing[n];
        for(int i=0; i<n-1; i++)
            bufor[i] = tablica[i];
   

        cin.get();
        cout<<endl;
        cout<< "podaj tytul ktory chcesz dodac do listy: ";
        string set;
        getline(cin, set);
        
        if (set == "")
        {
            --n;
            return tablica;
        }
        
        c_testing temp(set);
        bufor[n-1] = temp;

        delete [] tablica;
        tablica = new c_testing[n];
        for (int i=0; i<n; i++)
        {
            tablica[i] = bufor[i];
            tablica[i].lp = i+1;
        }
                     
        k = n;
        sort(tablica, tablica+k);
                
        delete [] bufor;        
        return tablica;
    }
    else
    {
        cin.get();
        cout<< "podaj tytul ktory chcesz dodac do listy: ";
        string set;
        getline(cin, set);
        
        if (set == "")
            return tablica;
    
        c_testing temp(set); 
        tablica[m] = temp;
    
        k = m+1;       
        sort(tablica, tablica+k);
        return tablica;
        system("cls");
    }      
}

ale radziłbym ci się tym specjalnie nie sugerować ponieważ sam się dopiero uczę poczekaj na wypowiedzi bardziej doświadczonych
wydaje mi się że możesz wykorzystać kontenery do przechowywanie obiektow 'rekordow' z biblioteki standartowej ;)

reasumując zrobiłem zadanie podobne do twojego tylko ja mialem tam tylko jedna zmienna string do ktorej wpisywalem wszystko i program sortowal mi obiekty alfabetycznie patrząc na stringa a nastepnie zapisywał do pliku w postaci:
Lp Tytul

1 ania
2 bogusia
3 grzesiek
4 justyna
5 kuba
6 magda
7 monika
8 przemek
9 sandra
10 sara
11 wojtek

0

Mam zrobić na klasach. Nie bardzo wiem jak zapisać dowolną datę urodzin do osoby Ojciec w void SpisOsobDatISwiat::Zapamietaj

1

np tak:

#include <iostream>
#include <cstdlib>
using namespace std;

class SpisOsobDatISwiat
{
    private:
        string Osoba; // Kto
        string Data; // Data swieta
        string NazwaSwieta; // Co to za swieto
    public:
        void Zapamietaj ( string osoba1, string data1 );
        void ZapiszDoPliku ( FILE * ) const;
};
 
void SpisOsobDatISwiat::Zapamietaj( string osoba1, string data1)
{
    Osoba = osoba1;
    Data = data1;
}
0

Działa, ale nie wiem czy na pewno o to chodziło. Dla kolejnych (łącznie 20) osób mam po prostu wpisać następne Osoba, Data i Swieto?

1

zobacz na ten przykład dopisałem jeszcze w klasie metode out() która wyświetla wprowadzona osobę oraz datę

#include <iostream>
#include <cstdlib>
using namespace std;
 
class SpisOsobDatISwiat
{
    private:
        string Osoba; // Kto
        string Data; // Data swieta
        string NazwaSwieta; // Co to za swieto
    public:
        void Zapamietaj ( string osoba1, string data1 );
        void ZapiszDoPliku ( FILE * ) const;
        void out();
};
 
void SpisOsobDatISwiat::Zapamietaj( string osoba1, string data1)
{
    Osoba = osoba1;
    Data = data1;
}

void SpisOsobDatISwiat::out()
{
    cout<< "Osoba: " << Osoba <<endl;
    cout<< "Data: " << Data <<endl;
}
 
int main()
{
    SpisOsobDatISwiat zmienna1;
    zmienna1.Zapamietaj("Ania", "22.05.1983");
    zmienna1.out();
    
    
    system("PAUSE");
}

zmienna1 reprezentuje jeden obiekt czyli w tym wypadku jedną osobe jesli potrzebujesz 20 osob tworzysz sobie tablice
SpisOsobDatISwiat tab[20] i np w petli pobierasz dane dla poszczególnych osób

SpisOsobDatISwiat tab[20];
    for (int i=0; i<20; i++) {
        tab[i].Zapamietaj("Ania", "22.05.1983");
        tab[i].out();
    }
0

Dzięki za pomoc. Wklejam cały kod, który będę jeszcze zmieniał

emacs@: Tak, zdaję sobie z tego sprawę, wrzuciłem po prostu cały kod żebyście zobaczyli i już poprawiam na tablicę i pętlę.

0

;o troszkę pokręciłeś

Najprościej zrób tak. Osobna klasa dla osoby i dla daty (masz dwie klasy). oraz trzecia klasa np Spis która jako pola ma właśnie klasę osobę oraz datę. Później robisz tablice/vector/listę Spisu i dodajesz do spisu odpowiednie osoby z odpowiednimi datami.

0

albo tak:

#include <iostream>
#include <stdlib.h>
#include <cstdlib>
using std::cin;
using std::cout;
using std::endl;
using std::string;
 
class SpisOsobDatISwiat
{
        private:
                string Osoba; // Kto
                string Data; // Data swieta
                string NazwaSwieta; // Co to za swieto
        public:
                void Zapamietaj ();
                void ZapiszDoPliku ( FILE * ) const;
                void Dodaj ( const char *, int, const char * );
                void Usun ( const char *, int, const char * );
                void Pokaz();
};




void SpisOsobDatISwiat::Zapamietaj()
{
    cout<< "Osoba: ";
    getline(cin, Osoba);
    cout<< "Data: ";
    getline(cin, Data);
    cout<< "NazwaSwieta: ";
    getline(cin, NazwaSwieta);
}

void SpisOsobDatISwiat::Pokaz()
{
    cout<< "Osoba: " << Osoba <<endl;
    cout<< "Data: " << Data <<endl;
    cout<< "NazwaSwieta: " << NazwaSwieta << endl;
}


int main()
{
    SpisOsobDatISwiat tab[20];
    
    for (int i=0; i<20; i++)
    {
        tab[i].Zapamietaj();
    }
    
     for (int i=0; i<20; i++)
    {
        tab[i].Pokaz();
    }
    
    
    
    system("PAUSE");
}
0

Ok, chwilka, krok po kroku :)

void SpisOsobDatISwiat::Pokaz()
{
    cout<< "Osoba: " << Osoba <<endl;
    cout<< "Data: " << Data <<endl;
    cout<< "NazwaSwieta: " << NazwaSwieta << endl;
}

jest niedobrze, chyba że coś jest nie tak z włączaniem nagłówków

#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <cstdlib>

Ok, widzę już że napisałeś poprawioną wersję. Nie pamiętam żebyśmy kiedyś sami pisali using std::cin;

using std::cout;
using std::endl;
using std::string;

więc będę musiał sprawdzić o co dokładnie chodzi

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>



// TODO: reference additional headers your program requires here

Aha, wolałbym wsadzić wszystkie pliki nagłówkowe do projektu, bo będę go przenosić z i na laptopa/PC kilka razy. Dodałbym je z prawokliku.

Dodałem Tablicę do main. Od początku był błąd z Pokaz. Po prostu zapomniałem dodać #include <string>. Po dodaniu działa. Teraz zastanowię się czy przerobić na najnowszą wersję którą napisałeś czyli z

using std::cout;
using std::endl;
using std::string;

Ok zmieniłem praktycznie wszystko na tą Twoją najnowszą wersję, teraz Wpiszę w

void SpisOsobDatISwiat::Zapamietaj()
{
    cout<< "Osoba: ";
    getline(cin, Osoba);
    cout<< "Data: ";
    getline(cin, Data);
    cout<< "NazwaSwieta: ";
    getline(cin, NazwaSwieta);
}

wszystkie dane dla każdej z osób ( bo program miał mieć już gotowe dane wpisane) .

Ok na razie działa. Z tymże zapomniałem dodać że miało to wyglądać tak:
Osoba || Data || Swieto
Osoba || Data || Swieto
ale to zaraz zrobię

Dane mają być już wpisane w program. Operując na klasach muszę zrobić dodawanie i usuwanie rekordów z bazy, wyświetlić je na ekranie oraz zapisać do pliku.

Ok dzięki wielkie, będę grzebał tak żeby napisało:

Osoba || Data || Swieto
|| ||
Ojciec || 23.01.1960 || Urodziny
Dziadek Kaziu || 04.03 || Imieniny

1

wrzucam gotowca bo już taki program kiedyś robiłem ,że jest to "baza danych" komputera. W cudzysłowie bo tak na prawdę nie można nazwać tego programu bazą danych w sensie logicznym. oto przykładowy kod w języku C może nie jest najpiękniejszy kod bo to jest program na zajęcia ale działa:

 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
	int  iloscRamu;
	int  pojemnoscDysku;

	char  nazwaKartyGraficznej[256];
	int pamiecKartyGraficznej;

	char  nazwaProcesora[256];
	float  taktowanieProcesora;

	char nazwaPlytyGlownej[256];

} Komputer;

FILE * plik = 0; 

void wyswietlBaze(Komputer * komputer) {
	if(!plik)
		return;

	plik = fopen("baza_danych","rb");

	fread(komputer,sizeof((*komputer)),1,plik);
	fclose(plik);

	if((*komputer).iloscRamu != 0) {
		printf("Ilosc ram: %d\n", (*komputer).iloscRamu);
		
	}

	if((*komputer).pojemnoscDysku != 0) {
		printf("Pojemnosc dysku: %d\n", (*komputer).pojemnoscDysku);
	}

	if((*komputer).nazwaKartyGraficznej[0] != 0) {
		puts("Nazwa karty graficznej: ");
		puts((*komputer).nazwaKartyGraficznej);

	}

	if((*komputer).pamiecKartyGraficznej != 0) {
		printf("ilosc pamieci karty graficznej: %d\n", (*komputer).pamiecKartyGraficznej);
	}

	if((*komputer).nazwaProcesora[0] != 0) {
		puts("Nazwa procesora: ");
		puts((*komputer).nazwaProcesora);
	}
	if((*komputer).taktowanieProcesora != 0) {
		printf("taktowanie procesora %f\n", (*komputer).taktowanieProcesora);
	}

	if((*komputer).nazwaPlytyGlownej[0] != 0) {
	puts("Nazwa plyty glownej: ");
	puts((*komputer).nazwaPlytyGlownej);
	}
	system("pause > null");
	system("cls");
}

void modyfikujRekordy(Komputer * komputer) {
	
	int opcja;
	int dane;
	float freq;

	plik = fopen("baza_danych", "wb");

	puts("1 Dodaj rekord\n");
	puts("2 Usun rekord\n");

	scanf("%i", &opcja);

	system("cls");

	puts("1 ilosc Ramu \n");
	puts("2 pojemnosc dysku \n");
	puts("3 nazwa karty graficznej \n");
	puts("4 ilosc pamieci ram karty graficznej \n");
	puts("5 nazwa procesora \n");
	puts("6 taktowanie procesora \n");
	puts("7 nazwa plyty glownej \n");

	

	if(opcja == 1) {

		scanf("%i", &opcja);
		system("cls");
		
		switch(opcja) {
		case 1:
			scanf("%i", &dane);
			(*komputer).iloscRamu = dane;
			break;
		case 2:
			scanf("%i", &dane);
			(*komputer).pojemnoscDysku = dane;
			break;
		case 3:
			fflush(stdin);
			gets((*komputer).nazwaKartyGraficznej);
			break;
		case 4:
			scanf("%i", &dane);
			(*komputer).pamiecKartyGraficznej = dane;
			break;
		case 5:
			fflush(stdin);
			gets((*komputer).nazwaProcesora);
			break;
		case 6:
			scanf("%f", &freq);
			(*komputer).taktowanieProcesora = freq;
			break;
		case 7:
			fflush(stdin);
			gets((*komputer).nazwaPlytyGlownej);
			break;
		}

	}
	else {
		scanf("%d", &opcja);
		system("cls");
		switch(opcja) {
		case 1:
			(*komputer).iloscRamu = 0;
			break;
		case 2:
			(*komputer).pojemnoscDysku = 0;
			break;
		case 3:
			memset((*komputer).nazwaKartyGraficznej,0,sizeof((*komputer).nazwaKartyGraficznej));
			break;
		case 4:
			(*komputer).iloscRamu = 0;
			break;
		case 5:
			memset((*komputer).nazwaProcesora,0,sizeof((*komputer).nazwaProcesora));
			break;
		case 6:
			(*komputer).taktowanieProcesora = 0;
		case 7:
			memset((*komputer).nazwaPlytyGlownej,0,sizeof((*komputer).nazwaPlytyGlownej));
		}

	}


	fwrite(komputer, sizeof((*komputer)), 1,plik);
	fclose(plik);
	system("cls");
}

int main() {
	int wyjscie = 0;
	int opcja;
	Komputer komputer;
	memset(&komputer,0,sizeof(komputer));

	while(!wyjscie) {
		puts("1 Modyfikuj rekordy\n");
		puts("2 Wyswietl baze danych\n");
		puts("3 Wyjscie\n");
		scanf("%d", &opcja);
		switch(opcja) {
		case 1:
			system("cls");
			modyfikujRekordy(&komputer);
			break;
		case 2:
			system("cls");
			wyswietlBaze(&komputer);
			break;
		case 3:
			wyjscie = 1;
			break;
		}
	}

}

0

robcio@: Dzięki. Na razie dłubię w C++, a co C założę osobny wątek później.

Kod zamieściłem w poście niżej.

0
Dun napisał(a):

Mam zrobić na klasach. Nie bardzo wiem jak zapisać dowolną datę urodzin do osoby Ojciec w void SpisOsobDatISwiat::Zapamietaj

Jeśli jak amator - to jako std::string.
Jeśli prowadzący będzie miał dobry humor to przepuści.
Jeśli jak Pro to jako unsigned int (yyyymmdd) ;-)

Co do rozwiązania całego tematu to mogą być setki sposobów - od wersji "C" a'la Robcio po wersję z SQLite.
Wersja w stylu Full True C++ to powinno być Boost: http://www.boost.org/doc/libs/1_51_0/libs/serialization/doc/index.html
Bo samo gołe C++ nie ma wbudowanej serializacji obiektów, można spróbować istream / ostream ale to rzeźba.

0

Chciałbym wszystkie dane Osoba Swieto i Data z main wsadzić do Zapamietaj. W main wolałbym mieć same wywołania funkcji. Napis BAZA DANYCH przeniosę do funkcji Pokaż.
A jesli wykładowca będzie chciał osobne klasy do wszystkich danych, czy dużo zmian będzie trzeba wykonać? (tylko pytam).

Ok nie da się tak łatwo zrobić jak chciałem z przeniesieniem. Tablica przecież musi być dostępna cały czas.
Ok zrobiłem już równe rozmieszczenie dodając tabulatory.

Nie, nie będę nic liczyć na datach.
W jaki sposób zrealizować dodawanie i usuwanie rekordów z bazy? Usuwanie tylko na podstawie nazwy osoby lub nazwy święta. Da się zrobić za pomocą wskaźników, czy jakiś lepszy pomysł?
Na końcu jeszcze zapis do pliku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1