Witam,
jestem w trakcie pisania programu semestralnego i miałbym taką prośbę aby ktoś zobaczył czy to co napisałem ma jakiś sens i czy jest napisane w miarę obiektowo.
Sam program to jest po prostu prosta obsługa bazy danych MYSQL.
Jednym z takich problemów jest to że muszę w programie zastosować przeciążenie operatorów. Napisałem te funkcje ale o ile operator wyjścia jeszcze jakoś daje radę o tyle operator wejścia powoduje że mam problem bo wcześniej napisałem sobie funkcję "wymagane_pole()" która to sprawdza mi oraz odpowiednio formatuje to co zostaje wprowadzane. I teraz problem jest taki że jak bym chciał to zastosować w przeciążeniu to bym musiał 9 raz to skopiować a to przecież mija się celem...
I jeszcze kilka takich pytań(słowo mogę oznacza czy jest to poprawne):
- Czy mogę robić w metodach obiekty ?
- Czy mogę w każdej metodzie nawiązywać połączenie z bazą danych.
- Czy jeśli pobieram z bazy i dane te są jako tablica "row" to czy muszę je zapisywać do obiektu żeby wyświetlić ? Jeśli tak to jak to zrobić bo jeśli próbuję napisać osoba.imie = row[1]; to jest błąd, dlaczego ?
PS: program działa :)
Po niżej wrzucam kod klasy dane_osobowe.h
#include "stdafx.h"
#pragma once
class dane_osobowe
{
protected:
string imie;
string nazwisko;
string telefon;
string ulica;
string nr_domu_mieszkania;
string kod_pocztowy;
string miejscowosc;
string email;
public:
dane_osobowe(void);
~dane_osobowe(void);
void dane_osobowe_dodaj(dane_osobowe *osoba);
void dane_osobowe_edytuj();
void dane_osobowe_wyswietl();
void dane_osobowe_wpisz(); /// wymagane pole
void dane_osobowe_usun();
void dane_osobowe_sortuj();
void dane_osobowe_logi();
friend void polaczenie_MYSQL();
friend void zamykanie_MYSQL();
friend string wymagane_pole( string nazwa_pola, string pole );
friend ostream& operator<< (ostream&, dane_osobowe const&);
friend istream& operator>> (istream& , dane_osobowe&);
};
dane_osobowe.cpp
#include "StdAfx.h"
#include "dane_osobowe.h"
dane_osobowe::dane_osobowe(void) // konstruktro ktory wykonuje sie podczas uruchminie classy(zawiera domyślne wartości)
{
imie = "";
nazwisko= "brak";
telefon= "brak";
ulica= "brak";
nr_domu_mieszkania= "brak";
kod_pocztowy= "brak";
miejscowosc= "brak";
email= "brak";
//cout << "konstruktor";
}
dane_osobowe::~dane_osobowe(void)
{
//cout << "destruktor";
}
void dane_osobowe::dane_osobowe_dodaj(dane_osobowe *osoba)
{
cout << osoba->imie << endl;
cout << osoba->imie << endl;
cout << osoba->imie << endl;
}
void dane_osobowe::dane_osobowe_edytuj()
{
string id;
bool sprawdzenie_id = false, wyjscie_end = false;
for(;;)
{
while(sprawdzenie_id == false)
{
cout << endl << "(Wyjscie po wpisaniu 'end') - Prosze wpisac id osoby ktora chcesz edytowac: ";
cin >> id;
id = id.substr(0,3); // uciananie stringu do 3 miejsc
int dlugosc_id = id.length();
if(id == "end")
{
wyjscie_end = true;
break;/// wyjscie z funkcji
}
else
{
int sprawdza = 0;
for(int i = 0; i < dlugosc_id; i++)
{
if(id[i] >= '0' && id[i] <= '9' )
{
sprawdza = sprawdza +1;
}
}
if(sprawdza == dlugosc_id) {
sprawdzenie_id = true;
}
else
{
cout << "Prosze wprowadzic liczby!";
sprawdzenie_id = false;
}
}
}
if(wyjscie_end)
{
break;
}
polaczenie_MYSQL();
MYSQL_ROW row; // pojedynczy wiersz
char bufor [500];
sprintf(bufor, "SELECT * FROM osoby WHERE id_osoba = %s",id.c_str());
mysql_query(conn,bufor);
result = mysql_store_result(conn); // pobieramy wynik poprzedniego zapytania
int ile_wierszy = mysql_num_rows(result);
if( ile_wierszy == 1)
{
dane_osobowe osoba_edycja;
osoba_edycja.imie = wymagane_pole("imie",imie);
osoba_edycja.nazwisko = wymagane_pole("nazwisko",nazwisko);
osoba_edycja.ulica = wymagane_pole("ulica",ulica);
osoba_edycja.nr_domu_mieszkania = wymagane_pole("nr domu/mieszkania",nr_domu_mieszkania);
osoba_edycja.miejscowosc = wymagane_pole("miejscowosc",miejscowosc);
osoba_edycja.kod_pocztowy = wymagane_pole("kod pocztowy",kod_pocztowy);
osoba_edycja.telefon = wymagane_pole("telefon",telefon);
osoba_edycja.email = wymagane_pole("email",email);
if(result){
unsigned long num_fields = mysql_num_fields(result);
while (row = mysql_fetch_row(result)){
for(int i = 1; i < num_fields; i++)
{
cout << row[i];
switch(i)
{
case 1:
imie = row[i];
if(imie != osoba_edycja.imie){ imie = osoba_edycja.imie; }
break;
case 2:
nazwisko = row[i];
if(nazwisko != osoba_edycja.nazwisko){ nazwisko = osoba_edycja.nazwisko; }
break;
case 3:
ulica = row[i];
if(ulica != osoba_edycja.ulica){ ulica = osoba_edycja.ulica; }
break;
case 4:
nr_domu_mieszkania = row[i];
if(nr_domu_mieszkania != osoba_edycja.nr_domu_mieszkania){ nr_domu_mieszkania = osoba_edycja.nr_domu_mieszkania; }
break;
case 5:
miejscowosc = row[i];
if(miejscowosc != osoba_edycja.miejscowosc){ miejscowosc = osoba_edycja.miejscowosc; }
break;
case 6:
kod_pocztowy = row[i];
if(kod_pocztowy != osoba_edycja.kod_pocztowy){ kod_pocztowy = osoba_edycja.kod_pocztowy; }
break;
case 7:
telefon = row[i];
if(telefon != osoba_edycja.telefon){ telefon = osoba_edycja.telefon; }
break;
case 8:
email = row[i];
if(email != osoba_edycja.email){ email = osoba_edycja.email; }
break;
}
}
}
}
char query[900]; //bufor
sprintf(query, "UPDATE osoby SET imie='%s', nazwisko='%s', ulica='%s', nr_domu_mieszkania='%s', miejscowosc='%s', kod_pocztowy='%s', telefon='%s', email='%s' WHERE id_osoba = %s LIMIT 1", imie.c_str(), nazwisko.c_str(), ulica.c_str(), nr_domu_mieszkania.c_str(), miejscowosc.c_str(), kod_pocztowy.c_str(), telefon.c_str(), email.c_str(), id.c_str());
mysql_query(conn,query);
if(mysql_query(conn,query))
{
cout << "Blad: " << mysql_error(conn) << endl;
}
else
{
cout << "Rekord o id " << id <<" poprawnie edytowano!" << endl;
}
break;
}
else
{
cout << "Podane id nie istnieje w bazie danych!";
sprawdzenie_id = false;
}
mysql_free_result(result); // zwalnia pamieć zajeta przez res
zamykanie_MYSQL();
}
}
void dane_osobowe::dane_osobowe_wyswietl()
{
dane_osobowe osoba;
polaczenie_MYSQL();
cout << osoba;
zamykanie_MYSQL();
}
void dane_osobowe::dane_osobowe_wpisz()
{
dane_osobowe osoba;
cin >> osoba;
cout << osoba.imie;
polaczenie_MYSQL();
char query[500]; //bufor
sprintf(query, "INSERT INTO osoby VALUES('', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s');", osoba.imie.c_str(), nazwisko.c_str(), ulica.c_str(), nr_domu_mieszkania.c_str(), miejscowosc.c_str(), kod_pocztowy.c_str(), email.c_str(), telefon.c_str());
//mysql_query(conn,query);
if(mysql_query(conn,query))
{
cout << "Blad: " << mysql_error(conn) << endl;
}
else
{
cout << "Dodano poprawnie osobe!" << endl;
}
zamykanie_MYSQL(); // zamkniecie polaczenia
}
void dane_osobowe::dane_osobowe_usun()
{
polaczenie_MYSQL();
zamykanie_MYSQL();
}
void dane_osobowe::dane_osobowe_sortuj()
{
}
void dane_osobowe::dane_osobowe_logi()
{
}
//---------------------------------------------------------------------------------------------
string wymagane_pole( string nazwa_pola, string pole )
{
bool sprawdzenie = FALSE;
while(sprawdzenie == FALSE)
{
cout << "Wpisz " << nazwa_pola << ":";
getline(cin,pole);
if(pole == "")
{
sprawdzenie = FALSE;
cout << "Pole " << nazwa_pola << " jest wymagane!" << endl;
}
else
{
if( nazwa_pola == "email" ) // tylko jeśli wprowadzamy email
{
regex wzorzec("^[a-zA-Z0-9]*@[a-zA-Z0-9]*(\\.[a-zA-Z]{2,4})$");
bool walidacja = regex_match(pole, wzorzec);
if(walidacja == FALSE )
{
cout << "Wpisany adres email nie jest poprawny!" << endl;
}
else
{
sprawdzenie = TRUE;
}
}
else
{
sprawdzenie = TRUE;
}
}
}
//Funkcja ktora usuwa poczatkowe spacje oraz zamienia 1 literę na wielką
// wszystkie pola po za adresem email
if( nazwa_pola != "email" )
{
if((int)pole[0] != 32 )
{
pole[0] = toupper(pole[0]);
}
else
{
int n=pole.size();
string czyste_pole;
for(int i=0, k = 0; i<n; i++)
{
if((int)pole[i] != 32 ) //usuwanie spacji z tekstu
{
czyste_pole+=pole[i];
}
}
pole = czyste_pole;
pole[0] = toupper(pole[0]);
}
}
return pole;
}
istream& operator>>(istream& wejscie, dane_osobowe& osoba)
{
//wejscie >> osoba.imie >> osoba.nazwisko >> osoba.ulica >> osoba.nr_domu_mieszkania >> osoba.miejscowosc >> osoba.kod_pocztowy >> osoba.telefon >>osoba.email;
cout << osoba.imie;
bool sprawdzenie = FALSE;
while(sprawdzenie == FALSE)
{
cout << "Wpisz imie:";
wejscie >> osoba.imie;
cout << osoba.imie;
if(osoba.imie == "" && osoba.imie == "brak" )
{
sprawdzenie = FALSE;
cout << "Pole jest wymagane!" << endl;
}
else
{
sprawdzenie = TRUE;
}
}
return wejscie;
}
ostream& operator<< (ostream &wyjscie, dane_osobowe const& osoba)
{
MYSQL_ROW row; // pojedynczy wiersz
mysql_query(conn,"SELECT * FROM osoby"); // tworzymy zapytanie
result = mysql_store_result(conn); // pobieramy wynik poprzedniego zapytania
if(result){ // Jesli res zawiera jakieś wpisy
unsigned long num_fields = mysql_num_fields(result); // liczba pol w wierszu - kolumn
wyjscie <<"+---+--------------------+-------------------------+-------------------------+--------+-------------------------+----------+------------------------------+--------------------+"<< endl;
wyjscie << "|";
wyjscie.width(3);
wyjscie << "Id";
wyjscie << "|";
wyjscie.width(20);
wyjscie << "Imie";
wyjscie << "|";
wyjscie.width(25);
wyjscie << "Nazwisko";
wyjscie << "|";
wyjscie.width(25);
wyjscie << "Ulica";
wyjscie << "|";
wyjscie.width(8);
wyjscie << "Nr";
wyjscie << "|";
wyjscie.width(25);
wyjscie << "Miejscowosc";
wyjscie << "|";
wyjscie.width(10);
wyjscie << "Kod";
wyjscie << "|";
wyjscie.width(30);
wyjscie << "Adres email";
wyjscie << "|";
wyjscie.width(20);
wyjscie << "Telefon";
wyjscie << "|";
wyjscie << endl << "+---+--------------------+-------------------------+-------------------------+--------+-------------------------+----------+------------------------------+--------------------+"<< endl;
while (row = mysql_fetch_row(result)){
//cout << row;
for(int i = 0; i < num_fields; i++){
cout << "|";
switch(i)
{
case 0:
wyjscie.width(3);
wyjscie << row[0];
break;
case 1:
wyjscie.width(20);
wyjscie << row[1];
break;
case 2:
wyjscie.width(25);
wyjscie << row[2];
break;
case 3:
wyjscie.width(25);
wyjscie << row[3];
break;
case 4:
wyjscie.width(8);
wyjscie << row[4];
break;
case 5:
wyjscie.width(25);
wyjscie << row[5];
break;
case 6:
wyjscie.width(10);
wyjscie << row[6];
break;
case 7:
wyjscie.width(30);
wyjscie << row[7];
break;
case 8:
wyjscie.width(20);
wyjscie << row[8];
break;
default:
wyjscie.width(22);
wyjscie << row[9];
break;
}
//result->row[i];
//cout << row->fetch_assoc();
//cout << row[i];
}
wyjscie <<"|";
wyjscie << endl <<"+---+--------------------+-------------------------+-------------------------+--------+-------------------------+----------+------------------------------+--------------------+"<< endl;
}
mysql_free_result(result); // zwalnia pamieć zajeta przez res
}
else
{
cout << "Brak osob w bazie danych!";
}
return wyjscie;
}
void polaczenie_MYSQL()
{
conn = mysql_init (NULL);
if (!mysql_real_connect(conn, sql_host, sql_username, sql_password, sql_base, sql_port, opt_socket, sql_flags))
{
cout <<"Blad:" << mysql_error(conn);
}
}
void zamykanie_MYSQL()
{
mysql_close(conn);
}
main.cpp
// program-semstralny.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "dane_osobowe.h"
#include "pracownicy.h"
#include "klienci.h"
#include "akcja.h"
bool Connect(MYSQL *conn)
{
//łączenie i logowanie....
}
int polaczenie_mysql()
{
bool sprawdzenie;
conn = mysql_init (NULL);
if (!mysql_real_connect(conn, sql_host, sql_username, sql_password, sql_base, sql_port, opt_socket, sql_flags))
{
//cout <<"Blad polaczenia z baza MySQL:" << mysql_error(conn);
sprawdzenie = false;
}
else
{
sprawdzenie = true;
}
return sprawdzenie;
}
int _tmain(int argc, _TCHAR* argv[])
{
if(polaczenie_mysql() == 1)
{
dane_osobowe osoba;
//osoba.dane_osobowe_wpisz();
for(;;)
{
char wybor,pod_wybor;
system("cls");
cout << "###############################" << endl;
cout << "# MENU PROGRAMU #" << endl;
cout << "###############################" << endl<<endl;
cout << "1. Zarzadzanie osobami" << endl;
cout << "2. Zarzadzanie pracownikami" << endl;
cout << "3. Zarzadzanie klientami" << endl;
cout << "4. Zarzadzanie projektami" << endl;
cout << "5. Logi programu" << endl;
cout << "6. Zakonczenie programu" << endl<< endl;
cout << "Wybierz: ";
cin >> wybor;
switch(wybor)
{
case '1':
for(;;)
{
bool powrot_do_menu_glownego = false;
system("cls");
cout << "######################################" << endl;
cout << "# MENU PROGRAMU->OSOBY #" << endl;
cout << "######################################" << endl<<endl;
cout << "1. Wyswietl osoby" << endl;
cout << "2. Dodaj osobe" << endl;
cout << "3. Edytuj osobe" << endl;
cout << "4. Usun osobe" << endl;
cout << "5. Powrot do poprzedniego menu" << endl << endl;
cout << "Wybierz: ";
cin >> pod_wybor;
switch(pod_wybor)
{
case '1':
system("cls");
cout << "Lista osob w bazie danych:" << endl;
osoba.dane_osobowe_wyswietl();
cout << endl << "Powrot do menu po nacisnieciu enter" << endl;
getchar();getchar();
break;
case '2':
system("cls");
cout << "Dodawanie nowej osoby do bazy danych:" << endl;
osoba.dane_osobowe_wpisz();
cout << endl << "Powrot do menu po nacisnieciu enter" << endl;
getchar();getchar();
break;
case '3':
system("cls");
osoba.dane_osobowe_wyswietl();
cout << "Edytowanie osoby z bazy danych:" << endl;
osoba.dane_osobowe_edytuj();
cout << endl << "Powrot do menu po nacisnieciu enter" << endl;
getchar();
break;
case '4':
system("cls");
cout << "Usuwanie osob z bazy danych:" << endl;
cout << endl << "Powrot do menu po nacisnieciu enter" << endl;
getchar();getchar();
break;
case '5':
powrot_do_menu_glownego = true;
break;
default:
cout << "Nie ma takiej opcji w menu! Nacisni enter i wybierz jeszcze raz!" << endl;
getchar();getchar();
}
if(powrot_do_menu_glownego)
{
break;
}
}
break;
case '2':
cout << "MENU pracownicy" << endl;
case '6':
cout << "Czy na pewno chcesz zakonczyc dzialanie programy ?" << endl;
cout << "1 - TAK, 2 - NIE"<< endl;
cout << "Wybierz: ";
int odpowiedz;
cin >>odpowiedz;
if(odpowiedz == 1)
{
exit(0);
}
break;
default:
cout << "Nie ma takiej opcji w menu! Nacisni enter i wybierz jeszcze raz!" << endl;
getchar();getchar();
}
}
//dane_osobowe osoba;
//osoba.dane_osobowe_wyswietl();
//osoba.dane_osobowe_wpisz();
//osoba.dane_osobowe_wyswietl();
//dane_osobowe osoba_kopia;
//osoba.dane_osobowe_edytuj(&osoba_kopia);
//mysql_close(conn);
}
else
{
cout << "Program nie moze zostac uruchomiony!" << endl;
cout <<"Blad polaczenia z baza MySQL:" << mysql_error(conn) << endl;
mysql_close(conn);
}
system("pause");
return 0;
}