Program rejestracja logowanie.

0

Witam jako że to jest mój pierwszy post na tej stronie, to chciałbym przeprosić za bajzel w kodzie itp. Przepraszam :). Poprawię go. Tylko potrzebuje jeszcze czasu, dopiero zaczynam przygodę z C++. Jedyna rzecz która mnie naprawdę interesuje.
Dobra nie będę Was zanudzał już,
To tak naukę zacząłem od książki "Przewodnik dla początkujących C++" Alex Allain, i oglądaniu Pana Zelenta, zrobiłem sobie przerwę z kursem i książką. Chciałem stworzyć program który najpierw "każe" się zarejestrować a potem trzeba tymi danymi zalogować się. Na szczęście wyszło ale domyślam się że mam nie chlujny kod :) Od razu was za to przeproszę.
Dzięki waszej pomocy będzie mi łatwiej. I domyślam się że bedzie fala krytyki itp :P No ale cóż do odważnych świat należy.

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <stdio.h>

using namespace std;

int main()
{
    {
        string login, password1, login2, password2, password3;
        int choice;
        for (;;) {
            cout << "Witaj. Co chcesz zrobic ? \n 1. Rejestracja. \n 2. Logowanie. "
                    "\n 3. Wyjscie."
                 << endl;
            cout << "Wybor: ";
            cin >> choice;

            switch (choice)

            {
            case 1:
                cout << "Rejestracja. \n Wprowadz Nazwe uzytkownika: ";
                cin >> login2;
                cout << "Twoja nazwa uzytkownika to:" << login2 << "." << endl;
                cout << "Wprowadz swoje haslo: ";
                cin >> password2;
                cout << "Powtorz haslo: ";
                cin >> password3;

                if (password2 == password3) {
                    cout << "Zarejestrowales sie. Przejdz do logowania." << endl;
                }

                else {
                    cout << "Wpisz jeszcze raz oba hasla. Musza byc te same. \n";
                }
                break;

            case 2: {
                cout << "Logowanie." << endl;
                cout << "Login: ";
                cin >> login;
                cout << "Login: " << login << endl;
                cout << "Wprowadz haslo: ";
                cin >> password1;

                if (login == login2 && password1 == password2) {
                    cout << " Zalogowales sie poprawnie." << endl;
                    cout << " 1. Nowa gra. \n 2. Wczytaj gre. \n 3. Wyjscie." << endl;
                    int choice;
                    cin >> choice;
                    switch (choice) {
                    case 1: {
                        cout << "Rozpoczynam nowa gre. Prosze czekac.";

                    } break;

                    case 2: {
                        cout << "Wczytuje gre. Procze czekac.";
                    } break;

                    case 3:
                        exit(0);
                        break;

                    deafult:
                        cout << "Nie ma takiej opcji  w menu.";
                    }
                }
                else {
                    cout << "Wprowadziles bledna nazwe lub haslo. Sprobuj ponownie. \n";
                }

                break;

            case 3:
                exit(0);
                break;

            default:
                cout << "Nie ma takiej opcji w menu.";
            }
            }
        }
    }
    return 0;
}

Edit 1.
Sformatowałem kod, i po zamieniałem nazwy zmiennych.

W załączniku program.
Dziękuję za każdą krytyke :)

4

Przede wszystkim popraw formatowanie kodu, bo nie stosujesz wcięć z głową. Po drugie, nazwij zmienne sensownie, czyli po angielsku. A po trzecie - podziel ten kod na mniejsze fragmenty.

Jak już to zrobisz to wtedy wklej kod i będzie można go wygodnie przeanalizować.

0

No dobra ale czy na tym poziomie co jestem opłaca się uczyć dzielenia kodu?

3

Oczywiście że się opłaca - łatwiej nauczyć się tego mając mało kodu, niż w przypadku, gdy kodu jest relatywnie dużo. Naucz się tego już teraz, a w przyszłości, kiedy będziesz pracował z większą ilością kodu, nie będzie to stanowiło dla Ciebie żadnego problemu.

Poza tym Twoja funkcja main zajmuje w pionio trzy ekrany, więc jest trudna do analizy - a tak być nie musi. Przyjęło się, że funkcje powinny być małe i trzymać zasadę pojedynczej odpowiedzialności. Dla przykładu, jeśli dana funkcja ma służyć do pobrania od użytkownika hasła z klawiatury to powinna jedynie pobierać hasło - i nic więcej.

