Низкоуровневое программирование
Скачать 89.39 Kb.
|
МИНИСТЕРСТВО ОБРАЗОВАНИЯ, НАУКИ И МОЛОДЕЖНОЙ ПОЛИТИКИ ЗАБАЙКАЛЬСКОГО КРАЯ ГОСУДАРСТВЕНОЕ ПРОФЕССИОНАЛЬНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ЧИТИНСКИЙ ТЕХНИКУМ ОТРАСЛЕВЫХ ТЕХНОЛОГИЙ И БИЗНЕСА ОТЧЁТ ПО ПРАКТИКЕ «НИЗКОУРОВНЕВОЕ ПРОГРАММИРОВАНИЕ» Выполнил студент группы ПКС-14-1 Судаков М.А. Подпись: ___________________________ Проверила: Смирнова Т.М., Подпись: ___________________________ Чита, 2016 Содержание:Пояснительная записка 3 Результат выполнения индивидуального задания 4 Исполнение программы 16 Заключение 19 Список используемой литературы. 20 Пояснительная запискаЦель учебной практики: Приобретение знаний и навыков самостоятельной и научно-исследовательской работы; Разработка программного кода, реализующего работу с классами; Закрепление теоретических знаний, полученных в процессе обучения; Изучение объектно-ориентированного языка программирования С++; Задача учебной практики: Закрепить в практической деятельности полученные знания в процессе обучения; Создания приложений на объектно-ориентированного языка программирования С++; Индивидуальное задание: Создания информационно-справочной системы данных «Сотрудники», позволяющая осуществлять следующие функций: Формирования базы данных «Сотрудники»; Cохранение данных базы в файлы бинарного формата; Осуществление функций: редактирования, поиска и удаления; Результат выполнения индивидуального заданияВставка исходного кода GUI.h// GUI – графический пользовательский интерфейс class Employer:Graph_lib::Window//Классглавногоокна { private: Button quit_button; Button input_button; Button disk_button; Button in_button; Button poisk_button; Button del_button; Text employer; Out_box empl; In_box o_name; In_box o_surname; In_box o_age; In_box o_oklad; static void cb_quit(Address, Address); void quit(); static void cb_add(Address, Address); void add(); static void cb_disk(Address, Address); void disk(); static void cb_poisk(Address, Address); void poisk(); static void cb_del(Address, Address); void del(); static void cb_redakt(Address, Address); void redakt(); static void cb_in(Address, Address); void in(); Employer* Next; Employer* Prev; static int number; static Employer* First; static Employer* Last; public: string name; string surname; int age; double oklad; Employer(Point xy, int w, int h, const string& title); }; ///////////////////////////////////////////////////////////////////// class Name_disk:Graph_lib::Window//Класс отвечающий за путь до файла { private: Button quit_button; Button write_button; Button read_button; Text employer_disk; Text employer_in; Out_box empl_disk; In_box disk_name; static void cb_quit(Address, Address); void quit(); static void cb_write(Address, Address); void write(); static void cb_read(Address, Address); void read(); public: Name_disk(Point xy, int w, int h, const string& title); }; /////////////////////////////////////////////////////////////////// class Poisk:Graph_lib::Window//Класс отвечающий за поиск { public: Button quit_button; Button poisk_button; Text s; Text n; Text a; Text o; In_box nomer; In_box poisk_em; Out_box rez; static void cb_quit(Address, Address); void quit(); static void cb_poisk(Address, Address); void poisk(); public: Poisk(Point xy, int w, int h, const string& title); }; } // of namespace Graph_lib #endif // GUI_GUARD GUI.cpp #include "GUI.h" #include "Simple_window.h" #include "Windows.h" #include "Empl.h" namespace Graph_lib { Empl* uk = Empl::First; Empl* Glob_uk = NULL; //------------------------------------------------------------------------------------------ //Описание компонентов главного окна int i =0; int input=0; int del_id=-1; Employer::Employer(Point xy, int w, int h, const string& title):Window(xy,w,h,title), quit_button(Point(x_max()-160,0),150,20,"Выход",cb_quit), input_button(Point(x_max()-160,90),150,20,"Добавить", cb_add), disk_button(Point(x_max()-160,120),150,20,"Диск", cb_disk), in_button(Point(x_max()-350,180),150,20,"Вывод", cb_in), poisk_button(Point(x_max()-160,150),150,20,"Поиск", cb_poisk), del_button(Point(x_max()-160, 180),150,20,"Удалить", cb_del), employer(Point(x_max()-650,240),"Вывод сотрудников:"), empl(Point(x_max()-500,225),490,20,""), o_surname(Point(x_max()-300,30),300,20,"Фамилия:"), o_name(Point(x_max()-300,60),300,20,"Имя:"), o_age(Point(x_max()-300,90),100,20,"Возраст:"), o_oklad(Point(x_max()-300,120),100,20,"Оклад:") { attach(quit_button); attach(input_button); attach(in_button); attach(employer); attach(empl); attach(disk_button); attach(poisk_button); attach(del_button); attach(o_surname); attach(o_name); attach(o_age); attach(o_oklad); } void Employer::cb_quit(Graph_lib::Address, Graph_lib::Address pw) { reference_to } void Employer::quit() { hide(); } ////////////////////////////////////////////////////////////////// void Employer::cb_add(Graph_lib::Address, Graph_lib::Address pw) { reference_to } void Employer::add() { Empl* temp = NULL; temp=new Empl("0","0",0,0.0); temp->surname=o_surname.get_string(); temp->name=o_name.get_string(); temp->age=o_age.get_int(); string s=o_oklad.get_string(); temp->oklad=atof(s.c_str()); Empl::add(temp); detach(o_surname); detach(o_name); detach(o_age); detach(o_oklad); attach(o_surname); attach(o_name); attach(o_age); attach(o_oklad); } ////////////////////////////////////////////////////////////////// void Employer::cb_disk(Graph_lib::Address, Graph_lib::Address pw) { reference_to } void Employer::disk() { Name_disk disk(Point(100,100),800,600,"Disk"); gui_main(); } ////////////////////////////////////////////////////////////////// void Employer::cb_poisk(Graph_lib::Address, Graph_lib::Address pw) { reference_to } void Employer::poisk() { Poisk poisk(Point(100,100),800,600,"Poisk"); gui_main(); } ////////////////////////////////////////////////////////////////// void Employer::cb_del(Graph_lib::Address, Graph_lib::Address pw) { reference_to } void Employer::del() { ostringstream ee; if (del_id !=-1){ if(!Empl::empty()) { Empl* uk=Empl::First; while(uk!=NULL) { if(uk->i==del_id) { Empl::del(uk); ee << "Сотрудник удален!"; //i = 0; input=0; del_id = -1; uk=uk->Next; break; } uk=uk->Next; } if(uk->i==uk->number-1) input=0; } else ee << "Список пуст!";} else ee << "Сотрудник не выбран"; empl.put(ee.str()); } ////////////////////////////////////////////////////////////////// void Employer::cb_in(Graph_lib::Address, Graph_lib::Address pw) { reference_to } void Employer::in() { ostringstream ee; if(!Empl::empty()) { Empl* uk=Empl::First; while(uk!=NULL) { if(uk->i==input) { ee << "Фамилия: " << uk->surname << " Имя: " << uk->name << " Возраст: " << uk->age << " Оклад: " << uk->oklad << "p"; input++; del_id = uk->i; break; } uk=uk->Next; } if (input==uk->number) input=0; } else ee << "Список пуст!"; empl.put(ee.str()); } /////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////// //Описание компонентов класса ввода на диск и вывода с диска Name_disk::Name_disk(Point xy, int w, int h, const string& title):Window(xy,w,h,title), quit_button(Point(x_max()-160,0),150,20,"Выход",cb_quit), write_button(Point(x_max()-160,30),150,20,"Записать",cb_write), read_button(Point(x_max()-160,60),150,20,"Считать",cb_read), empl_disk(Point(x_max()-500,130),490,20,""), employer_disk(Point(x_max()-600,110),"Введите путь:"), disk_name(Point(x_max()-500,95),490,20,""), employer_in(Point(x_max()-590,145),"Сотрудники:") { attach(quit_button); attach(write_button); attach(empl_disk); attach(employer_disk); attach(disk_name); attach(employer_in); attach(read_button); } void Name_disk::cb_quit(Graph_lib::Address, Graph_lib::Address pw) { reference_to } void Name_disk::quit() { hide(); } void Name_disk::cb_write(Graph_lib::Address, Graph_lib::Address pw) { reference_to } void Name_disk::write() { ostringstream ss; Empl* uk = Empl::First; if (Empl::empty()) ss << "Список пуст! "; else { string name = disk_name.get_string(); ofstream ofs(name.c_str()); if (!ofs) ss << "Файл не открыт! Ошибка..."; else { while(uk!=NULL) { ofs.write(as_bytes(*uk), sizeof(Empl)); uk = uk->Next; } ss<< "Данные записаны..."; ofs.close(); } } empl_disk.put(ss.str()); } void Name_disk::cb_read(Graph_lib::Address, Graph_lib::Address pw) { reference_to } void Name_disk::read() { ostringstream ss; string name = disk_name.get_string(); ifstream ifs(name.c_str()); Empl* empl = NULL; empl = new Empl("0","0",0,0.0); if (!ifs) ss << "Ошибка открытия файла!"; else { while (ifs.read(as_bytes(*empl), sizeof(Empl))) { Empl::add(empl); empl = new Empl("0","0",0,0.0); } ss << "Данные считаны..."; ifs.close(); } empl_disk.put(ss.str()); } /////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////// //Описаниекомпонентовклассапоискасотрудников Poisk::Poisk(Point xy, int w, int h, const string& title):Window(xy,w,h,title), quit_button(Point(x_max()-160,0),150,20,"Выход",cb_quit), poisk_button(Point(x_max()-160,30),150,20,"Поиск", cb_poisk), nomer(Point(x_max()-230,60),50,20,""), rez(Point(x_max()-300,120),350,20,""), poisk_em(Point(x_max()-160,60),150,20,""), s(Point(x_max()-300,10),"Surname - 1"), n(Point(x_max()-300,40),"Name - 2"), a(Point(x_max()-300,70),"Age - 3"), o(Point(x_max()-300,100),"Oklad - 4") { attach(quit_button); attach(poisk_button); attach(nomer); attach(rez); attach(poisk_em); attach(s); attach(n); attach(a); attach(o); } void Poisk::cb_quit(Graph_lib::Address, Graph_lib::Address pw) { reference_to (pw).quit(); } void Poisk::quit() { hide(); } //////////////////////////////////////////////////////////////// void Poisk::cb_poisk(Graph_lib::Address, Graph_lib::Address pw) { reference_to (pw).poisk(); } void Poisk::poisk() { Empl* uk =NULL; ostringstream ss; detach(rez); attach(rez); if(Glob_uk == NULL)uk = Empl::First; else uk = Glob_uk; int nmer ; nmer = nomer.get_int()-1; if(nmer<0 || nmer>3) { ss<<"Ошибка ввода номера поля"; rez.put(ss.str()); return; } string m; m = poisk_em.get_string(); switch(nmer) { case 0: while(uk != NULL) { if(uk->surname == m) { ss< rez.put(ss.str()); uk = uk->Next; Glob_uk = uk; return; } uk = uk->Next; } if(uk == NULL) Glob_uk = NULL; break; case 1: while(uk != NULL) { if(uk->name == m) { ss< rez.put(ss.str()); uk = uk->Next; Glob_uk = uk; return; } uk = uk->Next; } if(uk == NULL) Glob_uk = NULL; break; case 2: while(uk != NULL) { if(uk->age == atoi(m.c_str())) { ss< rez.put(ss.str()); uk = uk->Next; Glob_uk = uk; return; } uk = uk->Next; } if(uk == NULL) Glob_uk = NULL; break; case 3: while(uk != NULL) { if(uk->oklad == atof(m.c_str())) { ss< rez.put(ss.str()); uk = uk->Next; Glob_uk = uk; return; } uk = uk->Next; } if(uk == NULL) Glob_uk = NULL; break; } if(uk==NULL) ss<<"Поле пустое или сотрудник не найден"; rez.put(ss.str()); } /////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////// }; // of namespace Graph_lib Empl.h #include #include #include using namespace std; class Empl { public: Empl* Next; Empl* Prev; static int number; static Empl* First; static Empl* Last; int i; string name; string surname; int age; double oklad; Empl(string n = "", string s = "", int a = 0, double o = 0.0):name(n), surname(s), age(a), oklad(o){} // if(uk->Prev=NULL) static void add(Empl* uk) { if(Last==NULL) { First=uk; uk->Prev=NULL; } else { uk->Prev=Last; Last->Next=uk; } uk->Next=NULL; uk->i=number; Last=uk; number++; } static bool empty() { if(number == 0) return true; else return false; } static void del(Empl* obj) { Empl* temp = obj->Next; while (temp) { temp->i--; temp = temp->Next; } if (First == Last) { First = NULL; Last = NULL; } else if (obj == First) { First = First->Next; First->Prev = NULL; } else if (obj == Last) { Last = Last->Prev; Last->Next = NULL; } else { obj->Prev->Next = obj->Next; obj->Next->Prev = obj->Prev; } obj = NULL; delete obj; number--; } }; Employer.cpp #include "Empl.h" Empl* Empl::First=NULL; Empl* Empl::Last=NULL; int Empl::number=0; gr1.cpp #include "Simple_window.h" #include "Empl.h" using namespace Graph_lib; struct distr { int month, skip; }; istream& operator >> (istream& is, distr& d) { distr dd; is >> dd.month; is >> dd.skip; d=dd; return is; } class Scale { int cbase; int vbase; double scale; public: Scale(int cb, int vb, double s):cbase(cb), vbase(vb), scale(s){} int operator()(int v) const { return cbase+(v-vbase)*scale; } }; int main() { Employer win(Point(100,100),800,600,"GUI"); return gui_main(); } Исполнение программыВ программе реализовано меню, для заполнения сотрудников и выбора нужного действия. При нажатии кнопки «Выход» главное окно закрывается. При нажатии кнопки «Добавить», наши данные попадают в список и ожидают дальнейшего их использования. При нажатии клавиши «Диск» открывается новое окно, где пользователь указывает путь и имя до нужного файла. После чего нажимается кнопка «Записать» чтобы сохранить данные на файле. Так же можно считать данные, ранее занесенные на файл, с помощью кнопки «Считать», но для этого опять же нужно прописать путь и имя до файла если программа запущена заного. После чего пользователю оповестится о том что Данные считаны. Затем нажимем кнопку «Выход» и попадаем на главное окно, где используя кнопку «Вывод» список сотрудников выводится в поле «Вывод сотрудников». При нажатии кнопки «Поиск», открывается новое окно, где предложенно выбрать, по какому из полей искать. Затем вводим в поле фамилию, либо имя, либо возраст, либо оклад того что ищем и нажимаем кнопку «Поиск». После чего, то что искали выводится в поле ниже. И используем кнопку «Выход». Если же нужно удалить сотрудника из списка, просто нажимаем кнопку «Вывод» пока в поле «Вывод сотрудников» не будет нужный для удаления сотрудник, после чего нажимаем кнопку «Удалить» и пользователю оповестится об удалении. ЗаключениеПрактическая значимость исследования заключается в определении содержания теоретического материала, направленного на формирование знаний и умений во время прохождения практики. Во время учебной практики был изучен и отработан процесс создания приложений на языке C++. В качестве высокоуровневого приложения была выбрана структура создания базы данных. В ходе учебной практики были получены практические навыки по следующим темам: Работа со структурами и классами; Двусвязные списки; Потоки ввода и вывода; Файловые и строковые потоки; Работа с графикой библиотеки FLTK; В конечном итоге было реализовано приложение на C++ с применением знаний и навыков, полученных во время практики, позволяющие работать пользователю с собственными данными. В приложении реализованы как базовые особенности языка C++: структуры, классы шаблоны функций, так и такие алгоритмические конструкции, как создание двусвязных списков, поиск элемента в списке с последующим редактированием, поиском и удалением двухсвязных списков. Список используемой литературы.Панюкова Т. А., Панюков А. В. Языки и методы программирования. Создание простых GUI-приложений с помощью Visual С++; Либроком - Москва, 2013. - 144 c. Штерн Виктор C++; Лори - , 2013. - 860 c. Бьерн Страуструп (Bjarne Stroustrup) Programming: Principles and Practice Using C++; 2014г. Лафоре Р.Объектно-ориентированное программирование в С++. Классика Computer Science.4-е изд.- СПб: Питер, 2011 |