You are on page 1of 28

#include <iostream>

#include <cstring>
using namespace std;
const char QUESTION[] = "You are succesfully entered the system!\n";

struct datauser
{
int passw, account;
char name[20];
};

int check(char* name, int exam)


{
int i = 0, password;
char j[20];
cout << "Welcome, " << name << "! Please, enter the password:\n";
while (i != 3)
{
cin >> password;
if (password == exam)
{
cout << QUESTION;
cout << "Do you want to change the password?(Yes/No)";
cin >> j;
if ((strcmp(j, "Yes") == 0) || (strcmp(j, "yes") == 0))
{
if (strcmp(name, "Admin") == 0)
{
cout << "Which account do you want edit?\n";
return 0;
}
cout << "Enter the password that you want set as a new one:";
cin >> password;
cout << "Password has been succefully chaned!\nEnd of the session.\nEnter
your login:";
return password;
}
else
cout << "End of the session.\nEnter your login:";
return exam;
}
cout << "You entered the wrong password!\n Please, try again.\n";
i++;
if (i == 3) {
cout << "You have tried 3 times already and all of them were wrong!\nEnter
your login:\n";
return exam;
}
}
}

int main()
{
struct datauser a[4];
a[0].passw = 1234;
a[1].passw = 34353;
a[2].passw = 6678;
a[3].passw = 99999;
strcpy_s(a[0].name, "Yegor");
strcpy_s(a[1].name, "Tom");
strcpy_s(a[2].name, "Mike");
strcpy_s(a[3].name, "Admin");
int i = 0, newpass;
char login[20];
cout << "Hello, enter your login: ";
while (i < 3)
{
cin >> login;
for (i = 0; i < 4; i++)
{
if (strcmp(login, a[i].name) == 0) {
newpass = check(login, a[i].passw);
a[i].passw = newpass;
}
else if (strcmp(login, logs[3]) == 0) {
newpass = check(login, exam[3]);
if (newpass == 0)
{
for (int j = 0; j < 4; j++)
cout << j + 1 << " - " << logs[j] << " " << exam[j] << "\n";
cout << "Enter the number:";
cin >> newpass;
for (int j = 0; j < 4; j++)
if (newpass == j + 1)
{
cout << "Enter the password that you want set as a new one:";
cin >> newpass;
exam[j] = newpass;
cout << "The new password was set succefully!\nThe end of the
session.\nEnter your login:";
}
}
}
else
{
i++;
if (i == 3) {
cout << "You have tried to many times.\nEnd of the program.";
return 0;
}
cout << "There is no account with such a login. Try again.\n";
}
}
return 0;
}
The old one:

#include <iostream>
using namespace std;
const char QUESTION[] = "You are succesfully entered the system!\n";

int check(char* name, int exam)


{
int i = 0, password;
char j[20];
cout << "Welcome, " << name << "! Please, enter the password:\n";
while (i != 3)
{
cin >> password;
if (password == exam)
{
cout << QUESTION;
cout << "Do you want to change the password?(Yes/No)";
cin >> j;
if ((strcmp(j, "Yes") == 0) || (strcmp(j, "yes") == 0))//Work on it
{
if (strcmp(name, "Admin") == 0)
{
cout << "Which account do you want edit?\n";
return 0;
}
cout << "Enter the password that you want set as a new one:";
cin >> password;
cout << "Password has been succefully chaned!\nEnd of the session.\nEnter
your login:";
return password;
}
else
cout << "End of the session.\nEnter your login:";
return exam;
}
cout << "You entered the wrong password!\n Please, try again.\n";
i++;
if (i == 3) {
cout << "You have tried 3 times already and all of them were wrong!\nEnter
your login:\n";
return exam;
}
}
}
int main()
{
int exam[4] = { 1243, 73112, 2312, 12345}, i = 0, newpass;
char logs[4][10] = { "Yegor", "Tom", "Mike","Admin" }, login[20];
cout << "Hello, enter your login: ";
while (i < 3)
{
cin >> login;
if (strcmp(login, logs[0]) == 0){
newpass = check(login, exam[0]);
exam[0] = newpass;
}
else if (strcmp(login, logs[1]) == 0){
newpass = check(login, exam[1]);
exam[1] = newpass;
}
else if (strcmp(login, logs[2]) == 0) {
newpass = check(login, exam[2]);
exam[2] = newpass;
}
else if (strcmp(login, logs[3]) == 0) {
newpass = check(login, exam[3]);
if (newpass == 0)
{
for (int j = 0; j < 4; j++)
cout << j+1 << " - " << logs[j] << " " << exam[j] << "\n";
cout << "Enter the number:";
cin >> newpass;
for (int j = 0; j < 4; j++)
if (newpass == j+1)
{
cout << "Enter the password that you want set as a new one:";
cin >> newpass;
exam[j] = newpass;
cout << "The new password was set succefully!\nThe end of the
session\nEnter your login:";
}
}
}
else
{
i++;
if (i == 3) {
cout << "You have tried to many times.\nEnd of the program.";
return 0;
}
cout << "There is no account with such a login. Try again.\n";
}
}
return 0;
}
//// Петров Єгор Олександрович

//// Група 137-б , варіант 4.

//// Л.р. №1.2

//// a) Утворіть список, вузли якого містять дані відповідно варіанту;

////b) Надрукуйте створений список;

////c) Додайте у список декілька нових вузлів Умова додавання (+) у варіанті;

////d) Надрукуйте оновлений список;

////e) Видаліть зі списку вузол(вузли). Умова видалення (– ) у варіанті

////f) Надрукуйте оновлений список;

////g) Поділіть список на два, задавши номер вузла, з якого починається другий список.

////h) Надрукуйте обидва списки.

////список містить інформацію про книги (назва, автор, кількість сторінок, рік випуску, стиль).

////+ після вузла, номер якого задано з клавіатури;

////- дані про книги автора, якого задає користувач

#define _CRT_SECURE_NO_WARNINGS
#include <Windows.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
struct book
{
char nazva[20]; char avtor[15]; long int dov; long int year; char type[15]; int
num;
struct book* next; // посилання на наступний вузол
};
char bookN[10][20] = { "Сяйво","Нічна зміна","Перевтілення","Катерина","Довга
прогулянка","Інститут","Шторм сторіччя ","Майстер і Маргарита","Крихітка
Цахес","Талісман" };
struct book* head, *last, *current, *element, *head2;
void MakeNode(void); // Створення списку
void Druk(void); // Друк елементів списку
void AddNode(void); // Додавання нового елемента у список після вузла 
void DelNode(void); // Вдалення вузла 
void DelMem(struct book*); // Функція видалення останнього елемента
void DrukSplit(int); // Функція розділення списку
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
system("color F0");
printf("Створюємо список книжок \n");
printf("Для закінчення введення списку натиснути -1 \n");
head = NULL; /*початок списку*/
last = NULL; /*останній елемент*/
current = NULL; /*поточний елемент*/
head2 = NULL;//при розділені списку напіл - буде виконувтаи роль першого елементу
для другої частини списку
MakeNode();
printf("Створений список \n");
Druk();
AddNode();
printf("Список після додавання вузлів: \n");
Druk();
DelNode();
printf("Список після видалення вузлів: \n");
Druk();
int num;
printf("Введіть на якому вузлі потрібно розділити список \n");
scanf("%d", &num);
printf("Список після розділення: \n");
DrukSplit(num);
return 0;
}
/* видалення вузла*/
void DelNode()
{
int k = 0;
char name[15];
current = head;
printf("Введіть прізвище автора , дані про книги якого , треба видалити\n");
scanf("%s", name);
while (current != NULL)
{
if (strcmp(name, head->avtor) == 0)//голова списку
{
element = head;
head = element->next;
free(element);
k++;
break;
}
else if (strcmp(name, current->next->avtor) == 0)//пошук прізвища після
голови списку
{
element = current->next;
current->next = element->next;
free(element);
k++;
break;
}
current = current->next;
}
if (k == 0)
{
printf("Автор з таким прізвищем не існує.\n");
}
}

///* створення списку */


void MakeNode() 
{
long int dd, ye, k=0;
while (1)
{
/*виділення пам’яті для нового елементу*/
if ((current = (struct book*)malloc(sizeof(struct book))) == NULL) 
{
fprintf(stderr, "No free memory!\n");
exit(EXIT_FAILURE); /*помилка і завершення програми*/
}
else 
{
printf("Введіть прізвище автора , кількість сторінок, рік випуску,
стиль >>");
scanf("%s %ld %ld %s", &current->avtor, &dd, &ye, &current->type);
k++;
if (dd == -1)
break;
current->next = NULL; /* формування вузла списку */
strcpy(current->nazva, bookN[rand() % 9]);
current->avtor;
current->dov = dd;
current->year = ye;
current->type;
current->num = k; //Лічильник для подальшої ініціалізації списку
if (!(head))
head = current; /*якщо список пустий, новий елемент стає
початком*/
else
(last)->next = current; /*якщо не пустий, то останній елемент
вказує на новий*/
last = current; /*новий стає останнім*/
}
}
}
///* друк списку*/
void Druk(void) 
{
current = head;
printf("%20s %14s %20s %6s %8s\n", "Назва", "Автор", "Кількість сторінок", "Рік",
"Стиль");
while (current != NULL) /* поки не дійдемо до кінця списку */
{
printf("%20s %14s %20d %6d %8s\n", current->nazva, current->avtor, current-
>dov, current->year, current->type);
current = current->next; //Перехід до наступного вузла
}
}
///* вивільнення пам’яті*/
void DelMem(struct book* lst) 
{
if (lst) 
{
if (lst->next)
DelMem(lst->next);/* рекурсивно звільняємо пам’ять */
free(lst);/*вивільняємо пам’ять голови списку*/
}
}
void AddNode() 
{
struct book* addb = (struct book*)malloc(sizeof(struct book));
{
struct list *element;
current = head;
printf("Введіть данні нової книги>> ");
scanf("%s %s %ld %d %s", &addb->nazva, &addb->avtor, &addb->dov,
&addb->year, &addb->type);
printf("Введіть після якого вузла потрібно додати новий\n");
scanf("%d", &addb->num);
while (current != NULL)
{
if (addb->num == 0)
{
addb->next = head;
head = addb;
break;
}
if (current->num == addb->num)
{
element = current->next;
current->next = addb;
addb->next = element;
}
current = current->next;
}
}
}
void DrukSplit(int num)
{
int k = 1;
current = head;
printf("%20s %14s %20s %6s %8s\n", "Назва", "Автор", "Кількість сторінок", "Рік",
"Стиль");
while (current != NULL)
{
if (k == num)
{
head2 = current->next;
current->next = NULL;
}
printf("%20s %14s %20d %6d %8s\n", current->nazva, current->avtor, current-
>dov, current->year, current->type);
current = current->next;
k++;
}
current = head2;
printf("%20s %14s %20s %6s %8s\n", "Назва", "Автор", "Кількість сторінок", "Рік",
"Стиль");
while (current != NULL)
{
printf("%20s %14s %20d %6d %8s\n", current->nazva, current->avtor, current-
>dov, current->year, current->type);
current = current->next;
}
}

Приклад роботи програми :


Висновок : В ході виконання лабораторної роботи , я користувався
динамічним виділенням пам’яті  , завчасно залучивши бібліотеку #include
<malloc.h> (тобто використовували тільки необхідний об’єм пам’яті). Для
виконання роботи були використані однозв`язні лінійні списки. 

Алгоритм реалізації – комбінований.

Використовували ряд функцій для роботи зі списком ( функції додавання ,


виключення узлів зі списку.) Для знаходження потрібних узлів потрібно
перебирати увесь список з початку , поки не дійдимо до потрібного. Взагалі ,
я використовував змінні *head , *current , *last .  Змінні *current та *last – не
обов’язкові , але легше працювати використовуючи їх.

Стосовно розділення списку навпіл : в мене вийшло поділити на два окремих


списки , починаючи з вузла , який задає користувач. В голові був такий
алгоритм : потрібно отримати номер вузла , на  якому відбудється
роз`єднання , потім знайти цей вузол , перебираючи список з початку.
Знайшовши потрібний вузол – його вказівник на наступний вузол -
зафіксувати , а потім прирівняти до NULL. Зафіксований вказівник – назвав
*head2 , як початок другої частини списку. Та починаючи з нього далі
перебирати список доки не дідимо до значення NULL.

*Щоб не заповнювати власноруч , можете використати це (можна просто


скопійувати та вставити у компілятор) :
Кінг 215 2009 Детектив

Кафка 98 1876 Повість

Шевченко 456 1990 Роман

Булгаков 546 1912 Роман

Ремарк 213 2005 Детектив

Гофман 178 1954 Новела

-1 -1 -1 -1

Ідіот Достоєвський 516 1932 Роман

Булгаков

#include <iostream>
#include <cstring>
#include <Windows.h>
using namespace std;
struct datauser
{
char login[20]; char password[20];
int num;
struct datauser* next; // посилання на наступний вузол
};
struct datauser* head, *last, *current, *element;
void MakeNode(void); // Створення списку
void Druk(void); // Друк елементів списку
void AddNode(void); // Додавання нового елемента у список після вузла
void DelNode(void); // Вдалення вузла
void DelMem(struct datauser*); // Функція видалення останнього елемента
void setparam(int, int);
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char log[20], pass[20];
int i = 0, num;
cout << "Для почтаку потрібно занести необхідну інформацію для аккаунтів\nДля
закінчення введення списку натиснути -1 \n";
head = NULL; /*початок списку*/
last = NULL; /*останній елемент*/
current = NULL; /*поточний елемент*/
MakeNode();
Druk();
cout << "Успіх!База користувачів створена!\nПерезавантажуємо систему...";
Sleep(4000);
system("cls");
cout << "Вітаємо у системі!\nБудь ласка, введіть Ваш логін:\n";
while (i < 3)
{
cin >> log;
current = head;
int count = 0;
while (current != NULL)
{
for (int j = 3; -1 < j; j--)
{
if (strcmp(log, current->login) == 0)
{
count++;
cout << "Вітаємо у системі " << current->login << "!
Введіть Ваш пароль:"; ////////////////////////////проверить
арфографию//////////////////////////////////////////////
cin >> pass;
if (strcmp(pass, current->password) == 0)
{
if (strcmp(log, "Admin") == 0)
{
cout << "Ви успішно увійшли у аккаунт!Що
ви бажаєте зробити?\n";
while (1)
{
cout << "0 - Переглянути список
аккаунтів.\n1 - Додати аккаунт.\n2 - Видалити аккаунт.\n3 - Змінити дані будь-якого
аккаунта.\n4 - Закінчити сесію.\n";
cin >> num;
if (num == 0) Druk();
else if (num == 1)
{
AddNode();
cout << "Список
користувачів: \n";
Druk();
}
else if (num == 2)
{
DelNode();
cout << "Список
користувачів після видалення вузлів: \n";
Druk();
}
else if (num == 3) {
int numb = 0;
Druk();
cout << "Параметри якого
аккаунту Ви хочете змінити:" << endl;
cin >> numb;
cout << "Що Ви хочете
змінити?\n1 - Логін\n2- Пароль" << endl;
cin >> num;
setparam(num, numb);
}
else if (num == 4) {
cout << "Завершення сесії."
<< endl;
break;
}
}

}
else {
cout << "Ви успішно увійшли у
аккаунт!\nЩо Ви хочете змінити?\n1 - Логін\n2- Пароль" << endl;
cin >> num;
setparam(num, current->num);
break;
}
}
else {
cout << "Не правильний пароль!\nУ Вас залишилось
" << j << " спроб.\n";////
if (j == 0)
{
cout << "Ви перевищили максимальну
кількість спроб.\nКінець сесії." << endl;
break;
}
}
}
}
current = current->next;
if (count == 0 && current == NULL)
{
i++;
if (i == 3) {
cout << "Ви перевищили максимальну кількість
спроб.\nКінець програми.";
return 0;
}
cout << "Немає аккаунту з таким ім'ям. Спробуйте знову.\n";
}
}
}
return 0;
}
/* видалення вузла*/
void DelNode()
{
int k = 0;
char name[15];
current = head;
cout << "Введіть логін, який потрібно видалити\n";
cin >> name;
while (current != NULL)
{
if (strcmp(name, head->login) == 0)//голова списку
{
element = head;
head = element->next;
free(element);
k++;
break;
}
else if (strcmp(name, current->next->login) == 0)//пошук прізвища після
голови списку
{
element = current->next;
current->next = element->next;
free(element);
k++;
break;
}
current = current->next;
}
if (k == 0)
{
cout << "Автор з таким прізвищем не існує.\n";
}
}
///* створення списку */
void MakeNode()
{
int k = 0;
while (1)
{
/*виділення пам’яті для нового елементу*/
if ((current = (struct datauser*)malloc(sizeof(struct datauser))) == NULL)
{
fprintf(stderr, "No free memory!\n");
exit(EXIT_FAILURE); /*помилка і завершення програми*/
}
else
{
cout << "Введіть логін і пароль для " << k+1 << " аккаунту:";
cin >> current->login >> current->password;
k++;
if (strcmp(current->login, "-1") == 0)
break;
current->next = NULL; /* формування вузла списку */
current->num = k; //Лічильник для подальшої ініціалізації списку
if (!(head))
head = current; /*якщо список пустий, новий елемент стає
початком*/
else
(last)->next = current; /*якщо не пустий, то останній елемент
вказує на новий*/
last = current; /*новий стає останнім*/
}
}
}
///* друк списку*/
void Druk(void)
{
current = head;
int k = 0;
while (current != NULL) /* поки не дійдемо до кінця списку */
{
current->num = k+1;
cout << current->login << "\t" << current->password << "\t" << current->num
<< endl;
k++;
current = current->next; //Перехід до наступного вузла
}
}
///* вивільнення пам’яті*/
void DelMem(struct datauser* lst)
{
if (lst)
{
if (lst->next)
DelMem(lst->next);/* рекурсивно звільняємо пам’ять */
free(lst);/*вивільняємо пам’ять голови списку*/
}
}
void AddNode()
{
struct datauser* addb = (struct datauser*)malloc(sizeof(struct datauser));
{
current = head;
cout << "Введіть данні нового аккаунту(Логін та пароль)>> ";
cin >> addb->login >> addb->password;
cout << "Введіть після якого вузла потрібно додати новий аккаунт(для
зручності)\n";
cin >> addb->num;
while (current != NULL)
{
if (addb->num == 0)
{
addb->next = head;
head = addb;
break;
}
if (current->num == addb->num)
{
element = current->next;
current->next = addb;
addb->next = element;
}
current = current->next;
}
}
}
void setparam(int num, int j)
{
current = head;
char log[20], pass[20];
while (current != NULL)
{
if (j == current->num) {
if (num == 1)
{
cout << "Введіть новий логін:";
cin >> log;
strcpy_s(current->login, log);
}
else
{
cout << "Введіть новий пароль:";
cin >> pass;
strcpy_s(current->password, pass);
}
}
current = current->next;
}
cout << "Зміни успішно запроваджені!" << endl;
}
SUCCESFUL VARIANT OF CODE:
#include <iostream>
#include <cstring>
#include <Windows.h>
using namespace std;

