Файл: Низкоуровневое программирование.docx

ВУЗ: Не указан

Категория: Решение задач

Дисциплина: Не указана

Добавлен: 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 (pw).quit();

}

void Employer::quit()

{

hide();

}

//////////////////////////////////////////////////////////////////

void Employer::cb_add(Graph_lib::Address, Graph_lib::Address pw)

{

reference_to (pw).add();

}

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 (pw).disk();

}

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 (pw).poisk();

}

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 (pw).del();

}

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 (pw).in();

}

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 (pw).quit();

}

void Name_disk::quit()

{

hide();

}

void Name_disk::cb_write(Graph_lib::Address, Graph_lib::Address pw)

{

reference_to (pw).write();

}

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 (pw).read();

}

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<surname<<" "<name<<" "<age<<" "<oklad;

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<surname<<" "<name<<" "<age<<" "<oklad;

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<surname<<" "<name<<" "<age<<" "<oklad;

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<surname<<" "<name<<" "<age<<" "<oklad;

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();

}


Исполнение программы


В программе реализовано меню, для заполнения сотрудников и выбора нужного действия.



  1. При нажатии кнопки «Выход» главное окно закрывается.



  1. При нажатии кнопки «Добавить», наши данные попадают в список и ожидают дальнейшего их использования.



  1. При нажатии клавиши «Диск» открывается новое окно, где пользователь указывает путь и имя до нужного файла. После чего нажимается кнопка «Записать» чтобы сохранить данные на файле. Так же можно считать данные, ранее занесенные на файл, с помощью кнопки «Считать», но для этого опять же нужно прописать путь и имя до файла если программа запущена заного. После чего пользователю оповестится о том что Данные считаны. Затем нажимем кнопку «Выход» и попадаем на главное окно, где используя кнопку «Вывод» список сотрудников выводится в поле «Вывод сотрудников».



  1. При нажатии кнопки «Поиск», открывается новое окно, где предложенно выбрать, по какому из полей искать. Затем вводим в поле фамилию, либо имя, либо возраст, либо оклад того что ищем и нажимаем кнопку «Поиск». После чего, то что искали выводится в поле ниже. И используем кнопку «Выход».



  1. Если же нужно удалить сотрудника из списка, просто нажимаем кнопку «Вывод» пока в поле «Вывод сотрудников» не будет нужный для удаления сотрудник, после чего нажимаем кнопку «Удалить» и пользователю оповестится об удалении.


Заключение


Практическая значимость исследования заключается в определении содержания теоретического материала, направленного на формирование знаний и умений во время прохождения практики.

Во время учебной практики был изучен и отработан процесс создания приложений на языке C++. В качестве высокоуровневого приложения была выбрана структура создания базы данных.

В ходе учебной практики были получены практические навыки по следующим темам:

  • Работа со структурами и классами;

  • Двусвязные списки;

  • Потоки ввода и вывода;

  • Файловые и строковые потоки;

  • Работа с графикой библиотеки FLTK;

В конечном итоге было реализовано приложение на C++ с применением знаний и навыков, полученных во время практики, позволяющие работать пользователю с собственными данными.

В приложении реализованы как базовые особенности языка C++: структуры, классы шаблоны функций, так и такие алгоритмические конструкции, как создание двусвязных списков, поиск элемента в списке с последующим редактированием, поиском и удалением двухсвязных списков.

Список используемой литературы.




    1. Панюкова Т. А., Панюков А. В. Языки и методы программирования. Создание простых GUI-приложений с помощью Visual С++; Либроком - Москва, 2013. - 144 c.

    2. Штерн Виктор C++; Лори - , 2013. - 860 c.

    3. Бьерн Страуструп (Bjarne Stroustrup) Programming: Principles and Practice Using C++; 2014г.

    4. Лафоре Р.Объектно-ориентированное программирование в С++. Классика Computer Science.4-е изд.- СПб: Питер, 2011
0>