Автоматизация процесса начисления стипендий
Простые структуры для работы с пользователями и студентами. Описание пользовательских функций приложения. Алгоритм добавления информации о студентах в начало двусвязного списка. Удаление и фильтрация информации. Функция void menu-user. Листинг кода.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 16.12.2014 |
Размер файла | 1,7 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
temp->prev = last;
//указатель на след нового элемента пуст
temp->next = NULL;
//указатель на следующий последнего указывает теперь на новый элемент
last->next = temp;
//новый элемент теперь последний
last = temp;
//увеличиваем размер
size++;
};
}
//функция для удаления по индексу
void rem(int index) {
//если удалять нечего, то выводи на экран предупреждение
if(size == 0) {
printf("Списокпуст!\n");
system("pause");
//если удаляем первый элемент
} else if(index == 1 && index!= size) {
//запоминаем его указатель
node_user_data *temp = first;
//снимаем связанный с первым элементом указатель на предыдущий
first->next->prev = NULL;
//теперь первый элемент - это следующий за первым
first = first->next;
//удаляем запомненный первый элемент
delete temp;
//уменьшаем размер
size--;
//если удаляем последний, то примерно тоже самое происходит
} else if(index == size && index!=1) {
node_user_data *temp = last;
last->prev->next = NULL;
last = last->prev;
delete temp;
size--;
//если удаляем элемент, который является единственным в списке
} else if(index == size && index == 1) {
//просто удаляем
delete first;
//обнуляем указатели на первый и последний элементы
first = NULL;
last = NULL;
//уменьшаем размер
size--;
//если удаляем из середины списка
} 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;
current->next->prev = current->prev;
//удаляем элемент
delete current;
//уменьшаем размер
size--;
};
}
//функция получение элемента из списка
user_data&get(int index) {
node_user_data *current = first;
//проходим по циклу до нужного элемента
for(int i=0; i<index; i++) {
current = current->next;
}
//возвращаем содержимое узла
return current->data;
}
//размер списка
int get_size() {
//возвращаем размер списка
returnsize;
}
//функция распечатки
voidprint() {
//если размер равен 0, то выводим предупреждение
if(size == 0) {
system("cls");
printf("Списокпуст!\n");
} else {
//иначе рисуем красивую таблицу, проходясь в цикле по всему списку
node_user_data *current = first;
int i = 1;
system("cls");
printf(" # | %-15s | %-15s | %-6s | %-10s |\n", "Логин", "Пароль", "Права", "Активность");
printf("-----|-----------------|-----------------|--------|------------|\n");
while(current != NULL) {
user_data user = current->data;
printf(" %-3d | %-15s | %-15s | %-6s | %-10s\n", i, user.login, user.password, user.rights,
user.active ? "Да": "Нет");
i++;
current = current->next;
}
printf("-----|-----------------|-----------------|--------|------------|\n");
}
}
//функция очистки списка
void clear() {
//если есть что очищать
if(size > 0) {
//в цикле вызываем функцию удаления по индексу
for(int i=1; i<=size; i++) {
rem(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"
//объявление списка со студентами
student_list stud_list;
//выбор имени файла
char* choose_file();
//чтение списка со студентами из файла
void read_file(char *filename);
//запись списка со студентами в файл
void write_file(char *filename);
//функция для добавления студента в список
void add_student();
//изменение студента из списка
voidchange_student();
//удаления
voiddelete_student();
//вывода на экран
voidprint_student();
//функция авторизации
boolauthorize(char *rights) {
//создание структуры с пользовательскими данными
user_data auth;
//инициализацияее
auth.init(rights);
//ввод логина
auth.enter_login();
//ввод пароля
auth.enter_password();
//открытие файла с пользовательскими данными и вычисление его размера
FILE *file_user_data = fopen("users.bin", "rb");
fseek(file_user_data, 0, SEEK_END);
int num_users = ftell(file_user_data)/sizeof(user_data);
fseek(file_user_data, 0, SEEK_SET);
for(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) {
fclose(file_user_data);
return true;
}
}
//если цикл закончен, и совпадений не найдено, то закрываем файл и возвращаем false
fclose(file_user_data);
return false;
}
void menu_rule_users() {
char ch;
char k;
int number;
user_data user;
user_data_list user_list;
user_list.init();
FILE *file = fopen("users.bin", "rb");
fseek(file, 0, SEEK_END);
int size = ftell(file)/sizeof(user_data);
fseek(file, 0, SEEK_SET);
for(int i=0; i<size; i++) {
fread(&user, sizeof(user_data), 1, file);
user_list.add_back(user);
};
fclose(file);
do {
system("cls");
printf("1) Добавить пользователя\n");
printf("2) Удалить пользователя\n");
printf("3) Забанить пользователя\n");
printf("4) Просмотреть пользователей\n");
printf("0) Выход\n");
printf(">: ");
fflush(stdin);
scanf("%c", &ch);
switch(ch) {
case '1':
system("cls");
printf("1) Администратор\n");
printf("0) Пользователь\n");
printf(">: ");
fflush(stdin);
scanf("%c", &k);
if(k=='1') {
user.init("admin");
} else {
user.init("user");
}
user.enter_login();
user.enter_password();
user_list.add_back(user);
break;
case '2':
do {
user_list.print();
printf("Введите номер удаляемого элемента или 0 для выхода\n");
printf(">: ");
fflush(stdin);
scanf("%c", &k);
number = atoi(&k);
if(number != 0) {
if(number > 1 && number <= user_list.get_size()) {
user_list.rem(number);
};
};
} while(number != 0);
break;
case '3':
do {
user_list.print();
printf("Введите номер пользователя для изменения статуса или 0 для выхода\n");
printf(">: ");
fflush(stdin);
scanf("%c", &k);
number = atoi(&k);
if(number != 0) {
if(number > 1 && number <= user_list.get_size()) {
user_list.get(number-1).active = !user_list.get(number-1).active;
};
};
} while(number != 0);
break;
case '4':
user_list.print();
system("pause");
break;
default:
break;
};
} while(ch!='0');
file = fopen("users.bin", "wb");
for(int i=0; i<user_list.get_size(); i++) {
user = user_list.get(i);
fwrite(&user, sizeof(user_data), 1, file);
};
fflush(file);
fclose(file);
};
//меню админа
void menu_admin() {
char ch;
char k;
char filename[25];
//выбор файла начальный
strcpy(filename, choose_file());
//чтениеизфайла
read_file(filename);
do
{
//простое меню
system("cls");
printf("Работа происходит с файлом %s\n", filename);
printf("1) Выбрать файл для работы с данными\n");
printf("2) Добавить запись\n");
printf("3) Отредактировать запись\n");
printf("4) Удалить запись\n");
printf("5) Просмотреть все записи\n");
printf("6) Поиск и фильтрация данных\n");
printf("7) Управление пользователями\n");
printf("0) Выход из учетной записи\n");
printf(">: ");
fflush(stdin);
scanf("%c", &ch);
switch (ch)
{
case '1':
//если выбрали изменить файл, то записываем изменения в старый
write_file(filename);
//выбираем новый
strcpy(filename, choose_file());
//читаем данные из нового
read_file(filename);
if(filename) {
printf("Файлуспешнооткрыт!\n");
system("pause");
} else {
Printf ("Возникли проблемы с файлом. Попробуйте снова!\n");
system("pause");
}
break;
//во всех других случаях вызов соответствующих функций
case '2':
add_student();
break;
case '3':
change_student();
break;
case '4':
delete_student();
break;
case '5':
print_student();
break;
case '6':
do {
system("cls");
printf("1) Отфильтровать по социальной активности\n");
printf("2) Отфильтровать по активности в группе\n");
printf("3) Найти студентов-активистов-отличников\n");
printf("0) Выйти\n");
printf(">: ");
fflush(stdin);
scanf("%c", &k);
switch(k) {
case '1':
stud_list.filter_soc();
system("pause");
break;
case '2':
stud_list.filter_soc_group();
system("pause");
break;
case '3':
stud_list.filter_soc_excellent();
system("pause");
break;
default:
break;
};
} while(k!='0');
break;
case '7':
menu_rule_users();
break;
default:
break;
}
} while (ch!='0');
//запись изменений при выходе из меню
write_file(filename);
}
//меню пользователя
void menu_user() {
char ch;
char k;
char filename[25];
//выбор файла начальный
strcpy(filename, choose_file());
//чтение из файла
read_file(filename);
do
{
//простое меню
system("cls");
printf("Работа происходит с файлом %s\n", filename);
printf("1) Выбрать файл для работы с данными\n");
printf("2) Просмотреть все записи\n");
printf("3) Выполнить задачу\n");
printf("4) Поиск и фильтрация данных\n");
printf("0) Выход из учетной записи\n");
printf(">: ");
fflush(stdin);
scanf("%c", &ch);
switch (ch)
{
case '1':
//если выбрали изменить файл, то записываем изменения в старый
write_file(filename);
//выбираем новый
strcpy(filename, choose_file());
//читаем данные из нового
read_file(filename);
if(filename) {
printf("Файлу спешно открыт!\n");
system("pause");
} else {
Printf ("Возникли проблемы с файлом. Попробуйте снова!\n");
system("pause");
}
break;
//во всех других случаях вызов соответствующих функций
case '2':
print_student();
break;
case '3':
stud_list.complete_target();
system("pause");
break;
case '4':
do {
system("cls");
printf("1) НайтипоФ.И.О.\n");
printf("2) Отфильтровать по группе\n");
printf("3) Найти по Ф.И.О. и группе\n");
printf("0) Выйти\n");
printf(">: ");
fflush(stdin);
scanf("%c", &k);
switch(k) {
case '1':
stud_list.filter_name();
system("pause");
break;
case '2':
stud_list.filter_group();
system("pause");
break;
case '3':
stud_list.filter_name_group();
system("pause");
break;
default:
break;
};
} while(k!='0');
break;
default:
break;
}
} while (ch!='0');
//запись изменений при выходе из меню
write_file(filename);
}
int main() {
setlocale(LC_ALL, "Russian");
char symbol;
do
{
//меню первого уровня
system("cls");
printf("1) Войти как администратор\n");
printf("2) Войти как пользователь\n");
printf("0) Выход\n");
printf(">: ");
scanf("%c", &symbol);
switch(symbol)
{
case '1':
//если авторизация прошла, то меню админа, иначе предупреждение
if(authorize("admin")) {
menu_admin();
} else {
system("cls");
printf("Проверьте комбинацию логина и пароля!\n");
system("pause");
}
break;
case '2':
//если авторизация прошла, то меню админа, иначе предупреждение
if(authorize("user")) {
menu_user();
} else {
system("cls");
printf("Проверьте комбинацию логина и пароля!\n");
system("pause");
}
break;
default:
break;
}
} while (symbol!='0');
}
//выбор имени файла
char* choose_file() {
char filename[25];
system("cls");
printf("Введите название файла. Если такого файла не существует, то будет создан новый!\n");
printf("Максимальная длина имени файла 25 символов!\n");
printf(">: ");
fflush(stdin);
//fgets для контроля переполнения
fgets(filename, 25, stdin);
filename[strlen(filename)-1]='\0';
//открываем файл для дозаписи, если его не было, то он будет создан
FILE *file = fopen(filename, "ab");
fclose(file);
//возвращаем имя файла
return filename;
}
//чтение данных из файла
void read_file(char *filename) {
//открытие файла
FILE *file = fopen(filename, "rb");
//очистка списка
stud_list.clear();
//инициализация после очистки
stud_list.init();
//вычисление количества записей в файле
fseek(file, 0, SEEK_END);
int size = ftell(file)/sizeof(student);
fseek(file, 0, SEEK_SET);
for(int i=0; i<size; i++) {
student stud;
//чтение из файла
fread(&stud, sizeof(student), 1, file);
//добавление в список
stud_list.add_back(stud);
}
//закрытие файла
fclose(file);
}
//запись в файл
void write_file(char *filename) {
//открытие для записи с уничтожением содержимого
FILE *file = fopen(filename, "wb");
for(int i=1; i<=stud_list.get_size(); i++) {
//"достаемэлементизспсика"
student stud = stud_list.get(i);
//записываем его в файл
fwrite(&stud, sizeof(student), 1, file);
}
//закрываем файл
fflush(file);
fclose(file);
}
//добавление студента
void add_student() {
//создание новой структуры
student stud;
//вызов функций ввода из этой структуры
stud.enter_name();
stud.enter_group();
stud.enter_mark();
stud.enter_social();
//добавление структуры в список
stud_list.add_back(stud);
}
//изменение студента
void change_student() {
int number;
do{
//вывод списка на экран
stud_list.print();
//ввод номера студента для изменения
printf("Введите номер студента для изменения. 0 - для выхода\n");
printf(">: ");
fflush(stdin);
scanf("%d", &number);
//проверка не вылезает ли он за рамки
if(number < 0 || number > stud_list.get_size()) {
printf("Неверный выбор!\n");
system("pause");
} else if (number != 0) {
//если мы не ввели 0, то вызываем функцию изменения студента из структуры со списком
stud_list.change(number);
}
} while(number!=0);
}
//удаление студента
voiddelete_student() {
intnumber;
//все тоже самое, что и в изменении, только вызывается функция не изменения, а удаления
do{
stud_list.print();
printf("Введите номер студента для удаления. 0 - для выхода\n");
printf(">: ");
fflush(stdin);
scanf("%d", &number);
if(number < 0 || number > stud_list.get_size()) {
printf ("Неверный выбор!\n");
system("pause");
} else if (number != 0) {
stud_list.rem(number);
}
} while(number!=0);
}
//вывод на экран
voidprint_student() {
//вызов функции вывода на экран из структуры со списком
stud_list.print();
system("pause");
}
Размещено на Allbest.ru
Подобные документы
Определение назначения и описание функций дискового кэша как промежуточного буфера с быстрым доступом к информации. Процесс кэширования внешних накопителей. Построение алгоритма, описание интерфейса и разработка программы для работы с двусвязным списком.
курсовая работа [2,1 M], добавлен 21.01.2014Разработка базы данных "Студенты", которая позволяет производить операции с данными: регистрацию студентов в базе данных, а также удаление, изменение, резервное копирование информации о студентах. Алгоритм работы программы и вспомогательных процедур.
курсовая работа [27,5 K], добавлен 06.02.2013Изучение синтаксиса пользовательских функций. Разработка приложения для вычисления параметров системы управления запасами. Синтаксис элемента "Список аргументов функции". Основные правила написания программного кода. Основные операторы языка VBA.
лабораторная работа [119,0 K], добавлен 22.09.2016Создание баз хозяйственных договоров, банков и членов временных трудовых коллективов в среде разработки Delphi. Логическая структура линейного двусвязного списка. Способ упорядочения и алгоритм сортировки списка. Руководство пользования программой.
курсовая работа [749,4 K], добавлен 14.02.2016Назначение программного модуля (базы данных). Разработка информационной базы данных для колледжа. Поиск пользователями информации о преподавателях и дисциплинах. Анализ входной и выходной информации. Разработка алгоритма работы программы-приложения.
реферат [513,1 K], добавлен 22.10.2012Структура записей входного массива. Описание основных типов данных. Алгоритм программы: присвоение начальных значений переменных, чтение списка из файла, вывод данных на экран, выполнение обработки данных, сохранение списка в файл. Листинг программы.
курсовая работа [325,2 K], добавлен 28.12.2012Расположение элементов списка в памяти. Информация о полях структуры TMember. Логическая структура двусвязного кольцевого списка. Логические схемы наиболее важных операций со списками. Алгоритмы обработки основных структур. Руководство пользователя.
курсовая работа [2,3 M], добавлен 27.08.2012Понятие класса как собрания информации, которая включает в себя данные и функции. Создание класса "Дек". Реализация методов: добавления элемента в начало и в конец дека, удаление элемента из начала и конца дека, проверка дека на наличие в нем элементов.
курсовая работа [568,9 K], добавлен 08.09.2010Разработка базы данных для просмотра информации о производимой предприятием продукции и сведений о клиентах. Концептуальный прототип и средства защиты справочной информации. Логическая и физическая организация функций и область применения приложения.
курсовая работа [3,3 M], добавлен 23.09.2010Реализация проекта по оптимизации отделений почтовой связи. Направления деятельности в области кадровой политики. Автоматизация обработки получаемой техническим отделом информации. Разработка приложения клиент-сервер. Описание клиентского приложения.
курсовая работа [34,3 K], добавлен 07.08.2013