Курсовая ОКП. Курсовая. Курсовая работа По курсу Основы конструирования программ
Скачать 74.68 Kb.
|
Учреждение образования БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ Кафедра экономической информатики Курсовая работа По курсу «Основы конструирования программ» Выполнила Гр. Специальность: Минск Содержание 1. Введение 3 2. Теоретическая часть 4 3. Описание организации структур хранимых данных 11 4. Создание пользовательских функций приложения 11 5. Функциональная схема задачи, схемы алгоритмов работы двух функций 11 6. Описание программы 11 7. Заключение 11 8. Список использованных источников 11 9. Приложение 11 Задание Тема курсовой работы Учет абонентов сети Velcom Создать программу (консольный режим), выполнив функциональное разбиение, реализующую следующие функции работы с бинарным/текстовым файлом. Предусмотреть создание меню 1-го уровня со следующими пунктами: Вход под администратором Вход под пользователем Выход Учетные записи администратора и обычного пользователя должна содержать логин и пароль. Сведения об учетных записях должны храниться в отдельном файле, желательно предусмотреть механизм шифрования/дешифрования логинов/паролей. Меню 2-го уровня: Для администратора: Создание/открытие файла с данными Добавление записи Редактирование записи Удаление записи Просмотр всех данных в табличной форме Различные процедуры поиска и фильтрации данных Управление пользователями Выход в меню 1-го уровня Для обычного пользователя: Открытие файла с данными Просмотр всех данных в табличной форме Различные процедуры поиска и фильтрации данных Выход в меню 1-го уровня Введение Целью данной курсовой работы является демонстрация знаний о процессах и основных технологиях разработки программ, о информации, информационных процессах и технологиях, о значениях информационных технологий и вычислительной техники в развитии современного общества. Данная работа состоит из теоретической и практической части. В соответствии с заданием контрольной работы необходимо решить задачу и раскрыть теоретический вопрос. А так же составить схему, описать решение задачи. В данной работе раскрываются следующие вопросы: Определение алгоритма. Свойства алгоритмов. Способы описания алгоритма. Базовые структуры схем алгоритма. Структурированные схемы и их построение. Теоретическая часть Определение алгоритма. Алгоритм-конечная последовательность команд исполнителю для выполнения некоторой работы или решения задачи. Создание алгоритма доступно исключительно живым существам, а долгое время считалось, что только человеку. Другое дело – реализация уже имеющегося алгоритма. Ее можно поручить субъекту или объекту, который не обязан вникать в существо дела, а возможно, и не способен его понять. Такой субъект или объект принять называть формальным исполнителем. Каждый алгоритм создается в расчете на вполне конкретного исполнителя. Те действия, которые может совершить исполнитель, называются его допустимыми действиями. Совокупность допустимых действий образуют систему команд исполнителя. Алгоритм должен содержать только те действия, которые допустимы для данного исполнителя. Свойства алгоритмов. Любой алгоритм должен обладать каждым из приведённых ниже свойств: Понятность алгоритма –все действия, описанные в алгоритме, должны быть понятны исполнителю. Исполнитель должен уметь их выполнять, т.е. эти действия должны входить в набор его действий. Т.о., предполагается, что исполнитель всегда знает, как использовать указания алгоритма. Массовость алгоритма –каждый алгоритм предполагает наличие некоторых исходных данных и приводит к получению определенного искомого результата. Массовость алгоритма состоит в том, что алгоритм служит не для решения какой-либо одной конкретной задачи, а для решения целого класса однотипных задач путем варьирования исходных данных. Определенность алгоритма –каждое действие алгоритма должно быть четко определено и однозначно выполнено, не оставляя места произволу. Алгоритм может быть сообщен другому исполнителю, и будет в точности выполнен. Конечность алгоритма –т.е. выполнение алгоритма завершается после конечного числа шагов. Дискретность –исполнение алгоритма должно распадаться на выполнение отдельных шагов. Выполнение следующего шага происходит только после выполнения предыдущего шага. Результативность алгоритма –т.е. завершение алгоритма за конечное число шагов и получение искомого результата. Сообщение о том, что алгоритм не имеет решения, тоже является результатом. Алгоритмом также называется информационный процесс, обладающий следующими свойствами: - Наличие исполнителя преобразований (с его системой команд). - Разбиение всего процесса преобразования на отдельные команды (понятные исполнителю). - Определено начальное состояние объекта (над которым производится преобразование) и его требуемое конечное состояние (цель преобразования). Способы описания алгоритма. Алгоритмы можно записывать не только при помощи слов. В настоящее время различают несколько способов описания алгоритмов: 1.Словесный способ, т.е. записи на естественном языке, описание словами последовательности выполнения алгоритма. Например: Записать алгоритм нахождения наибольшего общего делителя (НОД) двух натуральных чисел. Алгоритм может быть следующим: задать два числа; если числа равны, то взять любое из них в качестве ответа и остановиться, в противном случае продолжить выполнение алгоритма; определить большее из чисел; заменить большее из чисел разностью большего и меньшего из чисел; повторить алгоритм с шага № __. 2. Графический способ, т.е. с помощью блок-схем. Графический способ представления алгоритмов является более компактным и наглядным по сравнению со словесным способом. При графическом исполнении алгоритм изображается в виде последовательности связанных между собой блочных символов, каждый из которых соответствует выполнению одного из действий. Такое графическое представление называется схемой алгоритма или блок-схемой. В блок-схеме каждому типу действий (вводу исходных данных, вычислению значений выражений, проверке условий, управлению повторением действий, окончанию обработки и т.п.) соответствует геометрическая фигура, представленная в виде блочного символа. Блочные символы соединяются линиями переходов, определяющими очередность выполнения действий. Символы, наиболее часто употребляемые в блок-схемах. 3. Программный способ, т.е. тексты на языках программирования.
Базовые структуры схем алгоритма. Базовые структуры алгоритмов — это определенный набор блоков и стандартных способов их соединения для выполнения типичных последовательностей действий. Базовые структуры блок-схем. К основным структурам схем алгоритмов относятся: Следование; Ветвление (полное и не полное); Повторение (цикл с предусловием или постусловием); Вход; Выход. Следованием называются схемы алгоритмов, в которых действия осуществляются последовательно друг за другом. Стандартная блок-схема линейного алгоритма приводится ниже: Ветвлением называется схема алгоритма, в которой действие выполняется по одной из возможных ветвей решения задачи, в зависимости от выполнения условий. В отличие от линейных алгоритмов, в которых команды выполняются последовательно одна за другой, в разветвляющиеся алгоритмы входит условие, в зависимости от выполнения или невыполнения которого выполняется та или иная последовательность команд (действий). В качестве условия в разветвляющемся алгоритме может быть использовано любое понятное исполнителю утверждение, которое может соблюдаться (быть истинно) или не соблюдаться (быть ложно). Такое утверждение может быть выражено как словами, так и формулой. Таким образом, алгоритм ветвления состоит из условия и двух последовательностей команд. В зависимости от того, в обеих ветвях решения задачи находится последовательность команд или только в одной разветвляющиеся алгоритмы делятся на полные и не полные (сокращенные). Стандартные блок-схемы разветвляющегося алгоритма приведены ниже: Повторением называется схема алгоритма, в которой некоторая часть операций (тело цикла — последовательность команд) выполняется многократно. Однако слово «многократно» не значит «до бесконечности». Организация циклов, никогда не приводящая к остановке в выполнении алгоритма, является нарушением требования его результативности — получения результата за конечное число шагов. Перед операцией цикла осуществляются операции присвоения начальных значений тем объектам, которые используются в теле цикла. В цикл входят в качестве базовых следующие структуры: блок проверки условия блок, называемый телом цикла Каждая базовая структура имеет один вход и один выход. #define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include #include #include using namespace std; struct date { int day; int month; int year; int total; }; struct key { int day; int month; int year; int total; } key; struct Pair { char Name[30]; char Password[30]; char role[6]; }reg; int size1 = sizeof(Pair); struct TZap { char FIO[90]; char otdel[50]; char doljn[50]; struct date d; } Zap, Zap_n, x; TZap *mas_Z; int size = sizeof(TZap); int D_f, len, kol, search, i, j, m, R, L; FILE *Fz, *Ft; FILE *File; char File_Zap[] = "zapisi.dat"; char File_Rez[] = "rezult.txt"; char* autorization(char[]); void Admin_Mode(); void User_Mode(); void add_new_worker(int, int, int); void find_worker(); void view_file(); void sort_po_otdelam(); void sort_by_experience(); void delete_worker(); void view_all_users(); void Out(TZap, int); void QuickSort(int, int); void registration(); int in_m(FILE*, int size); void main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); char number; char NameOfFile[30], role[6]; cout << "-----------------Добро Пожаловать!------------------" << endl << endl; while (true) { cout << "1-Войти" << endl << "2-Выход" << endl; cout << "\nВыберите: "; cin >> number; switch (number){ case '1': cout << endl << "--------------Вы выбрали авторизацию----------------" << endl << endl; strcpy(NameOfFile, autorization(role)); if (strcmp(NameOfFile, "temp") == 0){ break; } if (strcmp(role, "admin") == 0){ strcpy(role, ""); cout << "\nАвторизация прошла успешно! Вы вошли как администратор." << endl << endl; Admin_Mode(); } else{ cout << "\nАвторизация прошла успешно! Вы вошли как пользователь." << endl << endl; User_Mode(); } break; case '2': return; case 'r': registration(); break; } } } //Регистрация пользователя/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void registration(){ int Kod, len, kol, i; Pair *mas; if ((File = fopen("pass.dat", "rb")) == NULL){ cout << "Ошибка открытия файла" << endl;; return; } /*Kod = fileno(File); len = filelength(Kod); kol = len / size1; */ kol=in_m(File, size1); mas = new Pair[kol]; for (i = 0; i < kol; i++) fread(mas + i, size1, 1, File); fclose(File); cout << "\nВведите имя: "; cin >> reg.Name; cout << "Введите пароль: "; cin >> reg.Password; cout << "Введите код(1 или 0): "; cin >> reg.role; for (i = 0; i < kol; i++) if (strcmp(reg.Name, mas[i].Name) == 0){ cout << "Данное имя занято, попробуйте другое." << endl << endl; return; } if (strcmp(reg.role, "1") == 0) { strcpy(reg.role, "admin"); cout << "\nВы зарегистрировали нового администратора - " << reg.Name << "\n••••••••••••••••••••••••••••••••••••••••••••\n" << endl; } else { strcpy(reg.role, "user"); cout << "\nВы зарегистрировали нового пользователя - " << reg.Name << "\n••••••••••••••••••••••••••••••••••••••••••••\n" << endl; } if ((File = fopen("pass.dat", "ab")) == NULL) { cout << "Ошибка создания файла" << endl; return; } fwrite(®, size1, 1, File); fclose(File); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// char* autorization(char role[]){ cout << "Введите имя пользователя:" << endl; int Kod, len, kol, i; Pair *mas, Regname; if ((File = fopen("pass.dat", "rb")) == NULL){ cout << "Ошибка открытия файла" << endl;; return NULL; } kol = in_m(File, size1); mas = new Pair[kol]; for (i = 0; i < kol; i++) fread(mas + i, size1, 1, File); fclose(File); cin >> Regname.Name; cout << "Введите пароль:" << endl; cin >> Regname.Password; for (i = 0; i < kol; i++) if ((strcmp(Regname.Name, mas[i].Name) == 0) && (strcmp(Regname.Password, mas[i].Password) == 0)){ strcpy(role, mas[i].role); delete[]mas; return Regname.Name; } cout << "Вы ввели неверный логин или пароль" << endl; delete[]mas; return "temp"; } /////////////////////////////////////////////////////////////////////////////////////////////////////////// void Admin_Mode() { int year, month, day, qqq = 1; cout << "Введите день: "; cin >> day; cout << "Введите месяц: "; cin >> month; cout << "Введите год: "; cin >> year; if ((day > 31) || (month > 12) || (year > 2020) || (day < 1) || (month < 1) || ((year < 1916))){ cout << "\nОпаньки, вы неправильно ввели дату!\n\n"; return Admin_Mode(); }; int kod; Ft = fopen(File_Rez, "w"); while (true) { cout << "\n------------------Выберите номер:-------------------" << endl; puts("\n1-Создание файла\n2-Зарегистрировать пользователя\n3-Просмотреть все учетные записи\n4-Добавить нового сотрудника\n5-Просмотреть всех сотрудников\n6-Поиск сотрудника\n7-Сортировка(по отделам)\n8-Сортировка(по стажу)\n9-Удаление сотрудника\n0-Выход\n"); scanf("%d", &kod); switch (kod) { case 0: fclose(Ft); return; case 1: if ((Fz = fopen(File_Zap, "wb")) == NULL) { puts("\nОшибка создания файла!"); return; } fclose(Fz); printf("\nФайл %s создан!\n\n", File_Zap); break; case 2: registration(); break; case 3: view_all_users(); break; case 4: //добавление нового сотрудника add_new_worker(year, month, day); break; case 5://просмотр файла view_file(); break; case 6:// поик сотрудника find_worker(); break; case 7://сотрировка по отделам sort_po_otdelam(); break; case 8: sort_by_experience(); break; case 9: delete_worker(); break; } } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void User_Mode() { int year, month, day, qqq = 1; int kod; Ft = fopen(File_Rez, "w"); while (true) { cout << "------------------Выберите номер:-------------------" << endl; puts("\n1-Просмотреть всех сотрудников\n2-Поиск сотрудника\n3-Сортировка(по отделам)\n4-Сортировка(по стажу)\n0-Выход\n"); scanf("%d", &kod); switch (kod) { case 0: fclose(Ft); return; case 1: view_file(); break; case 2: find_worker(); break; case 3: sort_po_otdelam(); break; case 4: sort_by_experience(); break; } } } //добавление нового сотрудника//////////////////////////////////////////////////////////// void add_new_worker(int year, int month, int day){ Fz = fopen(File_Zap, "a"); printf("\nФИО: "); fflush(stdin); // очищение буфера gets(Zap.FIO); printf("Отдел: "); gets(Zap.otdel); printf("Должность: "); gets(Zap.doljn); printf("Дата начала работы: "); scanf("%d %d %d", &Zap.d.day, &Zap.d.month, &Zap.d.year); if ((Zap.d.day > 31) || (Zap.d.month > 12) || (Zap.d.year > 2016)){ cout << "Дата введена неверно :(\n"; return; } Zap.d.total = (year - Zap.d.year) * 365 + (month - Zap.d.month) * 30 + (day - Zap.d.day); printf("\nВсeго дней на работе: %d \n", Zap.d.total); fwrite(&Zap, size, 1, Fz); fclose(Fz); } //просмотр файла о сотрудниках//////////////////////////////////////////////////////////////////////////////////////////// void view_file() { int qqq = 1; if ((Fz = fopen(File_Zap, "rb")) == NULL) { puts("Ошибка открытия файла!"); return; } printf("\n--------------Информация о сотрудниках--------------\n"); fprintf(Ft, "\n\t--------------Информация о сотрудниках--------------\n"); qqq = 1; while (1) { if (!fread(&Zap, size, 1, Fz)) break; Out(Zap, qqq); qqq++; } fclose(Fz); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void find_worker(){ int qqq = 1; printf("Введите дату начала работы (дд мм гг):"); scanf("%d %d %d", &key.day, &key.month, &key.year); if ((key.day > 31) || (key.month > 12) || (key.year > 2016)){ cout << "Dutu vvedenu neverno"; return; } Fz = fopen(File_Zap, "rb"); kol = in_m(Fz, size);// Кол-во записей mas_Z = new TZap[kol]; for (int i = 0; i < kol; i++) fread(&mas_Z[i], 1, size, Fz); fclose(Fz); printf("\n--------------------Результат-----------------------\n"); search = 0; qqq = 1; for (int i = 0; i < kol; i++)//поиск сотрудника if (mas_Z[i].d.day == key.day && mas_Z[i].d.month == key.month && mas_Z[i].d.year == key.year) { search = 1; Out(mas_Z[i], qqq); qqq++; } if (search == 0) printf("\t\tРаботник не найден\n"); delete[]mas_Z; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void sort_po_otdelam(){ int qqq; Fz = fopen(File_Zap, "rb"); kol = in_m(Fz, size); mas_Z = new TZap[kol]; for (int i = 0; i < kol; i++) fread(&mas_Z[i], 1, size, Fz); fclose(Fz); for (int i = 0; i < kol - 1; i++) { int m = i; for (int j = i + 1; j < kol; j++) if (mas_Z[j].d.total > mas_Z[m].d.total) m = j; Zap_n = mas_Z[m]; mas_Z[m] = mas_Z[i]; mas_Z[i] = Zap_n; } for (int i = 0; i < kol - 1; i++) for (int j = i + 1; j < kol; j++) if (strcmp(mas_Z[i].otdel, mas_Z[j].otdel)>0) swap(mas_Z[i], mas_Z[j]); qqq = 1; for (int i = 0; i < kol; i++){ Out(mas_Z[i], qqq); qqq++; } delete[]mas_Z; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void sort_by_experience(){ int qqq = 1; Fz = fopen(File_Zap, "rb"); kol = in_m(Fz, size); mas_Z = new TZap[kol]; for (int i = 0; i < kol; i++) fread(&mas_Z[i], 1, size, Fz); fclose(Fz); i = 0; j = kol - 1; QuickSort(i, j); qqq = 1; for (int i = 0; i < kol; i++){ Out(mas_Z[i], qqq); qqq++; } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void delete_worker(){ int number, qqq = 1; char Pass[30]; Fz = fopen(File_Zap, "rb"); kol = in_m(Fz, size); mas_Z = new TZap[kol]; cout << "Введите порядковый номер сотрудника:" << endl; cin >> number; number--; for (int i = 0; i < kol; i++) fread(&mas_Z[i], 1, size, Fz); fclose(Fz); while (true){ cout << "Вы действительно хотите удалить сотрудника?\n"; cout << "1 - Да" << endl << "2 - Нет" << endl; cin >> Pass; if (strcmp(Pass, "2") == 0) return; if (strcmp(Pass, "1") == 0) break; } for (i = 0; i < kol; i++){ if (i == number){ for (j = i; j < kol; j++){ mas_Z[j] = mas_Z[j + 1]; } kol--; } } qqq = 1; for (int i = 0; i < kol; i++){ Out(mas_Z[i], qqq); qqq++; } File = fopen(File_Zap, "wb");//функция сохранения for (i = 0; i < kol; i++) fwrite(mas_Z + i, size, 1, File); fclose(File); delete[]mas_Z; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// void view_all_users() { int Kod, len, kol, i; Pair *mas; if ((File = fopen("pass.dat", "rb")) == NULL){ cout << "Ошибка открытия файла" << endl;; return; } kol = in_m(File, size1); mas = new Pair[kol]; for (i = 0; i < kol; i++) fread(mas + i, size1, 1, File); fclose(File); cout << "\n-------------Список всех пользователей:-------------\n"; for (i = 0; i < kol; i++){ cout << "Имя пользователя: " << mas[i].Name << "\nПароль пользователя: " << mas[i].Password << "\nРоль: " << mas[i].role <<"\n----------------------------------------------------" << endl; } delete mas; } void Out(TZap z, int qqq) { printf("%d|%20s|%5s|%5s %d.%d.%d (%d)\n", qqq, z.FIO, z.otdel, z.doljn, z.d.day, z.d.month, z.d.year, z.d.total); fprintf(Ft, "%d|%20s %20s %20s %d.%d.%d (%d)\n", qqq, z.FIO, z.otdel, z.doljn, z.d.day, z.d.month, z.d.year, z.d.total); } void QuickSort(int L, int R) { i = L; j = R; m = (R + L) / 2; while (i <= j) { while (mas_Z[i].d.total > mas_Z[m].d.total) i++; while (mas_Z[j].d.total < mas_Z[m].d.total) j--; if (i <= j) { Zap_n = mas_Z[i]; mas_Z[i] = mas_Z[j]; mas_Z[j] = Zap_n; i++; j--; } } if (L < j) QuickSort(L, j); if (i < R) QuickSort(i, R); } int in_m(FILE *Fz,int sz){ int Kod; Kod = fileno(Fz); len = filelength(Kod); kol = len / sz; return kol; } Заключение В ходе выполнения курсового проекта были выполнены поставленные задачи в соответствии с условием варианта. В данной работе раскрыты теоретические вопросы. А так же составлены схемы задачи, описано решение задачи, приложен листинг кода. В результате решения поставленной задачи были закреплены навыки ввода и использования абстракции для обозначения реальных объектов, разработки алгоритмических решений задач, выполнения разбиения задачи на подзадачи, представления решения в виде блок-схем описаний алгоритмов. Список использованных источников 1 Мытник Н.П. «Основы конструирования программ» / Мытник Н.П. Минск: БГУИР, 2010. 2. Электронный учебно-методический комплекс по дисциплине «Основы алгоритмизации и программирования», С.Н. Кардаш, Т.М. Унучек. 3 Крупник А. Б. «Изучаем Cи» / Крупник А. Б. Минск, 2001 — 233 с. 3. Гукин Д. Язык программирования Си для «чайников» = C For Dummies. , 2006. 4. Кадырова, Г. Р. Основы алгоритмизации и программирования : учебное пособие / Г. Р. Кадырова. – Ульяновск : УлГТУ, 2014. – 95 с |