Автоматизация процесса начисления стипендий

Простые структуры для работы с пользователями и студентами. Описание пользовательских функций приложения. Алгоритм добавления информации о студентах в начало двусвязного списка. Удаление и фильтрация информации. Функция 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.