Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

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

peelen

Mój pierwszy program do oceny.

Rekomendowane odpowiedzi

Witam. Chciałem zaprezentować mój pierwszy program.

Program Hasła jak nazwa wskazuje służy do przechowywania haseł. Tworzymy sobie liste hasel, nastepnie możemy ja zapisać do pliku o podanej nazwie i zabezpieczonego haslem. Hasla zostają zapisane w pliku .txt, ponieważ chciałem by było widać ich proste szyfrowanie(można zmienić w kodzie rozszerzenie na inne). Możemy tworzyć wiele plików z haslami.

 

Tak zapisane hasla możemy wczytać z pliku w celu odczytu haseł, edycji, a następnie zapisać ponownie do tego samego lub innego pliku.

 

Program:

http://www12.zippyshare.com/v/89109488/file.html

 

Liczę na szczere opinie o moim kodowaniu.

 

Przed czytaniem kodu chciałem zwrócić uwagę, że obecnie jestem przed nauką bibliotek standardowych(w pełnym tego słowa znaczeniu) oraz nauką pisania w okienkach. Zapewne można to zrobić prościej ale chciałem pisząc ten programik przećwiczyć sobie pewne elementy których nauczyłem się po przerobieniu symfonii c++ i od zera do gier kodera(bez koncówki).

 

kod:

 

header.h

#ifndef header
#define header

#include <iostream>
#include <string>

using namespace std;
template <typename TYP> bool SprOtwPliku(TYP & zmienna)
{
if(!zmienna)
{

	zmienna.clear(zmienna.rdstate() & ~ios::badbit);

	return false;
}
else return true;
};
//KLASA HASLO
class Haslo
{
private:
string strLogin;
string strHaslo;
string strNazwa;
public:
Haslo() {}
//pobieranie danych pojedynczo
string getNazwa() {return strNazwa;}
string getLogin() {return strLogin;}
string getHaslo() {return strHaslo;}
//Ustawianie danych pojedynczo
void setNazwa(string m_strNazwa) {strNazwa = m_strNazwa;}
void setLogin(string m_strLogin) {strLogin = m_strLogin;}
void setHaslo(string m_strHaslo) {strHaslo = m_strHaslo;}


friend ifstream&operator>>(ifstream& strumien_wej, Haslo& w);

};

//KLASA DANE
class Baza 
{
private:

unsigned dLiczbaHasel;
string PlikZktoregoWczytano;
public:
string strGlowneHaslo;
string tstrNazwaPliku[10];
unsigned LiczbaPlikow;

unsigned LiczbaZapisanychHasel;
Haslo *pHasloWskaznik;
Haslo *pNowaTablicaHasel;
Baza()		{ pHasloWskaznik = new Haslo[1000];
			  dLiczbaHasel = 0;}
unsigned getLiczbaPlikow() {return LiczbaPlikow;}

void WpiszHasla(Baza*);
void DopiszHasla(Baza*);
bool WyswietlHaslo(Baza*, string);
void WyszukajHaslo(Baza*);
bool EdycjaHasla(Baza*);
void Zapis(Baza*);
void Wczytanie(Baza*);

unsigned getLiczbaHasel() {return dLiczbaHasel;}
string getPlikZktoregoWczytano() {return PlikZktoregoWczytano;}


void setLiczbaHasel(unsigned m_dLiczbaHasel) {dLiczbaHasel = m_dLiczbaHasel;}
void setPlikZktoregoWczytano(string m_strNazwaPliku) {PlikZktoregoWczytano = m_strNazwaPliku;}


friend class Menu;//przyjazn z klasa Menu
friend void PodajDane();
};

//KLASA MENU
class Menu
{
private:
int wybor;
public:
Baza* Ktora;
Menu(Baza x)	{	Ktora = &x; 
				    RysujMenu(Ktora);}
void RysujMenu(Baza*);

friend class Baza;

};


class Zamienniki
{public:
char znak;
char zamiennik;
};

#endif header

 

 

 

 

