Главная страница
Навигация по странице:

  • ЧИТИНСКИЙ ТЕХНИКУМ ОТРАСЛЕВЫХ ТЕХНОЛОГИЙ И БИЗНЕСА ОТЧЁТ ПО ПРАКТИКЕ «НИЗКОУРОВНЕВОЕ ПРОГРАММИРОВАНИЕ»

  • Цель учебной практики

  • Задача учебной практики

  • Индивидуальное задание

  • Вставка исходного кода GUI . h

  • Employer.cpp include "Empl.h"Empl* Empl::First=NULL;Empl* Empl::Last=NULL;int Empl::number=0; gr1.cpp

  • Низкоуровневое программирование


    Скачать 89.39 Kb.
    НазваниеНизкоуровневое программирование
    АнкорOtchet_OOP_Sudakov
    Дата18.02.2023
    Размер89.39 Kb.
    Формат файлаdocx
    Имя файлаOtchet_OOP_Sudakov.docx
    ТипЗадача
    #943844

    МИНИСТЕРСТВО ОБРАЗОВАНИЯ, НАУКИ И МОЛОДЕЖНОЙ ПОЛИТИКИ ЗАБАЙКАЛЬСКОГО КРАЯ

    ГОСУДАРСТВЕНОЕ ПРОФЕССИОНАЛЬНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

    ЧИТИНСКИЙ ТЕХНИКУМ ОТРАСЛЕВЫХ ТЕХНОЛОГИЙ И БИЗНЕСА

    ОТЧЁТ ПО ПРАКТИКЕ
    «НИЗКОУРОВНЕВОЕ ПРОГРАММИРОВАНИЕ»


    Выполнил студент группы ПКС-14-1

    Судаков М.А.

    Подпись: ___________________________

    Проверила: Смирнова Т.М.,

    Подпись: ___________________________

    Чита, 2016

    Содержание:




    Пояснительная записка 3

    Результат выполнения индивидуального задания 4

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

    Заключение 19

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


    Пояснительная записка


    Цель учебной практики:

    • Приобретение знаний и навыков самостоятельной и научно-исследовательской работы;

    • Разработка программного кода, реализующего работу с классами;

    • Закрепление теоретических знаний, полученных в процессе обучения;

    • Изучение объектно-ориентированного языка программирования С++;

    Задача учебной практики:

    • Закрепить в практической деятельности полученные знания в процессе обучения;

    • Создания приложений на объектно-ориентированного языка программирования С++;

    Индивидуальное задание:

    Создания информационно-справочной системы данных «Сотрудники», позволяющая осуществлять следующие функций:


    Результат выполнения индивидуального задания


    Вставка исходного кода

    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


    написать администратору сайта