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

[C++] Zakład fryzjerski - weryfikacja programu

Ostatnio zmodyfikowano 2012-01-09 23:44
Autor Wiadomość
ptaq
Temat założony przez niniejszego użytkownika
[C++] Zakład fryzjerski - weryfikacja programu
» 2012-01-06 00:23:12
C/C++
#include<iostream>
#include<string>
#include<fstream>

void addVisit( std::string name, std::string nazwisko, std::string tel, std::string time, std::string date )
{
    std::getline( std::cin, name );
    std::getline( std::cin, nazwisko );
    std::getline( std::cin, tel );
    std::getline( std::cin, time );
    std::getline( std::cin, date );
   
    std::ofstream fileOutput( "wizyty.txt", std::ios::app );
   
    if( fileOutput.is_open() )
    {
       
        fileOutput << name << "  " << nazwisko << "  " << tel << "  " << time << " " << date << std::endl;
        fileOutput.close();
        std::cout << " wizyta dodana !" << std::endl;
    }
    else
    {
        std::cout << " nie zapisano !" << std::endl;
    }
}


void addCustomer( std::string imie, std::string nazwisko, std::string tel, std::string time )
{
    std::getline( std::cin, imie );
    std::getline( std::cin, nazwisko );
    std::getline( std::cin, tel );
    std::getline( std::cin, time );
   
    std::ofstream fileOutput( "klienci.txt", std::ios::app );
   
    if( fileOutput.is_open() )
    {
        fileOutput << imie << "  " << nazwisko << "  " << tel << "  " << time << std::endl;
        fileOutput.close();
        std::cout << " client dodany !" << std::endl;
    }
    else
    {
        std::cout << " nie zapisano ! " << std::endl;
    }
}


void findCustomer( std::string imieInazwisko )
{
    std::getline( std::cin, imieInazwisko );
    std::cout << "podaj imie i nazwisko klienta w jednej lini: ## ## " << std::endl;
    std::cin >> imieInazwisko;
    std::string line;
    int czyZnaleziono;
   
    std::ifstream fileInput( "klienci.txt" );
   
    if( fileInput.is_open() )
    {
        while( std::getline( fileInput, line ) )
        {
            czyZnaleziono = line.find( imieInazwisko );
            if( czyZnaleziono != std::string::npos )
            {
                std::cout << "znaleziono klienta\n";
                std::cout << line << std::endl;
                break;
            }
        }
        if( czyZnaleziono == std::string::npos )
        {
            std::cout << std::endl;
            std::cout << "klienta nie ma w bazie !";
        }
    }
}
void addEmployeer( std::string imie, std::string nazwisko, std::string tel, std::string etat, std::string wynagrodzenie )
{
    std::getline( std::cin, imie );
    std::getline( std::cin, nazwisko );
    std::getline( std::cin, tel );
    std::getline( std::cin, etat );
    std::getline( std::cin, wynagrodzenie );
    std::ofstream fileOutput( "pracownicy.txt", std::ios::app );
   
    if( fileOutput.is_open() )
    {
        fileOutput << imie << "  " << nazwisko << "  " << tel << "  " << etat << "  " << wynagrodzenie << "\n";
        fileOutput.close();
       
        std::cout << " pracownik dodany !" << std::endl;
    }
    else
    {
        std::cout << " pracownik dodany ! " << std::endl;
    }
}
void CheckTime( std::string time, std::string date )
{
   
    std::cout << "podaj godzine i date wizyty: ##:## dd.mm.rrrr  " << std::endl;
    std::cin >> time >> date;
    std::string line;
    int czyZnaleziono, czyZnaleziono2;
   
    while( czyZnaleziono != std::string::npos )
    {
        std::ifstream fileInput( "wizyty.txt" );
        if( fileInput.is_open() )
        {
            while( std::getline( fileInput, line ) )
            {
                czyZnaleziono = line.find( time );
                czyZnaleziono2 = line.find( date );
                if( czyZnaleziono && czyZnaleziono2 != std::string::npos )
                {
                    std::cout << "termin jest zajety " << std::endl;
                    std::cout << "podaj inna godzine" << std::endl;
                    std::cin >> time;
                    std::cout << std::endl;
                }
            }
        }
    }
    std::cout << std::endl;
    std::cout << "termin jest wolny" << std::endl;
    std::cin.clear();
    std::cin.sync();
    return;
}