header.cpp

 

#include <Windows.h>
#include <fstream>
#include <iomanip>
#include <string>
#include "header.h"


//funkcje wywolywane w kodzie
string Szyfr(string & w)
{
Zamienniki Tablica[62];
for(unsigned i = 0; i < 10; i++)
{
	Tablica[i].znak = 48 +i;//liczby od 0 do 9
	Tablica[i].zamiennik = 117 + i;//zamieni na litery od od q do y
}
for(unsigned i = 10; i < 36; i++)
{
	Tablica[i].znak = 65 + (i-10);//litery od A do Z 
	Tablica[i].zamiennik = 91 + (i-10);// zamieni na znaki od 91 w ascii
}
for(unsigned i = 36; i < 62; i++)
{
	Tablica[i].znak = 97 +(i -36);//litery od a do z 
	Tablica[i].zamiennik = 33 + (i-36);//zamieni na znaki od 33 do 58 w ascii
}

Tablica[49].zamiennik = 126;

string Buffor = w;


for(int i = 0; i < w.length(); i++)
{
	for(int j = 0; j < 62; j++)
	{
		if(w[i] == Tablica[j].znak)	{Buffor[i] = Tablica[j].zamiennik;}

	}

}
return Buffor;
}

string Enigma(string & w)
{
Zamienniki Tablica[62];
for(unsigned i = 0; i < 10; i++)
{
	Tablica[i].znak = 48 +i;//liczby od 0 do 9
	Tablica[i].zamiennik = 117 + i;//zamieni na litery od od q do y
}
for(unsigned i = 10; i < 36; i++)
{
	Tablica[i].znak = 65 + (i-10);//litery od A do Z 
	Tablica[i].zamiennik = 91 + (i-10);// zamieni na znaki od 91 w ascii
}
for(unsigned i = 36; i < 62; i++)
{
	Tablica[i].znak = 97 +(i -36);//litery od a do z 
	Tablica[i].zamiennik = 33 + (i-36);//zamieni na znaki od 33 do 58 w ascii
}
Tablica[49].zamiennik = 126;
string Buffor = w;


for(int i = 0; i < w.length(); i++)
{
	for(int j = 0; j < 62; j++)
	{
		if(w[i] == Tablica[j].zamiennik)	{Buffor[i] = Tablica[j].znak;}

	}

}
return Buffor;
}

bool HasloGlowne(Baza * a)
{
cout<<"Podaj haslo do pliku: "<<endl;
string b;
cin>>b;
string c = Enigma(a->strGlowneHaslo);
if(b == c) {cout<<"Haslo Poprawne."<<endl; return true;}
else{cout<<"Haslo Niepoprawne."<<endl; return false;}
}

void PodajDane(int a, Baza * klasa)
{
for(unsigned i = a; i < 1000; ++i)
{
	cout<<"Wpisz haslo:"<<endl;
	cout<<"Podaj nazwe hasla"<<endl;
	string a;
	cin>>a;
	klasa->pHasloWskaznik[i].setNazwa(a);

	cout<<"Podaj login"<<endl;
	string b;
	cin>>b;
	klasa->pHasloWskaznik[i].setLogin(b);

	cout<<"Podaj haslo"<<endl;
	string c;
	cin>>c;
	klasa->pHasloWskaznik[i].setHaslo(c);



	klasa->setLiczbaHasel(klasa->getLiczbaHasel() + 1);
	cout<<"Chcesz wpisac nastepne haslo? t/n"<<endl;
	getchar();
	char znak = cin.get();
	system("cls");
	if(znak == 'n'|| znak == 'N') break;
}
}


//DEFINICJE FUNKCJI KLASY BAZA
void Baza::WpiszHasla(Baza * a)
{
delete [] pHasloWskaznik;
pHasloWskaznik = new Haslo[1000];
Baza::setPlikZktoregoWczytano("NULL");
Baza::setLiczbaHasel(0);

PodajDane(0, a);

}