struct datauser
{
char login[20]; char password[20];
int num;
struct datauser* next; // посилання на наступний вузол
};
struct datauser* head, *last, *current, *element;
void MakeNode(void); // Створення списку
void Druk(void); // Друк елементів списку
void AddNode(void); // Додавання нового елемента у список після вузла
void DelNode(void); // Вдалення вузла
void DelMem(struct datauser*); // Функція видалення останнього елемента
void setparam(int);
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char log[20], pass[20];
int i = 0, num;
cout << "Для почтаку потрібно занести необхідну інформацію для аккаунтів\nДля
закінчення введення списку натиснути -1 \n";
head = NULL; /*початок списку*/
last = NULL; /*останній елемент*/
current = NULL; /*поточний елемент*/
MakeNode();
Druk();
cout << "Успіх!База користувачів створена!\nПерезавантажуємо систему...";
Sleep(400);
system("cls");
cout << "Вітаємо у системі!\nБудь ласка, введіть Ваш логін:\n";
while (i < 3)
{
cin >> log;
current = head;
int count = 0;
while (current != NULL)
{
for (int j = 3; -1 < j; j--)
{
if (strcmp(log, current->login) == 0)
{
count++;
i = 0;
cout << "Вітаємо у системі " << current->login << "!
Введіть Ваш пароль:";
cin >> pass;
if (strcmp(pass, current->password) == 0)
{
if (strcmp(current->login, "Admin") == 0)
{
cout << "Ви успішно увійшли у аккаунт!Що
ви бажаєте зробити?\n";
while (1)
{
cout << "Налаштування:\n0 -
Переглянути список аккаунтів.\n1 - Додати аккаунт.\n2 - Видалити аккаунт.\n3 - Змінити
дані будь-якого аккаунта.\n4 - Закінчити сесію.\n";
cin >> num;
if (num == 0) Druk();
else if (num == 1)
{
AddNode();
cout << "Список
користувачів: \n";
Druk();
}
else if (num == 2)
{
DelNode();
cout << "Список
користувачів після видалення вузлів: \n";
Druk();
}
else if (num == 3) {
int numb = 0;
Druk();
cout << "Параметри якого
аккаунту Ви хочете змінити:" << endl;
cin >> numb;
setparam(numb);
}
else if (num == 4) {
cout << "Завершення сесії."
<< endl;
break;
}
}
break;
}
else
{
cout << "Ви успішно увійшли у аккаунт!"<<
endl;
setparam(current->num);
break;
}
}
else {
cout << "Не правильний пароль!\nУ Вас залишилось
" << j << " спроби.\n";
if (j == 0)
{
cout << "Ви перевищили максимальну
кількість спроб.\nКінець сесії." << endl;
break;
}
}
}
}
if(current == NULL) break;
current = current->next;
}
if (count == 0)
{
i++;
if (i == 3) {
cout << "Ви перевищили максимальну кількість спроб.\nКінець
програми.";
return 0;
}
cout << "Немає аккаунту з таким ім'ям. Спробуйте знову.\n" << "Ви
використали " << i << " з 3 спроб." << endl;
}
}
return 0;
}
/* видалення вузла*/
void DelNode()
{
int k = 0;
char name[15];
current = head;
cout << "Введіть логін, який потрібно видалити\n";
cin >> name;
while (current != NULL)
{
if (strcmp(name, head->login) == 0)//голова списку
{
element = head;
head = element->next;
free(element);
k++;
break;
}
else if (strcmp(name, current->next->login) == 0)//пошук прізвища після
голови списку
{
element = current->next;
current->next = element->next;
free(element);
k++;
break;
}
current = current->next;
}
if (k == 0)
{
cout << "Автор з таким прізвищем не існує.\n";
}
}

