Курсовая работа (т): Автоматизация процесса начисления стипендий

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

//выделяем память= 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;

Источник: https://www.bibliofond.ru/detail.aspx?id=791927