void Baza::DopiszHasla(Baza * a)
{
int r = Baza::getLiczbaHasel();
PodajDane(r, a);
}

bool Baza::WyswietlHaslo( Baza * a, string SzukanaNazwa)
{
for(unsigned i = 0; i<a->getLiczbaHasel(); i++)
{
	if (a->pHasloWskaznik[i].getNazwa() == SzukanaNazwa)
	{
		cout<<"Nazwa: "<<a->pHasloWskaznik[i].getNazwa()<<endl;
		cout<<"Login: "<<a->pHasloWskaznik[i].getLogin()<<endl;
		cout<<"Haslo: "<<a->pHasloWskaznik[i].getHaslo()<<endl;

		return true;
	}
}
return false;
}


void Baza::WyszukajHaslo(Baza * a)
{
char znak;
do{
	cout<<"Oto nazwy wpisanych hasel:"<<endl;
	for(unsigned j = 0; j<a->getLiczbaHasel(); ++j)
	{
		cout<<a->pHasloWskaznik[j].getNazwa()<<endl;
	}


	cout<<"Wpisz nazwe hasla do wyswietlenia:"<<endl;
	string SzukanaNazwa;
	cin>>SzukanaNazwa;

	system("cls");

	if(a->WyswietlHaslo(a, SzukanaNazwa) == false)
	{
		cout<<"Wpisales zla nazwe hasla.\n Chcesz podac nowa? t/n"<<endl;
	}
	else cout<<"Wyswietlic inne haslo? t/n"<<endl;
	getchar();
	znak = cin.get();
	if(znak == 't'|| znak == 'T'){system("cls");}
	else break;
}while(znak != 'n'|| znak == 'N');

}

bool Baza::EdycjaHasla(Baza* a)
{
char znak;
if(getLiczbaHasel() != 0){

do{
	cout<<"EDYCJA HASEL"<<endl;
	cout<<"Wybierz haslo do edycji.\n"<<endl;
	cout<<"Oto nazwy wpisanych hasel:"<<endl;
	for(unsigned j = 0; j<a->getLiczbaHasel(); ++j)
		{
			cout<<a->pHasloWskaznik[j].getNazwa()<<endl;
		}

		cout<<"Wpisz nazwe hasla do edycji:"<<endl;
		string SzukanaNazwa;
		cin>>SzukanaNazwa;
		system("cls");


		if(a->WyswietlHaslo(a, SzukanaNazwa)==true)
		{

			for(unsigned i = 0; i<a->getLiczbaHasel(); i++)
				{
					if (a->pHasloWskaznik[i].getNazwa() == SzukanaNazwa)
						{

							cout<<"Podaj nowa nazwe hasla"<<endl;
							string a;
							cin>>a;
							pHasloWskaznik[i].setNazwa(a);

							cout<<"Podaj nowy login"<<endl;
							string b;
							cin>>b;
							pHasloWskaznik[i].setLogin(b);

							cout<<"Podaj nowe haslo"<<endl;
							string c;
							cin>>c;
							pHasloWskaznik[i].setHaslo(c);

							return true;
						}
				}


		return false;

		}

		else {cout<<"Wpisales zla nazwe hasla"<<endl;}
		cout<<"Czy chcesz edytowac inne haslo? t/n"<<endl;
		getchar();
		znak = cin.get();
		if(znak == 't'|| znak == 'T'){system("cls");}
		else break;
	}while(znak != 'n'|| znak == 'N');
}
else {cout<<"Nie wpisales/wczytales zadnych hasel"<<endl;}
Sleep(2000);

}
//przeciazenie operatorow wczytywania i wypisywania dla strumieni obslugujacych pliki
ofstream & operator<<(ofstream & strumien_wyj, Haslo& w)
{

strumien_wyj<< Szyfr(w.getNazwa())<< ' ' <<Szyfr(w.getLogin())<< ' ' << Szyfr(w.getHaslo())<< ' '<<endl;
return strumien_wyj;

}