///* створення списку */


void MakeNode()
{
int k = 0;
while (1)
{
/*виділення пам’яті для нового елементу*/
if ((current = (struct datauser*)malloc(sizeof(struct datauser))) == NULL)
{
fprintf(stderr, "No free memory!\n");
exit(EXIT_FAILURE); /*помилка і завершення програми*/
}
else
{
cout << "Введіть логін і пароль для " << k+1 << " аккаунту:";
cin >> current->login >> current->password;
k++;
if (strcmp(current->login, "-1") == 0)
break;
current->next = NULL; /* формування вузла списку */
current->num = k; //Лічильник для подальшої ініціалізації списку
if (!(head))
head = current; /*якщо список пустий, новий елемент стає
початком*/
else
(last)->next = current; /*якщо не пустий, то останній елемент
вказує на новий*/
last = current; /*новий стає останнім*/
}
}
}
///* друк списку*/
void Druk(void)
{
current = head;
int k = 0;
while (current != NULL) /* поки не дійдемо до кінця списку */
{
current->num = k+1;
cout << current->login << "\t" << current->password << "\t" << current->num
<< endl;
k++;
current = current->next; //Перехід до наступного вузла
}
}
///* вивільнення пам’яті*/
void DelMem(struct datauser* lst)
{
if (lst)
{
if (lst->next)
DelMem(lst->next);/* рекурсивно звільняємо пам’ять */
free(lst);/*вивільняємо пам’ять голови списку*/
}
}
void AddNode()
{
struct datauser* addb = (struct datauser*)malloc(sizeof(struct datauser));
{
current = head;
cout << "Введіть данні нового аккаунту(Логін та пароль)>> ";
cin >> addb->login >> addb->password;
cout << "Введіть після якого вузла потрібно додати новий аккаунт(для
зручності)\n";
cin >> addb->num;
while (current != NULL)
{
if (addb->num == 0)
{
addb->next = head;
head = addb;
break;
}
if (current->num == addb->num)
{
element = current->next;
current->next = addb;
addb->next = element;
}
current = current->next;
}
}
}
void setparam(int num)
{
current = head;
char log[20], pass[20];
int numb;
cout << "Що Ви хочете змінити?\n1 - Логін\n2- Пароль" << endl;
cin >> numb;
while (current != NULL)
{
if (num == current->num) {
if (numb == 1)
{
cout << "Введіть новий логін:";
cin >> log;
strcpy_s(current->login, log);
break;
}
else
{
cout << "Введіть новий пароль:";
cin >> pass;
strcpy_s(current->password, pass);
break;
}
}
current = current->next;
}
cout << "Зміни успішно запроваджені!" << endl;
}