Co mogę dodać - pusty nagłówek pętli for wygląda dziwnie. Tej pętli używa się wtedy, gdy ilość iteracji jest znana, a gdy nie jest znana lub potrzebna jest pętla nieskończona, stosuje się while. Wiem, pierdółka.

Kod możesz i należy już teraz podzielić. Wydziel do osobnej funkcji wyświetlanie menu, pobieranie liczby określającej wybór z menu, pobieranie hasła, a także zawartość case 1 i case 2. Poza tym nie używaj zmiennych globalnych, bo w tym przypadku jest to złe rozwiązanie. Skorzystaj tylko ze zmiennych lokalnych, a ich wartości przekazuj do innych funkcji w parametrach.

0

Czytam to i to jest dla mnie czarna magia. Niewiem jak rozdzielic :/
Nie mam problemu ze znalezieniem po prostu tego nie rozumiem :/

0

Z case 1 usuń wszystko i wstaw tylko wywołanie funkcji:

.................................
             switch (choice)

            {
            case 1:
                    accountRegistration();
                    break;
.................................

Przed main() wstaw 2 funkcje:

 
bool saveAccount(string login, string password)
{
    fstream listOfUserAccounts;
    listOfUserAccounts.open("Accounts.txt",ios::out | ios::app);

    if(listOfUserAccounts.good()==false)
        return false;

    listOfUserAccounts<<endl<<login<<endl<<password<<endl;
    listOfUserAccounts.close();
    return true;
}

void accountRegistration()
{
                string login2, password2, password3;
                cout << "Registration. \n Enter your login: ";
                cin >> login2;
                cout << "Your login: " << login2 << ".\n";
                bool registrationSuccessfullyCompleted = false;

                while(!registrationSuccessfullyCompleted)
                {
                cout << "Enter your password: ";
                cin >> password2;
                cout << "Repeat your password: ";
                cin >> password3;

                if (password2 == password3) {
                    cout << "Registration successfully completed.\n";
                    registrationSuccessfullyCompleted=saveAccount(login2,password2);}
                else
                    cout << "Registration not completed. Repeat password again.\n";

                }

}

Ta druga funkcja odpowiada za pobranie loginu i hasła, a ta pierwsza za zapis loginu i hasła do pliku.

0

logika pomieszana z prezentacja
uzycie endl (jezeli nie wiesz dlaczego sie doczepiam, to poczytaj dokumetancje co ona dokladnie robi)
ogolnie, widac ze dopiero sie uczysz. Tutaj za bardzo nie ma co oceniac bo brakuje Ci podstaw bys zastosowal ocene

0

@furious programming: milion lat temu kompilatory generowały lepszy kod dla for(;;) niż dla while(1), stąd parę IDE, na przykład starszy Visual, ostrzega przed tym drugim i proponuje pierwsze. Także Stroustrup pisząc o nieskończonych pętlach poleca for(;;). Do Twojej wypowiedzi się nie spotkałem z nikim, kto by preferował while

0

@Faelyn: Zrób coś w stylu:

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

struct user
{
	string username;
	string password;
	user(const string& username, const string& password)
		: username(username), password(password) {}
};

struct database {
	vector<user> users;
	string username = "", password = "", repeatedPassword = "";
	void registerUser() {
		cout << "Username: "; cin >> username;	
		password = insertPassword();
		if (find_if(users.begin(), users.end(), [&](const user& u) { return u.username == username; }) != users.end()) {
			cout << "User exists!\n";
			registerUser();
		}
		else {
			users.push_back(user(username, password));
			cout << "User added correctly.\n";
		}
	}

	string insertPassword() {
		string password = "", repeatedPassword = "";
		cout << "Password: "; cin >> password;
		cout << "Repeat password: "; cin >> repeatedPassword;
		if (password != repeatedPassword) {
			cout << "Password mismatch!\n";
			insertPassword();
		}
		return password;
	}
};


int main() {
	database db;

	//	Dodawanie dwóch użytkowników do testów...
	db.registerUser();
	db.registerUser();
	return 0;
}

I dalej kolejne warstwy, menu, logowanie etc... etc...

Zamiast struktur możesz wykorzystać klasy i poustawiać np. pola jako prywatne.

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