Потребител и парола

Да се напише програма, която има следните три функции:

  • добавяне на нов потребител и неговата парола
  • проверка дали е въведен валиден потребител и парола

Програмата да пази данните си между две стартирания.

По желание: Да се добави функция за изтриване на потребител и за промяна на паролата на въведен вече потребител.

Публикувано в 12а с етикети . Постоянна връзка.

4 Responses to Потребител и парола

  1. dreanor каза:
    #include <stdafx.h> //Този хедър може и да ви пречи
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    const char file_danni[20]="login.txt";
    
    struct danni_whod
    {
    	char ime[64];
    	char pass[128];
    };
    
    int prowerka_potrebitel (char ime[64]) //Проверка за съвпадащи потребители.
    {
    	ifstream danni;
    	danni.open(file_danni, ios::in);
    	char temp[64];
    	while(danni>>temp)
    		if(strcmp(ime,temp)==0)
    		{
    			danni.close();
    			return 1;
    		}
    	danni.close();
    	return 0;
    };
    
    void zapis (danni_whod potrebitel) //Запис на данни във файла.
    {
    	ofstream danni;
    	danni.open(file_danni, ios::app);
    	danni<<potrebitel.ime<<" "<<potrebitel.pass<<endl;
    	danni.close();
    };
    
    int wpiswane(danni_whod potrebitel) //Вписване на потребител.
    {
    	ifstream danni;
    	danni.open (file_danni, ios::in);
    	danni_whod tmp;
    	while (danni>>tmp.ime>>tmp.pass)
    	{
    		if ((strcmp(tmp.ime,potrebitel.ime)==0)&&(strcmp(tmp.pass,potrebitel.pass)==0))
    		{
    			danni.close();
    			return 1;
    		}
    	}
    	danni.close();
    	return 0;
    };
    
    // Извежда информацията във файла.
    int izwedi()
    {
    	ifstream danni;
    	danni.open(file_danni, ios::in);
    	danni_whod tmp;
    	int n=0;
    	while(danni>>tmp.ime>>tmp.pass)
    	{
    		cout<<n<<": "<<tmp.ime<<endl;
    		n++;
    	};
    	return n;
    }
    /* 
     * Изтрива избраният от потребителя ред.
     * За целта копира всичката информация във друг файл
     * освен избраният ред.
     */
    int iztriwane(int n)
    {
    	ifstream danni_chetene (file_danni, ios::in);
    	ofstream danni_zapis ("login_tmp.txt", ios::app);
    	danni_whod tmp;
    	int red=0;
    	while(danni_chetene>>tmp.ime>>tmp.pass)
    	{
    		if(red!=n)
    			danni_zapis<<tmp.ime<<" "<<tmp.pass<<endl;
    		red++;
    	};
    	danni_chetene.close();
    	danni_zapis.close();
    	if (!rename (file_danni, "login_old.txt"))
    	{
    		rename ("login_tmp.txt", file_danni);
    		remove ("login_old.txt");
    		return 1;
    	}
    	else 
    	{
    		remove ("login_tmp.txt");
    		return 0;
    	};
    };
    /* 
     * Подобно на изтриването на ред с тази
     * особеност, че се подменя само полето парола.
     */
    int smqna_parola(int n, char pass[128])
    {
    	ifstream danni_chetene (file_danni, ios::in);
    	ofstream danni_zapis ("login_tmp.txt", ios::app);
    	danni_whod tmp;
    	int red=0;
    	while(danni_chetene>>tmp.ime>>tmp.pass)
    	{
    		if(red==n)
    			danni_zapis<<tmp.ime<<" "<<pass<<endl;
    		else
    			danni_zapis<<tmp.ime<<" "<<tmp.pass<<endl;
    		red++;
    	};
    	danni_chetene.close();
    	danni_zapis.close();
    	if (!rename (file_danni, "login_old.txt"))
    	{
    		rename ("login_tmp.txt", file_danni);
    		remove ("login_old.txt");
    		return 1;
    	}
    	else 
    	{
    		remove ("login_tmp.txt");
    		return 0;
    	};
    };
    
    int main(int argc, char** argv) {
    	
    	danni_whod potrebitel;
    	fstream danni;
    	danni.open(file_danni, ios::in | ios::app);
    	if (danni.is_open())// проверява дали има такъв файл.
    	{
    		danni.close();
    		cout<<"Wuwedi: \n1: za registrirane \n2: za whod \n3: za iztriwane na potrebitel \n4: za smqna na parola \n";
    		int n;
    		cin>>n;
    		switch (n)
    		{
    		case 1:
    				cout<<"Wuwedi ime i parola: ";
    				cin>>potrebitel.ime>>potrebitel.pass;
    				if(prowerka_potrebitel(potrebitel.ime))
    					cout<<"Weche ima takuw potrebitel\n";
    				else
    				{
    					zapis(potrebitel);
    					cout<<"Weche si registriran!\n";
    				};
    			break;
    
    		case 2:
    			cout<<"Wuwedi ime i parola: ";
    			cin>>potrebitel.ime>>potrebitel.pass;
    			if (wpiswane(potrebitel))
    				cout<<"Wie wlqzohte kato "<<potrebitel.ime<<endl;
    			else
    				cout<<"Greshen potrebitel ili parola\n";
    			break;
    
    		case 3:
    			int i, red;
    			i=izwedi();
    			cout<<"Wuwedete nomera na potrebitelq za iztriwane: ";
    			cin>>red;
    			if ((red<0)||(red>i))
    				cout<<"Newaliden red\n";
    			else if (iztriwane(red))
    				cout<<"Uspeshno e iztrit potrebitelq\n";
    			else
    				cout<<"Greshka pri iztriwaneto\n";
    			break;
    
    		case 4:
    			i=izwedi();
    			cout<<"Wuwedete nomera na potrebitelq za smqna na parola: ";
    			cin>>red;
    			if ((red<0)||(red>i))
    				cout<<"Newaliden red\n";
    			else 
    			{
    				char pass[128];
    				cout<<"Wuwedete nowa parola: ";
    				cin>>pass;
    			if (smqna_parola(red, pass))
    				cout<<"Parolata e smenena uspeshno\n";
    			else
    				cout<<"Greshka pri podmqnata\n";
    			}
    			break;
    				
    		default: cout<<"Nqma takuw wariant\n";
    		};
    	}
    	else cout<<"Problem s otwarqneto na faila!!!\n";
    	system("pause");
    	return 0;
    }
    
  2. lochka каза:
    #include <stdafx.h> //Този хедър може и да ви пречи
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
     
    using namespace std;
     
    const char file_danni[20]="login.txt"; // деклариране на константа от тип низ
     
    struct danni_whod // структура с име danni_whod
    {
        char ime[64]; //  деклариране поле от тип низ 
        char pass[128]; // деклариране на поле от тип низ
    };
     
    int prowerka_potrebitel (char ime[64]) //Проверка за съвпадащи потребители. С един параметър с име "ime"
    {
        ifstream danni; // файл за четене
        danni.open(file_danni, ios::in); // отваряне на файл за четене с име file_danni
        char temp[64];// деклариране на низ
        while(danni>>temp) // цикъл while (докато можем да прочетем от файла в temp)
            if(strcmp(ime,temp)==0) // ако двете са еднакви
            {
                danni.close(); // затваряне на файла
                return 1; // връщане на стойност 1 
            }
        danni.close(); // затваряне на файла  
        return 0; // връщане на стойност 0
  3. Emily каза:
    {
      void zapis (danni_whod potrebitel) //Запис на данни във файла.
    {
        ofstream danni; // деклариране на файл само за запис с име danni.
        danni.open(file_danni, ios::app); //отваряне на файла за добавяне само в края на файла и записване на съдържанието му.
        danni<<potrebitel.ime<<" "<<potrebitel.pass<<endl; // запис във файла  и нов ред.
        danni.close(); // затваряне на файла. 
    };
     
    int wpiswane(danni_whod potrebitel) //Вписване на потребител.
    {
        ifstream danni; // файл danni само за четене.
        danni.open (file_danni, ios::in); // отваряне на файла за четене.
        danni_whod tmp; // декларираме променлива от тип структура с име tmp.
        while (danni>>tmp.ime>>tmp.pass) //цикъл while (четене на данни име и парола).
        {
            if ((strcmp(tmp.ime,potrebitel.ime)==0)&&(strcmp(tmp.pass,potrebitel.pass)==0)) // сравнява низовете  (ако името  съответсва на това подадено на потребителя и паролата също)
            {
                danni.close(); // затваряне на файла.
                return 1; // връща 1 (условието е изпълнено).
            }
        }
        danni.close(); //затваряне на файла.
        return 0;// връща 0 (условието не е изпълнено) .
    };
        
  4. Gerry06 каза:
    #include <cstdlib>
    #include <iostream>
    #include <fstream> //деклариране на библиотека 
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        int iztriwane(int n) // деклариране на функция от целочислен тип
    {
        ifstream danni_chetene (file_danni, ios::in); // деклариране на файл само за четене и го отваря в режим за четене
        ofstream danni_zapis ("login_tmp.txt", ios::app); // деклариране на файл само за запис
        danni_whod tmp; // деклариране на променлива тип структура
        int red=0; // деклариране на променлива от целочислен тип и едновременно с това инициализираме
        while(danni_chetene>>tmp.ime>>tmp.pass) // цикъл с постусловие (докато от файла се четат името и паролата)
        {
            if(red!=n) // ако red е различно от променливата във файла
                danni_zapis<<tmp.ime<<" "<<tmp.pass<<endl; // записваме във файла за запис името и паролата
            red++; // увеличаване на реда с 1
        };
        danni_chetene.close(); // затваряне на файла за четене
        danni_zapis.close(); // затваряне на файла за запис
        if (!rename (file_danni, "login_old.txt")) //ако успешно е преименуван файла с данни
        {
            rename ("login_tmp.txt", file_danni); //преименуване файла с данни от "login_tmp.txt" на записаното във file_danni
            remove ("login_old.txt"); //премахване на стария файл login_old.txt
            return 1; // връща 1 ,т.е. успешно е преименуван
        }
        else //ако преименуването не е успешно
        {
            remove ("login_tmp.txt"); //премахване на новия файл login_tmp.txt
            return 0; //връща 0, т.е. преименуването е неуспешно
        };
    };
        
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

Вашият коментар