ofstream & operator<<(ofstream & strumien_wyj, Baza& w)
{

strumien_wyj<<w<<' ';

return strumien_wyj;
}

ifstream & operator>>(ifstream& strumien_wej, Haslo& w)
{
string a, b, c;
strumien_wej>>a>>ws>>b>>ws>>c;
w.strNazwa = Enigma(a);
w.strLogin = Enigma(b);
w.strHaslo = Enigma(c);

return strumien_wej;
}

ifstream & operator>>(ifstream& strumien_wej, Baza& w)
{
strumien_wej>>w.LiczbaZapisanychHasel;
return strumien_wej;
}

void Baza::Zapis(Baza * a)
{
ofstream strumien2;

string tekst;
tekst = getPlikZktoregoWczytano();

if(tekst != "NULL")
{
cout<<"Czy chcesz nadpisac wczytany plik? t/n"<<endl;
cout<<"Nazwa Pliku: "<<Baza::getPlikZktoregoWczytano()<<endl;
getchar();
char znak;
znak = cin.get();

	if(znak == 't'|| znak == 'T')//jesli chcesz nadpisac 
	{
		system("cls");
		for(int sukces=0; !sukces;)
		{
			strumien2.open((tekst + ".txt").c_str(), ios::trunc);
			if(SprOtwPliku<ofstream>(strumien2) == false)	{
															cout<<"Blad otwarcia pliku"<<endl;
															cout<<"Ponowna proba otwarcia pliku"<<endl;
															}
			else {sukces=1;}

		}

		//nadpisanie hasel do pliku wczytanego
		cout<<"Podaj Haslo do Pliku:"<<endl;
		string haslo;
		cin>>haslo;
		strumien2<<Szyfr(haslo)<<' ';
		strumien2<<getLiczbaHasel()<<' ';
		for(unsigned i = 0; i<a->getLiczbaHasel(); i++)
		{
			strumien2<<a->pHasloWskaznik[i];
		}
		cout<<"POPRAWNIE ZAPISANO HASLA"<<endl;
		strumien2.close();
	}
	else if(znak != 't'|| znak != 'T') //jesli nie chcesz nadpisac
	{
		ofstream strumien, strumien2;//strumien-zapis nazw plikow z haslami do PlikZhaslami, strumien2 - zapis pliku z haslami o podanej nazwie
		for(int sukces=0; !sukces;)
		{

			cout<<"Wpisz nazwe pliku do ktorego zapiszesz dane"<<endl;
			string NazwaPliku;
			cin>> NazwaPliku;

			tstrNazwaPliku[LiczbaPlikow] = NazwaPliku;
			++LiczbaPlikow;
			//otwarcie pliku do zapisu nazw plikow hasel
			strumien.open("PlikiZhaslami.txt", ios::trunc);
			if(SprOtwPliku<ofstream>(strumien) == false)	{
															cout<<"Blad otwarcia pliku"<<endl;
															cout<<"Ponowna proba otwarcia pliku"<<endl;
															}
			else sukces=1;

			strumien<<getLiczbaPlikow()<<' ';
			for(unsigned i = 0; i < getLiczbaPlikow(); i++)
			{
				strumien<<tstrNazwaPliku[i]<<' ';
			}

			strumien.close();
			//otwarcie pliku do zapisu hasel
			strumien2.open((NazwaPliku + ".txt").c_str(), ios::trunc);
			if(SprOtwPliku<ofstream>(strumien2) == false)	{
															cout<<"Blad otwarcia pliku"<<endl;
															cout<<"Ponowna proba otwarcia pliku"<<endl;
															}
			else {sukces=1;}

		}

		//zapis hasel do pliku
		cout<<"Podaj Haslo do Pliku:"<<endl;
		string haslo;
		cin>>haslo;
		strumien2<<Szyfr(haslo)<<' ';
		strumien2<<getLiczbaHasel()<<' ';
		for(unsigned i = 0; i<a->getLiczbaHasel(); i++)
		{
			strumien2<<a->pHasloWskaznik[i];
		}
		cout<<"POPRAWNIE ZAPISANO HASLA"<<endl;
		strumien2.close();
	}

}
else if (tekst == "NULL")
{
	ofstream strumien, strumien2;//strumien-zapis nazw plikow z haslami do PlikZhaslami, strumien2 - zapis pliku z haslami o podanej nazwie
	for(int sukces=0; !sukces;)
	{

		cout<<"Wpisz nazwe pliku do ktorego zapiszesz dane"<<endl;
		string NazwaPliku;
		cin>> NazwaPliku;

		tstrNazwaPliku[LiczbaPlikow] = NazwaPliku;
		++LiczbaPlikow;
		//otwarcie pliku do zapisu nazw plikow hasel
		strumien.open("PlikiZhaslami.txt", ios::trunc);
		if(SprOtwPliku<ofstream>(strumien) == false)	{
														cout<<"Blad otwarcia pliku"<<endl;
														cout<<"Ponowna proba otwarcia pliku"<<endl;
														}
		else sukces=1; 


		strumien<<getLiczbaPlikow()<<' ';
		for(unsigned i = 0; i<getLiczbaPlikow(); i++)
		{
			strumien<<tstrNazwaPliku[i]<<' ';
		}
		strumien.close();


		strumien2.open((NazwaPliku + ".txt").c_str(), ios::trunc);
		if(SprOtwPliku<ofstream>(strumien2) == false)	{
															cout<<"Blad otwarcia pliku"<<endl;
															cout<<"Ponowna proba otwarcia pliku"<<endl;
														}
		else {sukces=1;}
	}
//zapis hasel do pliku
	cout<<"Podaj Haslo do Pliku:"<<endl;
		string haslo;
		cin>>haslo;
		strumien2<<Szyfr(haslo)<<' ';
	strumien2<<getLiczbaHasel()<<' ';
	for(unsigned i = 0; i<a->getLiczbaHasel(); i++)
	{
		strumien2<<a->pHasloWskaznik[i];
	}
	cout<<"POPRAWNIE ZAPISANO HASLA"<<endl;
	strumien2.close();
}
}

