Добавлен: 17.03.2024
Просмотров: 17
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
МИНИСТЕРСТВО ОБРАЗОВАНИЯ, НАУКИ И МОЛОДЕЖНОЙ ПОЛИТИКИ ЗАБАЙКАЛЬСКОГО КРАЯ
ГОСУДАРСТВЕНОЕ ПРОФЕССИОНАЛЬНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ЧИТИНСКИЙ ТЕХНИКУМ ОТРАСЛЕВЫХ ТЕХНОЛОГИЙ И БИЗНЕСА
ОТЧЁТ ПО ПРАКТИКЕ
«НИЗКОУРОВНЕВОЕ ПРОГРАММИРОВАНИЕ»
Выполнил студент группы ПКС-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