Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Baza danych w C++


Rekomendowane odpowiedzi

Opublikowano

Postanowiłem napisać prostą "bazę danych" w c++, która korzysta z pliku tekstowego :D (tak, znowu konsola :/).

Chciałbym poznać waszą opinię dot. kodu oraz programu i propozycje dot. jego rozwoju.

Zdaje sobie sprawę, że kod nie jest bardzo profesjonalny (ale nie jest źle, nie? :D), nie jestem zaawansowanym "klepaczem kodu" xD.

Mile widziane wskazówki dot. zastąpienia różnych wersów na inne (jeśli to konieczne lub będzie bardziej profesjonalnie ;)).

Download: http://speedy.sh/ATSp7/Baza.rar

Skan: https://www.virustotal.com/pl/file/783ab0d58de4dbc8adf6317406a02b1dd32ee16ca0908238d00ba21325e73ce7/analysis/1418763106/

Kod:

 

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
std::fstream plik;
int ost;
std::string ciag;
int i=1;
void wyszukaj()
{
    plik.open("baza.txt");
    if (plik.good()!=false)
    {
        std::string wyszukaj;
        std::cout << "Podaj nazwe szukanego uzytkownika: ";
        std::cin >> wyszukaj;
        do
        {
            if (wyszukaj==ciag)
            {
                std::cout << "Znaleziono uzytkownika, jego ID to: " << ost << "\n----------------------------------------------"<< std::endl;
                break;
            }
            else
            {
                plik>>ost>>ciag;
            }
            if (wyszukaj!=ciag && plik.eof())
            {
                std::cout << "Brak uzytkownika o takiej nazwie!" << "\n----------------------------------------------"<< std::endl;
                break;
            }
        } while( !plik.eof() || wyszukaj!=ciag);
        plik.close();
    }
    else
    {
        std::cout<< "Nie udalo sie otworzyc pliku!";
    }
}
void zobaczbaze()
{
    system( "cls" );
    plik.open("baza.txt");
    while( !plik.eof() )
    {
        plik>>ost>>ciag;
        std::cout<< ost<<" ";
        std::cout << ciag << std::endl;
    }
    std::cout << "----------------------------------------------" << std::endl;
    plik.close();
}
void dodajuzytkownika()
{
    std::string nick1;
    std::cout<<"Podaj nazwe uzytkownika: ";
    std::cin>>nick1;
    plik.open("baza.txt");
    if (plik.good()!=false)
    {
        do
        {
            if (nick1==ciag)
            {
                std::cout << "Istnieje juz uzytkownik o tej nazwie!"<< std::endl;
                plik.close();
                break;
            }
            else
            {
                plik>>ost>>ciag;
            }
            if (nick1!=ciag && plik.eof())
            {
                plik.close();
                plik.open("baza.txt", std::ios::out | std::ios::app);
                    if (plik.good()!=false)
                    {
                        plik << "\n" << i << " " << nick1;
                        i++;
                        plik.close();
                        std::cout << "Pomyslnie dodano nowego uzytkownika do bazy.\n----------------------------------------------" << std::endl;
                    }
            else
            {
                std::cout<< "Nie udalo sie otworzyc pliku!";
            }
            break;
            }
        } while( !plik.eof() || nick1!=ciag);
    }
    else
    {
        std::cout<< "Nie udalo sie otworzyc pliku!";
    }
}
int main()
{
    std::cout << "\t\t\t\t\t\t\t\t\t v1.0" << std::endl;
    int wybor;
    plik.open("baza.txt");
    if (plik.good()!=false)
    {
        std::cout<< "Prawidlowo otworzono baze danych." << std::endl;
        while( !plik.eof() )
        {
            plik>>ost>>ciag;
            i++;
        }
        plik.close();
        while (1)
        {
            std::cout << "Co chcesz zrobic? [wpisz numer]\n[1]Pokaz baze\t[2]Dodaj uzytkownika do bazy\t[3]Szukaj uzytkownika\n[4]Wyczysc konsole\t[5]Wyjdz\n";
            std::cin>> wybor;
            switch (wybor)
            {
                case 1: zobaczbaze();
                break;
                case 2: dodajuzytkownika();
                break;
                case 3: wyszukaj();
                break;
                case 4: system("cls");
                break;
                default: std::cout<< "Nie mozesz tego wpisac! Uruchom program ponownie.\n";
                system("pause");
                case 5: return 0;
            }
        }
    }
    else
    {
        std::cout << "Dostep zabroniony";
    }
    return 0;
}