void Baza::Wczytanie(Baza* a)
{//1
string NazwaPliku;
ifstream strumien, strumien2;
setLiczbaHasel(0);
for(int sukces=0; !sukces;)
{//2
	//otwarcie pliku z haslami
	strumien2.open("PlikiZhaslami.txt");

			if(SprOtwPliku<ifstream>(strumien2) == false){cout<<"Usuneles plik z nazwami hasel. Musisz stworzyc liste hasel od nowa "<<endl; sukces = 0; break;}
			else sukces=1;



	for(int sukces2=0; !sukces2;)
	{//3
			strumien2>>LiczbaPlikow>>ws;
			for(unsigned i = 0; i<getLiczbaPlikow(); i++)
			{//4
				strumien2>>tstrNazwaPliku[i]>>ws;
			}//4
			//wypisanie hasel
			cout<<"Znaleziono takie pliki z haslami:"<<endl;
			for(unsigned i=0; i<getLiczbaPlikow(); i++)
			{//4
				cout<<tstrNazwaPliku[i]<<endl;
			}//4
	strumien2.close();//zamkniecie strumienia
			cout<<"Wpisz nazwe pliku z ktorego wczytac hasla:"<<endl;
			cin>>NazwaPliku;
			strumien.open((NazwaPliku + ".txt").c_str());
			if(SprOtwPliku<ifstream>(strumien) == false){system("cls"); 
														cout<<"Zla nazwa pliku z haslami"<<endl;
														cout<<"Wpisz poprawna nazwe pliku z haslami"<<endl;
														sukces2=0;
														Sleep(2000);
														system("cls");
														}
			else sukces2=1;





		}//3


		//wczytanie hasel z pliku


//2
		strumien>>strGlowneHaslo;
		if(HasloGlowne(a) == true)
		{
			strumien>>LiczbaZapisanychHasel;
			for(unsigned i = 0; i < LiczbaZapisanychHasel ; i++)
			{
				strumien>>pHasloWskaznik[i];
				Baza::setLiczbaHasel(Baza::getLiczbaHasel() + 1);
			}
			cout<<"POPRAWNIE WCZYTANO HASLA"<<endl;
		}
		else break;
	strumien.close();
}
	Baza::setPlikZktoregoWczytano(NazwaPliku);

}//1