void checkVisits()
{
    std::string line;
    std::ifstream fileInput( "wizyty.txt" );
    if( fileInput.is_open() )
    {
        while( std::getline( fileInput, line ) )
        {
            std::cout << line << std::endl;
        }
    }
}

void listaUslug()
{
}

int main()
{
    std::string imie, nazwisko, tel, time, etat, wynagrodzenie, imieInazwisko, date;
    int num;
    std::cout << "          =======================================================          " << std::endl;
    std::cout << "     ..::: Witaj w systemie zarzadzania zakladem fryzjerskim !!! :::..     " << std::endl;
    std::cout << "          =======================================================          " << std::endl;
    std::cout << std::endl;
    std::cout << "Menu:" << std::endl;
    std::cout << "[1] - dodaj wizyte.\n[2] - nowy klient.\n[3] - nowy pracownik.\n[4] - znajdz klienta.\n[5] - sprawdz wizyty.\n[6] - drukuj liste pracownikow.\n[7] - drukuj liste klientow.\n[8] - zakoncz.\n" << std::endl;
   
    std::cin >> num;
    switch( num )
    {
    case 1:
        {
            CheckTime( time, date );
            std::cin.clear();
            std::cin.sync();
           
            std::cout << "dodaj wizyte: imie, nazwisko, tel, godzine[##:##] i date[dd.mm.rrr] " << std::endl;
           
            addVisit( imie, nazwisko, tel, time, date );
           
            std::cin.clear();
            std::cin.sync();
            break;
        }
    case 2:
        {
            std::cout << "dodaj klienta: imie, nazwisko, tel, godzine " << std::endl;
            addCustomer( imie, nazwisko, tel, time );
            std::cin.clear();
            std::cin.sync();
            break;
        }
    case 3:
        {
            std::cout << "dodaj nowego pracownika: imie, nazwisko, telefon, etat, wynagrodzenie " << std::endl;
            addEmployeer( imie, nazwisko, tel, etat, wynagrodzenie );
            std::cin.clear();
            std::cin.sync();
            break;
        }
    case 4:
        {
            findCustomer( imieInazwisko );
            std::cin.clear();
            std::cin.sync();
            break;
        }
    case 5:
        {
            checkVisits();
            std::cin.clear();
            std::cin.sync();
            break;
        }
       
        default:
       
    }
    return 0;
}
P-47346
akwes
» 2012-01-06 01:06:48
A może pokuś się o jakieś obiekty ;> ?
P-47347
ptaq
Temat założony przez niniejszego użytkownika
» 2012-01-06 01:34:48
hmmm myślałem nad tym, tylko jak to najlepiej zrobić ? wszystko w jedną klase ??? ;>
P-47351
bartelemii
Na początek
» 2012-01-06 01:42:43
Od razu rzuca się w oczy (nawet takiemu początkującemu programiście) pare niedociągnięć:
-formatowanie kodu
C/C++
std::getline( std::cin, name ); std::getline( std::cin, nazwisko ); std::getline( std::cin, tel ); std::getline( std::cin, times ); std::getline( std::cin, date );
lepiej wygląda tak
C/C++
std::getline( std::cin, name );
std::getline( std::cin, nazwisko );
std::getline( std::cin, tel );
std::getline( std::cin, times );
std::getline( std::cin, date );
Przez ta oszczednosc miejsca program jest nieczytelny, a co najwazniejsze łatwiej popełnic jakiś bezsensowny błąd:)

-nie wiem czy zostanę pochwalony czy zgardzony, ale w C++ raczej stosuje się strukturę std::endl do przejscia do nastepnej linii, zamist wpisaniu w strumieniu wyjścia wyrażenia "\n", wiadmo zależy od stylu programisty, ale std::endl wydaje mi się bardziej przejrzysty