Opublikowano

sopelek podawał już lepszy kod na wyszukiwanie (oczywiście trzeba by było Twój kod zmienić).

W ogóle możesz sobie zmienić, byś miał w .txt coś w stylu ID: , nazwa:

Potem byś to kopiował do mapy.

 

małe rozwiązanie z mapą robione na szybko (tylko wyszukiwanie studenta za pomocą ID)

 

 

 

#include <iostream>
#include <map>
#include <string>

using namespace std;

struct student
{
    int id;
    std::string name;
    student(std::string n) : name(n) {}
};

std::map<int, student> studentMap;

student& getEntity(int &id)
{
    auto found = studentMap.find(id);
    if(found != studentMap.end())
    {
        std::cout << "znaleziono: " << found->second.name <<  std::endl;
        return found->second;
    }
    std::cout << "Nie znaleziono" << std::endl;
}

int main()
{
    student david("David");
    student matthew("Matthew");
    student ali("Ali");
    studentMap.insert(std::make_pair(3, david));
    studentMap.insert(std::make_pair(2, matthew));
    studentMap.insert(std::make_pair(1, ali));
    int id;
    std::cout << "Wprowadz id: ";
    std::cin >> id;
    getEntity(id);
    return 0;
}

 

 

 

Jak Ci się nudzi to wejdź na spoja i tam rób zadania, albo możesz spróbować zrobić listę (jednokierunkową/dwukierunkową).

Opublikowano

ogólne powierzchowne uwagi w komentarzach

 

 

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib> //niepotrzebne
std::fstream plik; //zmienne globalne to zło
int ost;
std::string ciag;
int i=1;
void wyszukaj()
{
    plik.open("baza.txt");
    if (plik.good()!=false) //bardziej skomplikować tego warunku się nie dało?
    {
        std::string wyszukaj;
        std::cout << "Podaj nazwe szukanego uzytkownika: ";
        std::cin >> wyszukaj;
        do
        {
            if (wyszukaj==ciag)
            {
                std::cout << "Znaleziono uzytkownika, jego ID to: " << ost << "\n----------------------------------------------"<< std::endl;
                break;
            }
            else
            {
                plik>>ost>>ciag;
            }
            if (wyszukaj!=ciag && plik.eof())
            {
                std::cout << "Brak uzytkownika o takiej nazwie!" << "\n----------------------------------------------"<< std::endl;
                break;
            }
        } while( !plik.eof() || wyszukaj!=ciag);
        plik.close();
    }
    else
    {
        std::cout<< "Nie udalo sie otworzyc pliku!";
    }
}
void zobaczbaze()
{
    system( "cls" );
    plik.open("baza.txt"); //niepotrzebnie otwierasz kolejny raz, tak sie nie powinno robic. Można go przekazać jako parametr
    while( !plik.eof() ) //eof zapala się PO jakimkolwiek odczycie wiec ten warunek powinien być po plik>>... a nie tu
    {
        plik>>ost>>ciag;
        std::cout<< ost<<" ";
        std::cout << ciag << std::endl;
    }
    std::cout << "----------------------------------------------" << std::endl;
    plik.close();
}
void dodajuzytkownika()
{
    std::string nick1;
    std::cout<<"Podaj nazwe uzytkownika: ";
    std::cin>>nick1;
    plik.open("baza.txt");
    if (plik.good()!=false) //kolejny świetnie zobfuskowany warunek
    {
        do
        {
            if (nick1==ciag)
            {
                std::cout << "Istnieje juz uzytkownik o tej nazwie!"<< std::endl;
                plik.close(); //wywal to za petle
                break;
            }
            else
            {
                plik>>ost>>ciag;
            }
            if (nick1!=ciag && plik.eof())
            {
                plik.close(); //wywal to za petle
                plik.open("baza.txt", std::ios::out | std::ios::app);
                    if (plik.good()!=false)
                    {
                        plik << "\n" << i << " " << nick1;
                        i++; //staraj sie uzywac preinkrementacji
                        plik.close(); //wywal to poza petle
                        std::cout << "Pomyslnie dodano nowego uzytkownika do bazy.\n----------------------------------------------" << std::endl;
                    }
            else
            {
                std::cout<< "Nie udalo sie otworzyc pliku!"; //to chyba w zlym miejscu
            }
            break;
            }
        } while( !plik.eof() || nick1!=ciag);
    }
    else
    {
        std::cout<< "Nie udalo sie otworzyc pliku!";
    }
}
int main()
{
    std::cout << "\t\t\t\t\t\t\t\t\t v1.0" << std::endl;
    int wybor;
    plik.open("baza.txt");
    if (plik.good()!=false)
    {
        std::cout<< "Prawidlowo otworzono baze danych." << std::endl;
        while( !plik.eof() )
        {
            plik>>ost>>ciag;
            i++;
        }
        plik.close();
        while (1) //idiomatycznie uzywa sie for(; 
        {
            std::cout << "Co chcesz zrobic? [wpisz numer]\n[1]Pokaz baze\t[2]Dodaj uzytkownika do bazy\t[3]Szukaj uzytkownika\n[4]Wyczysc konsole\t[5]Wyjdz\n";
            std::cin>> wybor;
            switch (wybor)
            {
                case 1: zobaczbaze();
                break;
                case 2: dodajuzytkownika();
                break;
                case 3: wyszukaj();
                break;
                case 4: system("cls");
                break;
                default: std::cout<< "Nie mozesz tego wpisac! Uruchom program ponownie.\n";
                system("pause");
                case 5: return 0;
            }
        }
    }
    else
    {
        std::cout << "Dostep zabroniony";
    }
    return 0;
}

 

 

 