void Menu::RysujMenu(Baza * a) {
		cout<<" ---------------------------------------------\n";//45
		cout<<"|"<<setw(24)<<"MENU"<<setw(23)<<"|\n";
		cout<<"|"<<"1.Stworz nowa liste hasel"<<setw(22)<<"|\n";
		cout<<"|"<<"2.Dopisz hasla do istniejacej listy"<<setw(12)<<"|\n";
		cout<<"|"<<"3.Edytuj haslo"<<setw(33)<<"|\n";
		cout<<"|"<<"4.Wyszukaj haslo"<<setw(31)<<"|\n";
		cout<<"|"<<"5.Zapisz hasla do pliku"<<setw(24)<<"|\n";
		cout<<"|"<<"6.Wczytaj hasla z pliku"<<setw(24)<<"|\n";
		cout<<"|"<<"7.Koniec"<<setw(39)<<"|\n";
		cout<<" ---------------------------------------------"<<endl;
		cout<<"UWAGA: Wpisuj Nazwy, Loginy oraz Hasla zlozone\ntylko z: liter bez polskich znakow oraz cyfr.\nMozesz uzywac: @ oraz . by wpisac np. email jako nazwe."<<endl;

		cin>>wybor;

			switch(wybor)
			{
				case 1: {system("cls");
					cout<<"NOWA LISTA HASEL"<<endl;


					a->Baza::WpiszHasla(Ktora);
					system("cls");
					RysujMenu(a);
					} break;

				case 2: {system("cls");
					cout<<"DOPISYWANIE HASEL DO LISTY"<<endl;
					a->Baza::DopiszHasla(Ktora);
					system("cls");
					RysujMenu(a);
					} break;

				case 3: {system("cls");

					a->EdycjaHasla(Ktora);
						system("cls");
					RysujMenu(a);} break;

				case 4: {system("cls");
					cout<<"WYSZUKIWANIE HASLA"<<endl;
					a->WyszukajHaslo(Ktora);
					system("cls");
					RysujMenu(a);
						} break;

				case 5: {system("cls");
					cout<<"ZAPISZ HASLA DO PLIKU"<<endl;
					a->Zapis(Ktora);
					Sleep(1000);
					system("cls");
					RysujMenu(a);} break;

				case 6: {system("cls");
					cout<<"WCZYTAJ HASLA Z PLIKU"<<endl;
					a->Wczytanie(Ktora);
					Sleep(1000);
					system("cls");
					RysujMenu(a);} break;

				case 7: {system("cls");
					cout<<"Zakonczyles program";} break;
			}
		}

 

 

main.cpp

 

#include <Windows.h>
#include "header.h"
using namespace std;

