//выделяем память= new node();
//записываем данные>data = pdata;
//обнуляем указателя на след и пред
first->next = NULL;>prev = NULL;
//последний он же будет и первым= first;
//увеличиваем размер++;
}
//если список не пуст{
//выделяем память*temp = newnode();
//записываем данные>data = pdata;
//указатель на след теперь указываем на первый
temp->next = first;
//предыдущегонет>prev = NULL;
//указатель на предыдущий первого элемента указывает на новый элемент>prev=temp;
//новый элемент становится первым= temp;
//увеличиваем размер++;
};
}
//добавление в конец спискаadd_back(student pdata) {
//если список пуст(size == 0) {
//выделяем память= new node();
//записываемданные>data = pdata;
//указатели на пред и след не существуют
last->next = NULL;>prev = NULL;
//первый он же последний= last;
//увеличиваем размер++;
}
//если список не пуст{
//выделяемпамять*temp = newnode();
//записываем данные>data = pdata;
//указатель на предыдущий нового элемента указывает на последний элемент>prev = last;
//указатель на след нового элемента пуст>next = NULL;
//указатель на следующий последнего указывает теперь на новый элемент>next = temp;
//новый элемент теперь последний= temp;
//увеличиваем размер++;
};
}
//функция дял удаления по индексуrem(int index) {
//если удалять нечего, то выводи на экран предупреждение
if(size == 0) {("Списокпуст!\n");
system("pause");
//если удаляем первый элемент
} else if(index == 1 && index!= size) {
//запоминаем его указатель*temp = first;
//снимаем связанный с первым элементом указатель на предыдущий>next->prev = NULL;
//теперь первый элемент - это следующий за первым= first->next;
//удаляем запомненный первый элементtemp;
//уменьшаем размер-;
//если удаляем последний, то примерно тоже самое происходит
} else if(index == size && index!=1) {*temp = last;>prev->next = NULL;= last->prev;temp;
size--;
//если удаляем элемент, который является единственным в списке
} else if(index == size && index == 1) {
//просто удаляемfirst;
//обнуляем указатели на первый и последний элементы
first = NULL;= NULL;
//уменьшаемразмер-;
//если удаляем из середины списка
} else if(index > 1 && index < size) {*current = first;
//в цикле проходим от начала списка до нужного места
for(int i=1; i<index; i++) {
current = current->next;
}
//обнуляем связанные с элементмо указатели
current->prev->next = current->next;>next->prev = current->prev;
//удаляем элементcurrent;
//уменьшаем размер-;
};
}
//функция получение элемента из списка
student get(int index) {*current = first;
//проходим по циклу до нужного элемента
for(int i=1; i<index; i++) {= current->next;
}
//возвращаем содержимое узлаcurrent->data;
}
//размер спискаget_size() {
//возвращаем размер спискаsize;
}
//функция изменения элемента списка
voidchange(intindex) {
//проверка на индексы(index<= 0 || index>size) {
printf("Неверный индекс!\n");("pause");
//на размер списка
} else if(size == 0) {("Списокпуст!\n");
system("pause");
//если изменяем первый, то вызываем функция изменения из структуры со студентом
} else if(index == 1 ) {>data.change();
//если последний, то точно также
} else if(index == size) {>data.change();
//если где-то посередине списка
} else if(index > 1 && index < size) {
node *current = first;
//проходим в цикле до нужного элемента
for(int i=0; i<index; i++) {
current = current->next;
}
//вызываем функцию изменения из структуры со студентом
current->data.change();
}
}
//функция распечатки
voidprint() {
//если размер равен 0, то выводим предупреждение
if(size == 0) {("cls");("Списокпуст!\n");
} else {
//иначе рисуем красивую таблицу, проходясь в цикле по всему списку
node *current = first;i = 1;("cls");(" # | Группа | ФамилияИмяОтчество | О.1 | О.2 | О.3 | Соц |\n");("----|--------|-------------------------------------|-----|-----|-----|-----|\n");(current != NULL) {stud = current->data;("%3d | %6s | %35s | %3d | %3d | %3d | %3s |\n", i, stud.group, stud.name, stud.mark[0], stud.mark[1],.mark[2], stud.social?"Да":"Нет");++;= current->next;
}("----|--------|-------------------------------------|-----|-----|-----|-----|\n");
}
}
//функция очистки спискаclear() {
//если есть что очищать(size > 0) {
//в цикле вызываем функцию удаления по индексу
for(int i=1; i<=size; i++) {
rem(i);
}
}
}_soc() {
//если размер равен 0, то выводим предупреждение
if(size == 0) {("cls");("Списокпуст!\n");
} else {
//иначе рисуем красивую таблицу, проходясь в цикле по всему списку
node *current = first;i = 1;s;.enter_social();("cls");(" # | Группа | ФамилияИмяОтчество | О.1 | О.2 | О.3 | Соц |\n");("----|--------|-------------------------------------|-----|-----|-----|-----|\n");(current != NULL) {stud = current->data;(s.social == stud.social) {("%3d | %6s | %35s | %3d | %3d | %3d | %3s |\n", i, stud.group, stud.name, stud.mark[0], stud.mark[1],.mark[2], stud.social?"Да":"Нет");
}++;= current->next;
}("----|--------|-------------------------------------|-----|-----|-----|-----|\n");
}
};filter_soc_group() {
//если размер равен 0, то выводим предупреждение
if(size == 0) {("cls");("Списокпуст!\n");
} else {
//иначе рисуем красивую таблицу, проходясь в цикле по всему списку
node *current = first;i = 1;s;.enter_social();.enter_group();("cls");(" # | Группа | ФамилияИмяОтчество | О.1 | О.2 | О.3 | Соц |\n");("----|--------|-------------------------------------|-----|-----|-----|-----|\n");(current != NULL) {stud = current->data;(strcmp(s.group, stud.group)==0 && s.social == stud.social) {("%3d | %6s | %35s | %3d | %3d | %3d | %3s |\n", i, stud.group, stud.name, stud.mark[0], stud.mark[1],.mark[2], stud.social?"Да":"Нет");
}++;= current->next;
}("----|--------|-------------------------------------|-----|-----|-----|-----|\n");
}
};filter_soc_excellent() {
//если размер равен 0, то выводим предупреждение
if(size == 0) {("cls");("Списокпуст!\n");
} else {
//иначе рисуем красивую таблицу, проходясь в цикле по всему списку
node *current = first;i = 1;("cls");(" # | Группа | ФамилияИмяОтчество | О.1 | О.2 | О.3 | Соц |\n");("----|--------|-------------------------------------|-----|-----|-----|-----|\n");(current != NULL) {stud = current->data;avg = stud.mark[0] + stud.mark[1] + stud.mark[2];/=3;(stud.social && avg >= 8) {("%3d | %6s | %35s | %3d | %3d | %3d | %3s |\n", i, stud.group, stud.name, stud.mark[0], stud.mark[1],.mark[2], stud.social?"Да":"Нет");
}++;= current->next;
}("----|--------|-------------------------------------|-----|-----|-----|-----|\n");
}
};filter_group() {
//если размер равен 0, то выводим предупреждение
if(size == 0) {("cls");("Списокпуст!\n");
} else {
//иначе рисуем красивую таблицу, проходясь в цикле по всему списку
node *current = first;i = 1;s;.enter_group();("cls");(" # | Группа | ФамилияИмяОтчество | О.1 | О.2 | О.3 | Соц |\n");("----|--------|-------------------------------------|-----|-----|-----|-----|\n");(current != NULL) {stud = current->data;(strcmp(s.group, stud.group)==0) {("%3d | %6s | %35s | %3d | %3d | %3d | %3s |\n", i, stud.group, stud.name, stud.mark[0], stud.mark[1],.mark[2], stud.social?"Да":"Нет");
}++;= current->next;
}("----|--------|-------------------------------------|-----|-----|-----|-----|\n");
}
};filter_name_group() {
//если размер равен 0, то выводим предупреждение
if(size == 0) {("cls");("Списокпуст!\n");
} else {
//иначе рисуем красивую таблицу, проходясь в цикле по всему списку
node *current = first;i = 1;s;.enter_name();.enter_group();("cls");(" # | Группа | ФамилияИмяОтчество | О.1 | О.2 | О.3 | Соц |\n");("----|--------|-------------------------------------|-----|-----|-----|-----|\n");(current != NULL) {stud = current->data;(strcmp(s.name, stud.name)==0 && strcmp(s.group, stud.group)==0) {("%3d | %6s | %35s | %3d | %3d | %3d | %3s |\n", i, stud.group, stud.name, stud.mark[0], stud.mark[1],.mark[2], stud.social?"Да":"Нет");
}("----|--------|-------------------------------------|-----|-----|-----|-----|\n");
}
};complete_target() {
//если размер равен 0, то выводим предупреждение
if(size == 0) {("cls");("Списокпуст!\n");
} else {
//иначе рисуем красивую таблицу, проходясь в цикле по всему списку
node *current = first;i = 1;s;.enter_group();("cls");("# | Группа | Фамилия Имя Отчество | %-7s | Соц | %-9s |\n", "Ср.балл", "Стипендия");("---|--------|-------------------------------------|---------|-----|-----------|\n");(current != NULL) {stud = current->data;(strcmp(stud.group, s.group)==0) {income;avg = stud.mark[0] + stud.mark[1] + stud.mark[2];/=3;(avg > 4) {= MIN_INCOME;(avg>= 8 &&stud.social) {+= MIN_INCOME/2;
} else if(avg >= 8) {+= MIN_INCOME/4;
}
} else {= 0;
}("%2d | %6s | %35s | %-7d | %3s | %-9d |\n", i, stud.group, stud.name, avg,.social?"Да":"Нет", income);
}++;= current->next;
}("---|--------|-------------------------------------|---------|-----|-----------|\n");
}
};
};
#pragma once
//структура с данными о пользователе
struct user_data
{
//логинlogin[15];
//пароль[15];
//права доступа[6];
//забанен или нетactive;
//функция для начальной инициализации
void init(char *prights) {
strcpy(rights, prights);= true;
}
//вводлогинаenter_login() {("cls");
printf("Введите логин. Помните, что максимальная длина логина 15 символов!\n");(">: ");(stdin);
//через fgets чтобы не набрать больше 15 символов
fgets(login, 15, stdin);[strlen(login)-1]='\0';
}
//вводпароляenter_password() {symbol;index = 0;("cls");("Введите пароль. Помните, что максимальная длина пароля 15 символов!\n");(">: ");
{
//читаем посимвольно(stdin);
symbol = _getch();(symbol)
{8:
//если клавиша удаления, удаляем последний символ с консоли
if(index > 0) {("\b \b");
index--;
};13:
//если enter, то ставим ноль-символ
password[index] = '\0';;
default:
//если что-то другое, то сохраняем введенный символ и выводим на экран звездочку
password[index] = symbol;[index+1] = '\0';
_putch('*');++;;
}
} while(symbol != 13 && index < 15);
//в конце ввода шифруем пароль();
}
//шифрование пароляencrypt() {*result = new char[strlen(password)];
int hash = 0;
//умножаем длину пароля на 11= 11 * strlen(password);
//прибавляем к полученному ранее результату код каждого символа, умноженный на 11
for(int i=0; i<strlen(password)-1; i++) {
hash *= 11 * password[i];
}
//из инта переделываем в char, в 16-ричной системе счисления, таким образом получаем зашифрованный пароль
_itoa(hash, result, 16);
//копируем зашифрованный пароль
strcpy(password, result);
}
};
#pragmaonce
#include "user_data.h"
//узелсписка, двусвязного_user_data {
//данные узла_datadata;
//указатель на предыдущий
node_user_data *prev;
//указатель наследующий
node_user_data *next;
};user_data_list {
//указатель на первый элемент_user_data *first;
//указатель на последний элемент
node_user_data *last;
//размер списка
int size;
//функция для начальной инициализации
void init() {= 0;= NULL; = NULL;
}
//добавление в начало списка
void add_front(user_data pdata) {
//если список пуст(size == 0) {
//выделяем память= new node_user_data();
//записываем данные>data = pdata;
//обнуляем указателя на след и пред
first->next = NULL;>prev = NULL;
//последний он же будет и первым= first;
//увеличиваем размер++;
}
//если список не пуст{
//выделяем память_user_data *temp = new node_user_data();
//записываем данные>data = pdata;
//указатель на след теперь указываем на первый
temp->next = first;
//предыдущего нет>prev = NULL;
//указатель на предыдущий первого элемента указывает на новый элемент>prev=temp;
//новый элемент становится первым= temp;
//увеличиваем размер++;
};
}
//добавление в конец спискаadd_back(user_data pdata) {
//если список пуст(size == 0) {
//выделяем память= new node_user_data();
//записываем данные>data = pdata;
//указатели на пред и след не существуют
last->next = NULL;>prev = NULL;
//первый он же последний= last;
//увеличиваем размер++;
}
//если список не пуст
else {
//выделяем память_user_data *temp = new node_user_data();
//записываем данные>data = pdata;
//указатель на предыдущий нового элемента указывает на последний элемент>prev = last;
//указатель на след нового элемента пуст>next = NULL;
//указатель на следующий последнего указывает теперь на новый элемент>next = temp;
//новый элемент теперь последний= temp;
//увеличиваем размер++;
};
}
//функция для удаления по индексуrem(int index) {
//если удалять нечего, то выводи на экран предупреждение
if(size == 0) {("Списокпуст!\n");
system("pause");
//если удаляем первый элемент
} else if(index == 1 && index!= size) {
//запоминаем его указатель_user_data *temp = first;
//снимаем связанный с первым элементом указатель на предыдущий>next->prev = NULL;
//теперь первый элемент - это следующий за первым= first->next;
//удаляем запомненный первый элементtemp;
//уменьшаем размер-;
//если удаляем последний, то примерно тоже самое происходит
} else if(index == size && index!=1) {_user_data *temp = last;>prev->next = NULL;= last->prev;
delete temp;-;
//если удаляем элемент, который является единственным в списке
} else if(index == size && index == 1) {
//просто удаляемfirst;
//обнуляем указатели на первый и последний элементы
first = NULL;= NULL;
//уменьшаем размер-;
//если удаляем из середины списка
} else if(index > 1 && index < size) {
node_user_data *current = first;
//в цикле проходим от начала списка до нужного места
for(int i=1; i<index; i++) {
current = current->next;
}
//обнуляем связанные с элементно указатели
current->prev->next = current->next;>next->prev = current->prev;
//удаляем элементcurrent;
//уменьшаем размер-;
};
}
//функция получение элемента из списка
user_data&get(int index) {_user_data *current = first;
//проходим по циклу до нужного элемента
for(int i=0; i<index; i++) {= current->next;
}
//возвращаем содержимое узлаcurrent->data;
}
//размер спискаget_size() {
//возвращаем размер списка;
}
//функция распечатки() {
//если размер равен 0, то выводим предупреждение
if(size == 0) {("cls");("Списокпуст!\n");
} else {
//иначе рисуем красивую таблицу, проходясь в цикле по всему списку
node_user_data *current = first;i = 1;("cls");(" # | %-15s | %-15s | %-6s | %-10s |\n", "Логин", "Пароль", "Права", "Активность");("-----|-----------------|-----------------|--------|------------|\n");(current != NULL) {_data user = current->data;(" %-3d | %-15s | %-15s | %-6s | %-10s\n", i, user.login, user.password, user.rights,.active ? "Да": "Нет");++;= current->next;
}("-----|-----------------|-----------------|--------|------------|\n");
}
}
//функция очистки спискаclear() {
//если есть что очищать(size > 0) {
//в цикле вызываем функцию удаления по индексу
for(int i=1; i<=size; i++) {(i);
}
}
}
};
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <Windows.h>
#include <direct.h>
#include "student.h"
#include "user_data.h"
#include "student_list.h"
#include "user_data_list.h"
//объявление списка со студентами_list stud_list;
//выбор имени файла* choose_file();
//чтение списка со студентами из файла
void read_file(char *filename);
//запись списка со студентами в файл
void write_file(char *filename);
//функция для добавления студента в списокadd_student();
//изменение студента из списка
voidchange_student();
//удаления_student();
//вывода на экран
voidprint_student();
//функция авторизации
boolauthorize(char *rights) {
//создание структуры с пользовательскими данными
user_data auth;
//инициализацияее.init(rights);
//ввод логина.enter_login();
//ввод пароля.enter_password();
//открытие файла с пользовательскими данными и вычисление его размера
FILE *file_user_data = fopen("users.bin", "rb");(file_user_data, 0, SEEK_END);num_users = ftell(file_user_data)/sizeof(user_data);(file_user_data, 0, SEEK_SET);(int i=0; i<num_users; i++) {
user_data user;
//чтение данных из файла
fread(&user, sizeof(user_data), 1, file_user_data);
//если совпадают логины, права доступа, пароли и запись не забанена, то закрываем файл и возвращаем true
if(strcmp(auth.login, user.login)==0 && strcmp(auth.rights, user.rights)==0
&&strcmp(auth.password, user.password)==0 && user.active == true) {(file_user_data);true;
}
}
//если цикл закончен, и совпадений не найдено, то закрываем файл и возвращаем false
fclose(file_user_data);false;
}menu_rule_users() {ch;k;number;_data user;_data_list user_list;_list.init();*file = fopen("users.bin", "rb");(file, 0, SEEK_END);size = ftell(file)/sizeof(user_data);(file, 0, SEEK_SET);(int i=0; i<size; i++) {(&user, sizeof(user_data), 1, file);_list.add_back(user);
};(file);{("cls");
printf("1) Добавить пользователя\n");("2) Удалить пользователя\n");("3) Забанить пользователя\n");("4) Просмотреть пользователей\n");
printf("0) Выход\n");(">: ");(stdin);("%c", &ch);(ch) {'1':("cls");("1) Администратор\n");("0) Пользователь\n");(">: ");(stdin);("%c", &k);(k=='1') {.init("admin");
} else {.init("user");
}.enter_login();.enter_password();_list.add_back(user);;'2':{_list.print();
printf("Введите номер удаляемого элемента или 0 для выхода\n");
printf(">: ");(stdin);("%c", &k);= atoi(&k);(number != 0) {(number > 1 && number <= user_list.get_size()) {_list.rem(number);
};
};
} while(number != 0);;'3':{_list.print();
printf("Введите номер пользователя для изменения статуса или 0 для выхода\n");
printf(">: ");(stdin);("%c", &k);= atoi(&k);(number != 0) {(number > 1 && number <= user_list.get_size()) {_list.get(number-1).active = !user_list.get(number-1).active;