Odnośnie całego kodu.

Strasznie pokomplikowałeś logikę, ciężko się w tym połapać. Niezrozumiałe warunki i mieszanie ich kolejności.

Staraj się lepiej nazywać zmienne.

PLIKI OTWIERAJ I ZAMYKAJ RAZ. NIE W KAŻDEJ FUNKCJI Z OSOBNA.

Dopóki liczba danych jest mała to lepiej jest wczytać dane do pamięci na początku programu, a potem nie szukać w pliku tylko w pamięci. Użycie map jak proponuje Nope da zdecydowanie lepszą wydajność i lepsze zobrazowanie idei w tym przypadku.

Popracuj nad formatowaniem kodu.

 

Spróbuj przepisać ten kod jeszcze raz starając zastosować się do wskazówek.

Jeśli dobrze przemyślisz bieg programu i wydzielisz sprawdzanie danych od czytania z pliku to zobaczysz, że będzie kod bardziej zwięzły i czytelny.

Opublikowano

ogólne powierzchowne uwagi w komentarzach

 

 

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib> //niepotrzebne
std::fstream plik; //zmienne globalne to zło
int ost;
std::string ciag;
int i=1;
void wyszukaj()
{
    plik.open("baza.txt");
    if (plik.good()!=false) //bardziej skomplikować tego warunku się nie dało?
    {
        std::string wyszukaj;
        std::cout << "Podaj nazwe szukanego uzytkownika: ";
        std::cin >> wyszukaj;
        do
        {
            if (wyszukaj==ciag)
            {
                std::cout << "Znaleziono uzytkownika, jego ID to: " << ost << "\n----------------------------------------------"<< std::endl;
                break;
            }
            else
            {
                plik>>ost>>ciag;
            }
            if (wyszukaj!=ciag && plik.eof())
            {
                std::cout << "Brak uzytkownika o takiej nazwie!" << "\n----------------------------------------------"<< std::endl;
                break;
            }
        } while( !plik.eof() || wyszukaj!=ciag);
        plik.close();
    }
    else
    {
        std::cout<< "Nie udalo sie otworzyc pliku!";
    }
}
void zobaczbaze()
{
    system( "cls" );
    plik.open("baza.txt"); //niepotrzebnie otwierasz kolejny raz, tak sie nie powinno robic. Można go przekazać jako parametr
    while( !plik.eof() ) //eof zapala się PO jakimkolwiek odczycie wiec ten warunek powinien być po plik>>... a nie tu
    {
        plik>>ost>>ciag;
        std::cout<< ost<<" ";
        std::cout << ciag << std::endl;
    }
    std::cout << "----------------------------------------------" << std::endl;
    plik.close();
}
void dodajuzytkownika()
{
    std::string nick1;
    std::cout<<"Podaj nazwe uzytkownika: ";
    std::cin>>nick1;
    plik.open("baza.txt");
    if (plik.good()!=false) //kolejny świetnie zobfuskowany warunek
    {
        do
        {
            if (nick1==ciag)
            {
                std::cout << "Istnieje juz uzytkownik o tej nazwie!"<< std::endl;
                plik.close(); //wywal to za petle
                break;
            }
            else
            {
                plik>>ost>>ciag;
            }
            if (nick1!=ciag && plik.eof())
            {
                plik.close(); //wywal to za petle
                plik.open("baza.txt", std::ios::out | std::ios::app);
                    if (plik.good()!=false)
                    {
                        plik << "\n" << i << " " << nick1;
                        i++; //staraj sie uzywac preinkrementacji
                        plik.close(); //wywal to poza petle
                        std::cout << "Pomyslnie dodano nowego uzytkownika do bazy.\n----------------------------------------------" << std::endl;
                    }
            else
            {
                std::cout<< "Nie udalo sie otworzyc pliku!"; //to chyba w zlym miejscu
            }
            break;
            }
        } while( !plik.eof() || nick1!=ciag);
    }
    else
    {
        std::cout<< "Nie udalo sie otworzyc pliku!";
    }
}
int main()
{
    std::cout << "\t\t\t\t\t\t\t\t\t v1.0" << std::endl;
    int wybor;
    plik.open("baza.txt");
    if (plik.good()!=false)
    {
        std::cout<< "Prawidlowo otworzono baze danych." << std::endl;
        while( !plik.eof() )
        {
            plik>>ost>>ciag;
            i++;
        }
        plik.close();
        while (1) //idiomatycznie uzywa sie for(; 
        {
            std::cout << "Co chcesz zrobic? [wpisz numer]\n[1]Pokaz baze\t[2]Dodaj uzytkownika do bazy\t[3]Szukaj uzytkownika\n[4]Wyczysc konsole\t[5]Wyjdz\n";
            std::cin>> wybor;
            switch (wybor)
            {
                case 1: zobaczbaze();
                break;
                case 2: dodajuzytkownika();
                break;
                case 3: wyszukaj();
                break;
                case 4: system("cls");
                break;
                default: std::cout<< "Nie mozesz tego wpisac! Uruchom program ponownie.\n";
                system("pause");
                case 5: return 0;
            }
        }
    }
    else
    {
        std::cout << "Dostep zabroniony";
    }
    return 0;
}

 

 

 