int main()
{
cout<<"_-<"<<"HASLA"<<">-_"<<"\n";
cout<<right<<"Program szyfrujacy do przechowywania i zarzadzania haslami."<<endl;
cout<<right<<"Pozwala zabezpieczyc pliki z haslami osobnym haslem.\nZapamietujesz 1 haslo i tyle.\n\n\n\n"<<endl;
cout<<right<<"Program by:"<<"\n";
cout<<right<<"pln"<<endl;


Sleep(5000);
system("cls");
Baza Nowa;
Nowa.setLiczbaHasel(0);
Nowa.LiczbaPlikow = 0;
Menu Nowe(Nowa);



getchar();
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Program bardzo pomysłowy, chociaż do szyfrowania skorzystałbym z gotowych funkcji (ale sama idea jest jak najbardziej ok).

 

Pozostaje Ci teraz praca na graficznym UI. Program reprezentuje sobą dość wysoki poziom więc nie powinieneś mieć z tym żadnych problemów.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Program jest w miarę dobrze napisany i uprządkowany,

 

Jeżeli wiążesz przyszłość jako programista zainteresuj się bardziej praktycznymi technologiami, takimi jak java, platforma net.,bazy danych.

Pisanie "takich sobie programików" z czasem to stanie w miejscu.

 

Pewnie zaraz odezwą się ludzie i powiedzą coś w stylu "zobacz jaką wydajność ma c++ a jaką java", ok c++ jest wydajniejsze ,ale jest ma zastosowanie głównie profesjonalne silniki, skąplikowane algorytmy itp.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie ma co demonizować c++ - mając odpowiednie liby pisze się szybko i wygodnie - java bez bibliotek była by goła jak święty turecki, w dodatku kaleka :E

umiejąc cpp szybko można przestawić się na jave - w drugą stronę nie (brak wyuczonej umiejętności zarządzania pamięcią)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

a czy to zły nawyk korzystania z using namespace std; w plikach nagłówkowych ?

 

tak samo z endl; samo \n wystarczy, endl robi dużo nie potrzebych rzeczy - ale to takie czepianie się :)

 

Korzystanie z jakiś kontenerów zamist tablic też na złe by nie wyszło...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W odniesieniu do kodu. Całkiem nieźle - dosyć czytelny. Przyczepiłbym się jedynie do architektury. Ten program wypadałoby rozbić na co najmniej 2 warstwy: interfejs użytkownika i obsługę bazy/haseł. W obecnej postaci niewygodnie jest wprowadzanie modyfikacji do kodu (szczególnie interfejsu), gdyż wszystko jest ze sobą zmieszane.

 

Dla przykładu rozważmy funkcję bool HasloGlowne(Baza * a) - nie powinna ona w ogóle wchodzić w interakcje z użytkownikiem. Jedyne co to powinna dostać na wejście bazę i hasło, a później zwrócić prawdę lub fałsz. Wyobraź sobie, że teraz chcesz zmienić interfejs na graficzny - nie tylko musisz napisać ten interfejs graficzny, ale także będziesz zmuszony zmodyfikować tę funkcję (zamiast jedynie wywalić obsługę konsoli). Logika programu i interfejs powinny być wyraźnie wyodrębnione i umieszczone w osobnych funkcjach/klasach. W ogóle warto wiedzieć, ze istnieje coś takiego jak model MVC, czy architektura trójwarstwowa - nikt nie mówi, że zaraz trzeba się tylko do tego stosować, ale to całkiem rozsądne wzorce projektowe w wielu przypadkach.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość Push-up3k

a czy to zły nawyk korzystania z using namespace std; w plikach nagłówkowych ?

Nie.

 

 

Łał, dawno nie widziałem tak przejrzyście napisanego kodu. Jak przeniesiesz do jakiegoś GUI to się pochwal.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

a czy to zły nawyk korzystania z using namespace std; w plikach nagłówkowych ?

 

tak samo z endl; samo \n wystarczy, endl robi dużo nie potrzebych rzeczy - ale to takie czepianie się :)

 

Korzystanie z jakiś kontenerów zamist tablic też na złe by nie wyszło...

 

akurat brak używania namespace to generalnie zły nawyk bo to znacznie poprawia przejrzystość

chyba, że ktoś czuje się "pro" pisząc potem rzeczy my::fucking::awsome::class::trololo()... co druga linijkę :E

tylko to niesie też z sobą możliwe konflikty nazw jeśli są takie same w kilku namespace'ach - ale "czyste" pisanie znacznie ułatwia unikanie tego typu problemów

 

endl - niby więcej klepania ale łatwiej szukać błędów jak np. wypisujemy debug info na ekran a program w międzyczasie wali coredumpa - endl zapewnia flush na output więc dana linijka jest gwarantowana, że pojawi się na wyjściu