-w zwrotnicy sterującej switch jest taka opcja jak default, które zwykle dodaje sie na samym koncu i oznacza one po prostu wartość "domyślną", czyli nieprzewidzianą przez programistę. Moim zdaniem default mogłoby tutaj doskonale zastąpić pętlę do {} while() w funkcji main().
Jest tu jeszcze jeden błąd który koniecznie musisz poprawić, na koniec instrukcji case x: musisz wstawić break, żeby program nie wykonywał instrukcji leżacych ponizej wybranej opcji, az do konca switcha lub napotkania break. Dla "case 1: " użyłeś break, a w reszcie pominąłeś, nie jest to chyba swiadomy zabieg?:D Jak najszybciej popraw ten błąd:)

-całą strukturę odpowiedzialna za twoje Menu zastąpiłbym funkcją, zwracającą wartość pobraną przez delikwenta;D dodałoby to przejrzystości, w ogóle wszystkie funkcje można umieścić w innym pliku .cpp, ich prototypy w pliku nagłówkowym .h i byłoby jeszcze lepiej, ale to sie sprawdza przy większych projektach :)

-zalecam jeszcze do przechowywania zbiorów danych, jak na przykład masz tutaj dane o osobie, taki wynalazek jak struct. Tworzymy sobie strukture danych w ten sposob:
C/C++
struct Klient // tworzymy opis Klienta (nowy typ zmiennej)
{
    std::string strImie;
    std::string strNazwisko;
    std::string strTelefon;
    std::string strGodzWizyty;
    std::string strDataWizyty;
};

Klient nowy;

nowy.strImie = "Jan";
nowy.strNazwisko = "Kowalski";
/* ... */
std::cout << nowy.strImie << " " << nowy.strNazwisko << std::endl;
i całą strukture mozna oczywiscie przekazac do funkcji jak zwykla zmienna:)

To tylko parę uwag, dziwnie jeszcze zapisujesz czas, ale moze ktos bardziej doswiadczony Ci pomoze:)
Pozdrawiam :)


P-47352
ptaq
Temat założony przez niniejszego użytkownika
» 2012-01-06 01:57:03
dzieki za wypowiedz, wiekszość rzeczy o których piszesz to szczegóły na ktore nie zwróciłem uwagi, głównie chodziło mi o to czy z punktu widzenia kogoś doświadczonego trzyma sie to kupy :) pomijajac te elementy o ktorych już wspomniałeś :D
P-47353
akwes
» 2012-01-06 02:12:17

-nie wiem czy zostanę pochwalony czy zgardzony, ale w C++ raczej stosuje się strukturę std::endl do przejscia do nastepnej linii, zamist wpisaniu w strumieniu wyjścia wyrażenia "\n", wiadmo zależy od stylu programisty, ale std::endl wydaje mi się bardziej przejrzysty

Nie zależy to od stylu programisty. Kwestia czy chcemy wywołać automatycznie flush() czy nie.


hmmm myślałem nad tym, tylko jak to najlepiej zrobić ? wszystko w jedną klase ??? ;>

C++ jest językiem obiektowym więc warto z tego korzystać. Nie tyle wszystko w jedną klasę co każdej rzeczy zrobić klasę. Czyli Osoba, Wizyta, Salon. Wtedy za pomocą kilku linijek kodu program będzie mógł obsługiwać sieć salonów, przenosić wizyty itd. W klasie Salon można dać obiekt klasy Terminarz na przykład.

Program obiektowy łatwiej rozbudować i jest czytelniejszy.
P-47354
ptaq
Temat założony przez niniejszego użytkownika
» 2012-01-06 03:11:03
poprawilem to co najbardziej razilo, jesli chodzi o menu to w trybie konsolowym chyba lepiej zeby zostało tak jak jest bo inaczej nie bedzie widac opcji wyboru.
Popracuje tez nad tymi obiektami :)




P-47355
Drraven
» 2012-01-06 08:17:24
Nie mam siły by dokładnie analizować ten kod, ale:
obiekty zrób!
Możesz tak:
Klasa klienta i tam: wszystkie dane, i metody na dodawanie, szukanie, usuwanie. Wtedy będzie to +/- tak wyglądać:
C/C++
//Inicjacje klasy pomijam
CKlient jeden;
jeden.Set( "imie", "nazwisko", "telefon" );
I metodą set, dodajesz to do jakiegoś wektora, listy, tablicy.
P-47356
« 1 » 2 3
  Strona 1 z 3 Następna strona