Odnośnie całego kodu.

Strasznie pokomplikowałeś logikę, ciężko się w tym połapać. Niezrozumiałe warunki i mieszanie ich kolejności.

Staraj się lepiej nazywać zmienne.

PLIKI OTWIERAJ I ZAMYKAJ RAZ. NIE W KAŻDEJ FUNKCJI Z OSOBNA.

Dopóki liczba danych jest mała to lepiej jest wczytać dane do pamięci na początku programu, a potem nie szukać w pliku tylko w pamięci. Użycie map jak proponuje Nope da zdecydowanie lepszą wydajność i lepsze zobrazowanie idei w tym przypadku.

Popracuj nad formatowaniem kodu.

 

Spróbuj przepisać ten kod jeszcze raz starając zastosować się do wskazówek.

Jeśli dobrze przemyślisz bieg programu i wydzielisz sprawdzanie danych od czytania z pliku to zobaczysz, że będzie kod bardziej zwięzły i czytelny.

Plik otwieram w każdej funkcji osobno, bo np. dla zapisu użytkownika otwieram plik tylko na końcu :p.

Jak można zmienić te zmienne na "nie globalne", aby działało? :O

Co do komplikowana kodu- żal mnie xD.

 

 

Można go przekazać jako parametr

??

Jak przenieść wszystkie dane do pamięci? Struktura i wektor? xD

Opublikowano

 

 

Jak można zmienić te zmienne na "nie globalne", aby działało?

możesz np. stworzyć klasę, lub przekazywać przez referencję.

Opublikowano

Nie czytelniej było by pisać funkcje które zwracają numer błędu lub jakiejś wiadomości a w funkcji głównej zczytywać jaki numer jest zwracany i dawać odpowiedni tekst? 

Osobiście pomagam tylko na PW lub e-mail


-----------------------------------------------------------------


https://github.com/smietanka

Opublikowano

Wątpie, czy program się komuś przyda.

 

Zainteresuj się OOP i napisz ten program od nowa.

Zobaczysz o ile przyjemniej i łatwiej będzie się pisało.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...