\n - nie ma buforowania i może "lagować" za właściwym kodem - to jest też plus \n - jak output jest niekrytyczny to to jest szybsze od endl

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Program jest w miarę dobrze napisany i uprządkowany,

 

Jeżeli wiążesz przyszłość jako programista zainteresuj się bardziej praktycznymi technologiami, takimi jak java, platforma net.,bazy danych.

Pisanie "takich sobie programików" z czasem to stanie w miejscu.

 

Pewnie zaraz odezwą się ludzie i powiedzą coś w stylu "zobacz jaką wydajność ma c++ a jaką java", ok c++ jest wydajniejsze ,ale jest ma zastosowanie głównie profesjonalne silniki, skąplikowane algorytmy itp.

 

Z tą wydajnością to też w sumie już nie prawda bo JVM została na prawdę świetnie zoptymalizowana. Gdzieś widziałem porównania wydajności popularych struktur danych i Java na JVM wypada niemal identycznie. Jedynie co to więcej pamięci wymagała, no ale to już taka uroda tego środowiska. Fajnym rozwiązaniem jest jRuby i jPython.

 

 

nie ma co demonizować c++ - mając odpowiednie liby pisze się szybko i wygodnie - java bez bibliotek była by goła jak święty turecki, w dodatku kaleka :E

umiejąc cpp szybko można przestawić się na jave - w drugą stronę nie (brak wyuczonej umiejętności zarządzania pamięcią)

 

Czy ja wiem. Pamiętanie aby dla każdego new było delete to chyba nie jest jakiś szczyt umięjętności programistycznych.

Sam przechodziłem z Javy(przez Objective-C) na C++ i nie miałem z tym problemów. Jedynie co może być problemem na początku to alokacja na stacku vs heap-ie, i kiedy używać czego, jaka jest różnica między tymi sposobami. Przynajmniej mnie to chwile zajęło.

 

Ale prawdę mówiąc C++ nie jest moim ulubionym językiem, nauczyłem się trochę z przymusu i w sumie na codzień z tego nie korzystam.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

  • Odpowiedzi

    • Za kilka dni forum zniknie, więc jeśli potrzebujesz pomocy, to wpadaj na forum ITHardware, tam zdecydowana większość osób z tego forum się przeniosła. https://forum.ithardware.pl/
    • Z aktywnych labowych userów przenieśli się prawie wszyscy na forum ith, które to zostało ulepszone w znacznym stopniu w stosunku do stanu sprzed migracji . Zapraszam https://forum.ithardware.pl
    • A tak w ogóle to kable to płyty są minimum dwa. Jeśli kupiłeś zasilacz z jednym kablem to mocno wtopiłeś i informatyk tu nie pomoże.
    • Mam pewien problem, mianowicie padła mi b450 tomahawk max i z jakiegos powodu proc 5600 też, no i mam lekki problem z ustawieniem ramu po wymianie proca i płyty na b550 Poprzednio działało mi 3733 z timingami z screena 1, teraz gdy próbuje wbić nawet 3733 z bardziej luznymi timingami z poradnika https://github.com/integralfx/MemTestHelper/blob/oc-guide/DDR4 OC Guide.md to wywala po 2 minutach test y-crunchera. Jak system odpala to podobno słyszałem, że da rade ogarnąć aby chodziło ale nie znam się zbytnio na tych rezystancjach czy może coś innego jest powodem, bo średnio mi sie chce wierzyć, że kontroler mam taki słaby, że 4 kości są problematyczne na 3733. Obecnie chodzą na 3600 stabilnie z timingami z screenu 2, akurat tylko przepisałem stare, na 2 kosciach pusciłem test na 3733 i normalnie chodziło... stare ustawienia: https://imgur.com/a/SRdQDAF obecne na 3600: https://imgur.com/a/lmURdGb wiem, że te timingi to śmiech na sali, ale pierwszy rząd poprzednio na 3733 wcale nie szedł niżej, takie kostki badziewne
    • ITHardware, tam większość się przeniosła.
  • Aktywni użytkownicy

×
×
  • Dodaj nową pozycję...