МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ
УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ «БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ»
КАФЕДРА: Экономической информатики
ФАКУЛЬТЕТ:
Инженерно-экономический
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовому проекту по курсу: «Основы конструирования программ»
НА
ТЕМУ: «Автоматизация процесса начисления стипендий»
МИНСК 2014
ЗАДАНИЕ К КУРСОВОМУ ПРОЕКТУ
Создать файл, содержащий сведения о результатах
сдачи студентами сессии. Структура записи: номер группы, ФИО, оценки по 3
предметам, признак участия в общественной работе: 1 -активное участие, 0 -
неучастие. Программа должна начислять студентам группы Х стипендию. При этом:
отличники и общественники получают 50% надбавки, а просто отличники получают 25%.
Студент-общественник с одной тройкой также получает стипендию.
ВВЕДЕНИЕ
Язык Си, созданный Денисом Ритчи в начале 70-х годов в Bell Laboratory американской корпорации AT&T, является одним из универсальных языков программирования. Язык Си считается языком системного программирования, хотя он удобен и для написания прикладных программ.
Среди преимуществ языка Си следует отметить переносимость программ на компьютеры различной архитектуры и из одной операционной системы в другую, лаконичность записи алгоритмов, логическую стройность программ, а также возможность получить программный код, сравнимый по скорости выполнения с программами, написанными на языке ассемблера. Последнее связано с тем, что хотя Си является языком высокого уровня, имеющим полный набор конструкций структурного программирования, он также обладает набором низкоуровневых средств, обеспечивающих доступ к аппаратным средствам компьютера. Си предлагает следующие важные особенности:
простую языковую базу, из которой вынесены в библиотеки многие существенные возможности, вроде математических <#"791927.files/image001.gif">
Рисунок 4.1 - Блок-схема алгоритма добавления
элемента в начало двусвязного списка
4.2 Алгоритм удаления информации о
студенте из двусвязного списка по индексу
Данный алгоритм реализуется в виде функции
voidrem(intindex).
void rem(int index) {(size == 0) {("Списокпуст!\n");("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;-;
} else if(index == size && index == 1) {first;= NULL;= NULL;-;
} else if(index > 1 && index < size) {*current = first;(int i=1; i<index; i++) {= current->next;
}>prev->next = current->next;>next->prev = current->prev;
delete current;-;
};
}
Сперва проверяется размерность списка. Если список пуст, то на экран выводится предупреждение. Если список не пуст, то следует проверка, удаляется ли первый элемент. Если это так, то необходимы следующие действия:
указатель на временный узел инициализируется указателем на первый узел;
снимается связанный с первым элементом указатель на предыдущий;
далее назначается первым элементом следующий за ним элемент;
удаляется временный элемент;
размер уменьшается на единицу.
Если предыдущее условие не выполняется, то следует проверка на удаление последнего элемента. Если она выполняется, то:
указатель на временный элемент инициализируется указателем на последний узел;
снимается связанный с последним элементом указатель наследующий;
далее назначается последним элементом идущий перед ним элемент;
удаляется временный элемент;
размер уменьшается на единицу.
Если предыдущее условие не выполняется, то происходит проверка на удаление единственного элемента из списка. Если это так, то:
удаляется первый элемент;
указатель на первый элемент приравнивается NULL;
указатель на последний элемент приравнивается NULL;
размер уменьшается на единицу.
Если и это условие не выполняется, то происходит проверка, удаляется ли элемент из середины списка. Если условие выполняется, то необходимы следующие действия:
указатель на текущий узел инициализируется первым;
в цикле от i=1 до i<index с шагом инкрементации, равным единице, перемещаемся по списку через указатель на следующий узел от текущего;
обнуляем связанные с элементов указатели;
удаляем текущий узел;
уменьшаем размер на единицу.
Если условие не выполняется, то функция
прекращает свою работу.
Рисунок 4.2 - Алгоритм удаления записи из
двусвязного списка по индексу
4.3 Алгоритм фильтрации данных о
студентах по имени
Данный алгоритм реализуется с помощью функции
voidfilter_name().
void filter_name() {(size == 0) {("cls");("Списокпуст!\n");
} else {*current = first;i = 1;s;.enter_name();("cls");(" # | Группа | ФамилияИмяОтчество | О.1 | О.2 | О.3 | Соц |\n");("----|--------|-------------------------------------|-----|-----|-----|-----|\n");(current != NULL) {stud = current->data;(strcmp(s.name, stud.name)==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");
}
};
Рисунок 4.3 - Алгоритм фильтрации данных о
студентах по имени
Сперва проверяется, пустой список или нет. Если пустой, то выводится предупреждение, если нет, выполняется следующая последовательность действий:
значению текущего узла присваивается указатель на первый узел;
вводится переменная i, равная единице;
объявляется структура s типа student;
вызывается функция для ввода пользователем имени студента;
выводится на экран шапка таблицы;
при помощи цикла происходит проход по списку, если имя записи совпадает с введённым, то запись попадает в таблицу;
наращивается счётчик i на единицу происходит перемещение по списку через указатель на следующий узел;
выводится окончание таблицы.
5. ОПИСАНИЕ ПРОГРАММЫ
Прежде всего, чтобы начать работы с системой, мы должны выполнить авторизацию. Для этого предназначена функция authorize, которая принимает параметры права (пользователь либо администратор) и предлагает ввести логин и пароль. Далее сверка с данными в файле. В случае, если пользователь не забанен и такие данные существуют, то открывается доступ к работе с данными. Если же эти условия не выполняются, то выводится сообщение о том, что данные введены неправильно. В данной программе содержится 2 типа пользователей: обычные пользователи и администратор. В дальнейшем, всё зависит от прав, пользователь имеет возможность выполнять либо набор обычного пользовательского функционала, предоставленного пользовательским меню (выбрать файл для работы с данными, просмотреть все записи, выполнить задачу, поиск и фильтрация данных, выход из учётной записи), либо набор администраторского функционала, предоставляемого меню администратора (выбрать файл для работы с данными, добавить запись, отредактировать запись, удалить запись, посмотреть все записи, поиск и фильтрация данных, управление пользователями, выход из учётной записи).
Первое и второе меню первым пунктом предлагают выбрать файл для работы. Для этого необходима функция char* choose_file(), она открывает имеющийся с таким именем файл или создаёт новый файл с указанным именем. При помощи двух двусвязных списков, хранящих информацию о студентах и пользователях, происходит взаимодействие данных с файлом. За счёт реализованных в списках функций есть возможность добавлять, удалять, редактировать, фильтровать записи, получать данные и размер списка, очищать список и другое. Сами же эти функции описаны внутри структуры, которая описывает сам список.
Главным пунктом меню стоит считать пункт «Выполнить задачу», так как именно он решает поставленную задачу. Для выполнения этого пункта реализована функция void complete_target(). Она работает со списком имеющихся студентов, определённых степенью активности и группой, высчитывает средний балл из трёх имеющихся и в зависимости от этого начисляет стипендию в том или ином размере.
Логику программы можно разделить на следующие блоки: по праву - работа администратора и работа пользователя, по данным - работа с пользователями и работа со студентами.
Для работы с администраторами и пользователями имеется файл, разграничивающий их возможности и права, а также методы, характерные для каждого из доступов.
Для работы со студентами и пользователями реализованы 2 различные структуры, хранящие данные о тех и других, и два двусвязных списка, хранящих информацию о наборах первых и вторых. Оба списка поддерживают практически одинаковый набор функций: добавление в начало, конец, очистка, удаление, получение данных, печать и др.
При запуске программы пользователю предлагается
сперва предлагается три варианта: войти как администратор, войти как
пользователь, выход.
Рисунок 5.1 - Меню первого уровня
Рассмотрим случай выбора работы в качестве
администратора. После ввода логина и пароля в случае нахождения таковых в файле
предлагается выбрать файл для работы с данными.
Рисунок 5.2 - Выбор файла для работы
В результате на экране появится меню с
функционалом, доступным администратору.
Рисунок 5.3 - Меню администратора
При выборе добавления записи последовательно предлагает ввести Ф.И.О., номер группы, три отметки и определить, является ли студент активистом. После этого администратор вновь выходит в меню.
Выберем просмотр всех записей. На экране
появилась табличка с добавленным ранее пользователем.
Рисунок 5.4 - Вывод данных на экран
Далее добавим ещё одного студента с неактивной
общественной позицией и выберем пункт меню «Фильтрация и поиск», в качестве
параметра поиска будем принимать неактивных студентов группы 222223. В результате
на экране появится таблица с добавленным нами пользователем.
Рисунок 5.5 - Фильтрация и поиск данных
При этом при выводе всех студентов на экран
получим следующую таблицу:
Рисунок 5.6 - Вывод данных о студентах
Если мы войдём в систему в качестве
пользователя, воспользуемся уже заполненным файлом и решим узнать о стипендиях,
то в группе 111112 будут следующие данные начисления стипендии:
Рисунок 5.7 - Начисление стипендии студентам
При попытке работы с другим файлом на экране
появлялось сообщение о том, что список пуст. В случае неверного ввода логина
или пароля система также не позволяла работать с ней.
ЗАКЛЮЧЕНИЕ
Итог данной работы - это функционирующее приложение, с помощью которого автоматизируется процесс начисления академической стипендии студентам.
Программа удовлетворяет поставленным изначально условиям: реализована возможность работы двух видов пользователей с разным уровнем прав и доступа (администратор и обычный пользователь), при этом поддерживается авторизация пользователей с вводом логина и пароля, пароль шифруется; использована работа с файлами (чтение, запись); в программе используются структуры для описания сущностей, а также двусвязные списки для работы с набором данных; имеются меню нескольких уровней; используются встроенные функции для работы со строками; предусмотрена обработка ситуаций ввода неверных данных. Данные выводятся на экран в виде таблицы, код оформлен в соответствии с Code Convension.
Решена задача, поставленная в условии:
формируется список студентов для начисления стипендии, зависящей от их учебных
достижений и общественной активности. Интерфейс программы поддерживает русский
язык.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Кормен, Т. Алгоритмы: учебник / Т. Кормен [и др.].: Москва - Санкт-Петербург - Киев 2005. - 1290 с.
2. С. Панасенко - Алгоритмы шифрования - СПб.: БХВ-Петербург, 2009
. Дейтел, П. Дж. Как програмировать на Си / учебник: Бином-Пресс, 2009. - 994 с.
. Б. Керниган, Д. Ритчи - Язык программирования Си - Вильямс, 2009
. Р. Хэзфилд - Искусство программирования на С- Диа-Софт, 2001
6. Wikipedia [Электронный ресурс]. - <#"791927.files/image011.gif">
Рисунок 1 - Блок-схема алгоритма добавления
элемента в начало двусвязного списка
Рисунок 2 - Алгоритм удаления записи из
двусвязного списка по индексу
Рисунок 3 - Алгоритм фильтрации данных о
студентах по имени
ПРИЛОЖЕНИЕ Б
Листинг кода
#pragma once
//структура с данными о студенте
{
//группаgroup[7];
//фиоname[35];
//3 оценки[3];
//активист или нетsocial;
//функция изменения информации о студенте
void change() {
char symbol;
do {
//вывод на экран текущих данных("cls");(" Группа | Фамилия Имя Отчество | О.1 | О.2 | О.3 | Соц |\n");
printf("--------|-------------------------------------|-----|-----|-----|-----|\n");(" %6s | %35s | %3d | %3d | %3d | %3s |\n", group, name, mark[0], mark[1], mark[2], social?"Да":"Нет");("--------|-------------------------------------|-----|-----|-----|-----|\n\n");
//меню("1) Изменить Ф.И.О.\n");
printf("2) Изменить группу\n");("3) Изменить оценки\n");("4) Изменить социальную активность\n");("0) Вернуться в главное меню\n");
printf(">: ");(stdin);("%c", &symbol);
//просто вызов соответствующих функций ввода информации
switch(symbol) {'1':_name();;'2':_group();;'3':_mark();;'4':_social();;:;
}
} while(symbol != '0');
}
//вводФИОenter_name() {("cls");("ВведитеФ.И.О.\n");
printf(">: ");(stdin);
//используем для того, чтобы не набрать больше 35 символов
gets_s(name, 35);(name, name);
}
//ввод группыenter_group() {{("cls");("Введите группу\n");
printf(">: ");(stdin);
//тоже самое с fgets, не больше 7 символов
fgets(group, 7, stdin);[strlen(group)]='\0';
//проверка на длину
if(strlen(group)>=6) {
break;
}
} while(true);
}
//ввод оценкиenter_mark() {("cls");
//циклна 3 оценки(int i=0; i<3; i++) {
do{("Введите оценку #%d", (i+1));
printf(">: ");(stdin);("%d", &mark[i]);
//проверка что больше или равно 4 и меньше или равно 10
if(mark[i] >= 4 && mark[i] <= 10) {;
}
} while(true);
}
}
//ввод активист или нетenter_social() {symbol;{("cls");("1) Активист\n");
printf("0) Не активист\n");(">: ");
fflush(stdin);("%c", &symbol);(symbol) {'1':= true;='\0';;'0':= false;='\0';;:;
}
} while(symbol!='\0');
}
};
#pragma once
#include "student.h"
#define MIN_INCOME 400000
//узел списка, двусвязногоnode {
//данные узлаdata;
//указатель на предыдущий*prev;
//указатель на следующий*next;
};student_list {
//указатель на первый элемент*first;
//указатель на последний элемент*last;
//размерсписка;
//функция для начальной инициализации
void init() {= 0;= NULL;
last = NULL;
}
//добавление в начало списка
void add_front(student pdata) {
//если список пуст(size == 0) {