......................................................................................................................................................
#include <iostream>
#include <cstring>
#include <Windows.h>

using namespace std;

struct datauser
{
char login[20]; char password[20];
int num;
struct datauser* next; // посилання на наступний вузол
};
struct datauser* head, * last, * current, * element;
void MakeNode(void); // Створення списку
void Druk(void); // Друк елементів списку
void AddNode(void); // Додавання нового елемента у список після вузла
void DelNode(void); // Вдалення вузла
void DelMem(struct datauser*); // Функція видалення останнього елемента
void setparam(int);
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char log[20], pass[20];
int i = 0, num, j = 0, count = 0;
cout << "Для почтаку потрібно занести необхідну інформацію для аккаунтів\nДля
закінчення введення списку натиснути -1 \n";
head = NULL; /*початок списку*/
last = NULL; /*останній елемент*/
current = NULL; /*поточний елемент*/
MakeNode();
Druk();
cout << "Успіх!База користувачів створена!\nПерезавантажуємо систему...";
Sleep(4000);
system("cls");
while (1)
{
cout << "Ви хочете увійти у існуючий аккаунт або зареєструватися?\n1 -
Увійти\n2 - Зареєструватися\n3 - Завершити роботу системи\n";
cin >> j;
if (j == 2)
AddNode();
else if (j == 1)
{
cout << "Вітаємо у системі!\n";
i = 0;
while (i < 3)
{
cout << "Будь ласка, введіть Ваш логін : \n";
cin >> log;
current = head;
count = 0;
while (current != NULL)
{
for (int j = 3; -1 < j; j--)
{
if (_stricmp(log, current->login) == 0)
{
count++;
i = 0;
cout << "Вітаємо у системі " << current-
>login << "! Введіть Ваш пароль:";
cin >> pass;
if (_stricmp(pass, current->password) ==
0)
{
if (_stricmp(current->login,
"Admin") == 0)
{
cout << "Ви успішно увійшли
у аккаунт!Що ви бажаєте зробити?\n";
while (1)
{
cout <<
"Налаштування:\n0 - Переглянути список аккаунтів.\n1 - Додати аккаунт.\n2 - Видалити
аккаунт.\n3 - Змінити дані будь-якого аккаунта.\n4 - Закінчити сесію.\n";
cin >> num;
if (num == 0)
Druk();
else if (num == 1)
{
AddNode();
cout <<
"Список користувачів: \n";
Druk();
}
else if (num == 2)
{
DelNode();
cout <<
"Список користувачів після видалення вузлів: \n";
Druk();
}
else if (num == 3) {
int numb = 0;
cout <<
"Загальний список користувачів:\n";
Druk();
cout <<
"Параметри якого аккаунту Ви хочете змінити:" << endl;
cin >> numb;

setparam(numb);
}
else if (num == 4) {
cout <<
"Завершення сесії." << endl;
i = 3;
break;
}
}
break;
}
else
{
cout << "Ви успішно увійшли
у аккаунт!" << endl;
setparam(current->num);
i = 3;
break;
}
}
else {
cout << "Не правильний пароль!\nУ
Вас залишилось " << j << " спроби.\n";
if (j == 0)
{
cout << "Ви перевищили
максимальну кількість спроб.\nКінець сесії." << endl;
break;
}
}
}
}
if (current == NULL) break;
current = current->next;
}
if (count == 0)
{
i++;
if (i == 3) {
cout << "Ви перевищили максимальну кількість
спроб.\nКінець програми.";
return 0;
}
cout << "Немає аккаунту з таким ім'ям. Спробуйте
знову.\n" << "Ви використали " << i << " з 3 спроб." << endl;
}
}
}
else {
cout << "Завершення роботи системи.";
return 0;
}
}
return 0;
}
/* видалення вузла*/
void DelNode()
{
int k = 0;
char name[15];
current = head;
cout << "Введіть логін акаунту, який потрібно видалити\n";
cin >> name;
while (current != NULL)
{
if (_stricmp(name, head->login) == 0)//голова списку
{
element = head;
head = element->next;
free(element);
k++;
break;
}
else if (_stricmp(name, current->next->login) == 0)//пошук прізвища після
голови списку
{
element = current->next;
current->next = element->next;
free(element);
k++;
break;
}
current = current->next;
}
if (k == 0)
{
cout << "Автор з таким прізвищем не існує.\n";
}
}
///* створення списку */
void MakeNode()
{
int k = 0;
while (1)
{
/*виділення пам’яті для нового елементу*/
if ((current = (struct datauser*)malloc(sizeof(struct datauser))) == NULL)
{
fprintf(stderr, "No free memory!\n");
exit(EXIT_FAILURE); /*помилка і завершення програми*/
}
else
{
cout << "Введіть логін і пароль для " << k + 1 << " аккаунту:";
cin >> current->login >> current->password;
k++;
if (strcmp(current->login, "-1") == 0)
break;
current->next = NULL; /* формування вузла списку */
current->num = k; //Лічильник для подальшої ініціалізації списку
if (!(head))
head = current; /*якщо список пустий, новий елемент стає
початком*/
else
(last)->next = current; /*якщо не пустий, то останній елемент
вказує на новий*/
last = current; /*новий стає останнім*/
}
}
}
///* друк списку*/
void Druk(void)
{
current = head;
int k = 0;
while (current != NULL) /* поки не дійдемо до кінця списку */
{
current->num = k + 1;
cout << current->login << "\t" << current->password << "\t" << current->num
<< endl;
k++;
current = current->next; //Перехід до наступного вузла
}
}
///* вивільнення пам’яті*/
void DelMem(struct datauser* lst)
{
if (lst)
{
if (lst->next)
DelMem(lst->next);/* рекурсивно звільняємо пам’ять */
free(lst);/*вивільняємо пам’ять голови списку*/
}
}
void AddNode()
{
struct datauser* addb = (struct datauser*)malloc(sizeof(struct datauser));
{
current = head;
cout << "Введіть данні нового аккаунту(Логін та пароль)>> ";
cin >> addb->login >> addb-
>password;///////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////
addb->num = last->num;
while (current != NULL)
{
if (addb->num == 0)
{
addb->next = head;
head = addb;
break;
}
if (current->num == addb->num)
{
element = current->next;
current->next = addb;
addb->next = element;
}
current = current->next;
}
}
}
void setparam(int num)
{
current = head;
char log[20], pass[20];
int numb;
cout << "Що Ви хочете змінити?\n1 - Логін\n2 - Пароль\n3 - Видалити аккаунт" <<
endl;
cin >> numb;
while (current != NULL)
{
if (num == current->num) {
if (numb == 1)
{
cout << "Введіть новий логін:";
cin >> log;
strcpy_s(current->login, log);
break;
}
else if (numb == 2)
{
cout << "Введіть новий пароль:";
cin >> pass;
strcpy_s(current->password, pass);
break;
}
else if (numb == 3)
{
while (current != NULL)
{
if (num == head->num)//голова списку
{
element = head;
head = element->next;
free(element);
break;
}
else if (num == current->num)//пошук прізвища після
голови списку
{
element = current->next;
current->next = element->next;
free(element);
break;
}
current = current->next;
}
break;
}
}
current = current->next;
}
cout << "Зміни успішно запроваджені!" << endl;
}

You might also like