75660

Робота зі структурами і файлами

Лабораторная работа

Информатика, кибернетика и программирование

Опис деякого об’єкту здійснюється за допомогою типу даних структура. Необхідно забезпечити опрацювання 3-5 атрибутів об’єкту з використанням різних простих типів даних (стрічки, символи, числа, логічний тип)ю Забезпечити виконання таких операцій...

Украинкский

2015-01-24

874.46 KB

3 чел.

Міністерство  освіти  і  науки України

Вінницький національний технічний університет

Інститут інформаційних технологій та комп’ютерної інженерії

Кафедра ПЗ

Лабораторна робота №10 варіант №9

з дисципліни Алгоритми та структури даних

Виконала: ст. гр. 1 ПІ-13б                            Лілик Л. С.

Перевірив:                                                       Власюк В. Х.

Вінниця, 2013

Тема: робота зі структурами і файлами.

Мета: набуття практичних навичок опрацювання структур та роботи з файлами.

Завдання:

Розробити програму яку забезпечує опрацювання структур даних і їх збереження у файлі.

Опис деякого обєкту здійснюється за допомогою типу даних структура. Необхідно забезпечити опрацювання 3-5 атрибутів обєкту з використанням різних простих типів даних (стрічки, символи, числа, логічний тип)ю Забезпечити виконання таких операцій:

  1.  Введення даних;
  2.  Пошук за значенням атрибуту;
  3.  Послідовний перегляд;
  4.  Модифікацію значень атрибутів обєктів (структури що його описує);
  5.  Видалення обєкту (структури що його описує);
  6.  Сортування за значеннями атрибутів;
  7.  Результати всіх операцій повинні зберігатись у файлі.

В контрольному прикладі продемонструвати виконання основних операцій з файлом який містить 10-20 збережених описів обєктів.

Було обрано опис області: Ресторан, адреса, рейтинг, наявність вільних столиків.

Складність алгоритму

Складність алгоритму пошуку (обходу) дорівнює O( N ) від t ;

Складність алгоритму сортування дорівнює O( 4N2 +3N+5 ) від t, де:

t - час виконання;
Nкількість елементів списку.

Опис алгоритму

Для зручного і економного зберігання структур даних будо обрано однозв’язний список. Зі списком можна виконувати всі вищевказані операції, після виконання операцій список можна записувати у файл, назву і розміщення якого користувач задає сам.


Блок-схема алгоритму


Лістинг фрагментів програми 

#pragma once

#include "stdafx.h"

using namespace std;

class C_Record

{

public:

 int m_key;

 string m_Restaurant;

 string m_Address;

 int m_Rating;

 bool m_freeTables;

 static C_Record *begin;

 C_Record *next;

 C_Record();

 C_Record(string Restaurant, string Address, int Rating, bool freeTables);

 ~C_Record();

 void Show(HDC hdc,int xmax);

 void Add(C_Record *n);

 void Delete(int key);

 void ShowList(HDC hdc, int xmax);

 void Sort(void);

 C_Record *FindRestaurant(string Restaurant);

 C_Record *FindRestaurantKey(int Key);

 int CountCount();

 friend ofstream &operator<< ( ofstream & ofs, C_Record &rec);

 friend ifstream &operator>> ( ifstream & ifs, C_Record &rec);

};

#include "stdafx.h"

using namespace std;

C_Record  *C_Record::begin;

C_Record::C_Record(string Restaurant, string Address, int Rating, bool freeTables):

  m_Restaurant(Restaurant), m_Address(Address), m_Rating(Rating), m_freeTables(freeTables)

{

m_key=123;

next=0;

}

C_Record::C_Record(void)

{

   next=0;

}

C_Record::~C_Record(void)

{

}

void C_Record::Show(HDC hdc, int xmax)

{

  HPEN hTablePen, hSecondPen, holdpen;

  

  hTablePen = CreatePen(PS_SOLID, 3, RGB(13, 112, 178));

     

  holdpen = (HPEN)SelectObject(hdc, hTablePen);

 

   char buf_key[20];

   itoa (m_key,buf_key,10);

   char buf_rate[20];

   itoa (m_Rating,buf_rate,10);

   char buf_freeT[20];

   if(m_freeTables)

    strcpy(buf_freeT, "Yes");

   else strcpy(buf_freeT, "No free tables");

  

::TextOutA(hdc, 13, (m_key)*25+10-2,  (LPCSTR) buf_key, strlen(buf_key) );

::TextOutA(hdc, 25+30, (m_key)*25+10-2,  (LPCSTR) m_Restaurant.c_str(), Restaurant.size());

::TextOutA(hdc, 25+280, (m_key)*25+10-2,  (LPCSTR) m_Address.c_str(), m_Address.size() );

::TextOutA(hdc, 25+630, (m_key)*25+10-2,  (LPCSTR) buf_rate, strlen(buf_rate) );

::TextOutA(hdc, 25+730, (m_key)*25+10-2,  (LPCSTR) buf_freeT, strlen(buf_freeT) );

  

    

  POINT pnt;

  ::MoveToEx( hdc, 10, m_key*25, &pnt );

  ::LineTo(hdc, 10, (m_key+1)*25);

  ::LineTo(hdc, xmax-20, (m_key+1)*25);

  ::LineTo(hdc, xmax-20, (m_key)*25);

  ::MoveToEx( hdc, 10+30, m_key*25, &pnt );

  ::LineTo(hdc, 10+30, (m_key+1)*25);

  ::MoveToEx( hdc, 10+280, m_key*25, &pnt );

  ::LineTo(hdc, 10+280, (m_key+1)*25);

  ::MoveToEx( hdc, 10+630, m_key*25, &pnt );

  ::LineTo(hdc, 10+630, (m_key+1)*25);

  ::MoveToEx( hdc, 10+730, m_key*25, &pnt );

  ::LineTo(hdc, 10+730, (m_key+1)*25);

  

  ::DeleteObject(hTablePen);

  ::DeleteObject(holdpen);

}

void C_Record::Add(C_Record *n)

{

int key=1;

C_Record *curr;

if(begin!=0)

{

 curr = begin;

 while(curr->next!=0)

 {

  curr=curr->next;

 }

 key = curr->m_key+1;

 curr->next=n;

 curr->next->m_key = key;

}

else

{

 begin = n;

 begin->m_key=1;

}

}

void C_Record::Delete(int key)

{

if(begin==0)return;

C_Record *curr=begin;

C_Record *temp;

if(C_Record::begin->m_key==key)

{

 begin=begin->next;

 delete curr;

 curr=curr->begin;

 while(curr!=0)

   {

    --curr->m_key;

    curr=curr->next;

   }

 return;

}

while(curr->next!=0&&curr->next->m_key!=key)

{

 curr=curr->next;

}

if(curr->next!=0)

{

 temp=curr->next;

 curr->next=curr->next->next;

 delete temp;

 curr=curr->next;

 while(curr!=0)

 {

  --curr->m_key;

  curr=curr->next;

 }

}

}

void C_Record::ShowList(HDC hdc, int xmax)

{

C_Record *curr;

curr = begin;

while (curr!=0)

{

 curr->Show(hdc, xmax);

 curr=curr->next;

}

}

void C_Record::Sort(void)

{

   C_Record *curr=begin;

   bool isDone=false;

   while(!isDone)

   {

       C_Record *prev=0;

       isDone=true;

       curr=begin;

       while(curr->next!=0)

       {

           if(curr->m_Rating < curr->next->m_Rating)

           {

               isDone=false;

               if(prev==0)

               {

                   begin=curr->next;

    curr->next=begin->next;

                   begin->next=curr;

                   prev=begin;

               }

               else

               {

                   C_Record *temp=curr->next->next;

                   prev->next=curr->next;

                   prev=curr->next;

                   prev->next=curr;

                   curr->next=temp;

               }

           }

           else

           {

               prev=curr;

               curr=curr->next;

           }

       }

   }

curr=begin;

int i=0;

while(curr!=0)

{

  curr->m_key=1;

  curr->m_key+=i;

  ++i;

  curr=curr->next;

}

}

C_Record *C_Record::FindRestaurant(string Restaurant)

{

 

if(begin==0)return 0;

C_Record *curr=begin;

while(curr!=0)

{

 if(curr->m_Restaurant==Restaurant)

 {

  return curr;

  break;

 }

 else

  curr=curr->next;

}

return 0;

}

C_Record *C_Record::FindRestaurantKey(int Key)

{

if(begin==0)return 0;

C_Record *curr=begin;

while(curr!=0)

{

 if(curr->m_key==Key)

 {

  return curr;

  break;

 }

 else

  curr=curr->next;

}

return 0;

}

int C_Record::CountCount()

{

if(begin==0)return -1;

if (begin->next==0)return 1;

C_Record *curr=begin;

while(curr->next!=0)

{

 curr=curr->next;

}

return curr->m_key;

}

ifstream &operator>> ( ifstream & ifs, C_Record &rec)

{

char buf[100];

char buuff[100];

string bufs;

ifs>>rec.m_key;

ifs.getline( buf, sizeof(buf),'\n' );

ifs>>rec.m_Restaurant;

ifs.getline( buf, sizeof(buf),'\n' );

bufs=(const char*) buf;

rec.m_Restaurant+=bufs;  

ifs.getline( buf, sizeof(buf),'\n' );

ifs>>rec.m_Address;

ifs.getline( buf, sizeof(buf),'\n' );

bufs=(const char*) buf;

rec.m_Address+=bufs;   

ifs>>rec.m_Rating;

ifs.getline( buf, sizeof(buf), '\n' );

ifs>>rec.m_freeTables;

ifs.getline( buf, sizeof(buf), '\n' );

ifs.getline( buf, sizeof(buf), '\n' );

return ifs;

}

ofstream &operator<< (ofstream & ofs, C_Record &rec)

{

ofs<<rec.m_key<<endl;

ofs<<rec.m_Restaurant<<endl;

ofs<<rec.m_Address<<endl;

ofs<<rec.m_Rating<<endl;

ofs<<rec.m_freeTables<<endl;

return ofs;

}

#pragma once

class SaveOpen

{

int saveopen;

public:

void Save(HWND hWnd);

void Open();

SaveOpen(void);

~SaveOpen(void);

};

extern SaveOpen sopen;

#include "StdAfx.h"

#include "SaveOpen.h"

static OPENFILENAME ofn;

static wchar_t szFileName[_MAX_PATH];

static wchar_t szTitleName[_MAX_FNAME + _MAX_EXT];

SaveOpen sopen;

SaveOpen::SaveOpen(void)

{

saveopen=1;

}

SaveOpen::~SaveOpen(void)

{

}

void SaveOpen::Save(HWND hWnd)

{

  memset(&ofn,0,sizeof(ofn));

  GetCurrentDirectory( sizeof(szFileName), szFileName);

  wcscat( szFileName, L"\\*.*" );

  ofn.lStructSize = sizeof(ofn);

  ofn.hwndOwner = NULL; //hWnd;

  ofn.lpstrFile = szFileName;

  ofn.lpstrFile[0]=L'\0';

  ofn.nMaxFile = sizeof(szFileName);

  ofn.lpstrFilter = L"All\0*.*\0Text\0*.TXT\0";

  ofn.nFilterIndex = 1;

  ofn.lpstrFileTitle = NULL;

  

  ofn.lpstrInitialDir = NULL;

  ofn.Flags = OFN_PATHMUSTEXIST;

  ofn.Flags =  OFN_CREATEPROMPT;

  if( GetSaveFileName(&ofn) )

  {   

::MessageBoxW(hWnd,(LPCWSTR)ofn.lpstrFile,L"File name", MB_OK );

   char buffer[200];

           wcstombs ( buffer, (LPCWSTR)ofn.lpstrFile, sizeof(buffer) );

   ofstream ofs (buffer );

          

   C_Record *curr;

   curr = C_Record::begin;

   while (curr!=0)

   {

    ofs<<*curr;

    ofs<<endl;

    curr=curr->next;

   }

      

   ofs.close();   

  }

}

void SaveOpen::Open()

{

 memset(&ofn,0,sizeof(ofn) );

  GetCurrentDirectory( sizeof(szFileName), szFileName );

  wcscat( szFileName, L"\\*.*" );

  ofn.lStructSize = sizeof(ofn);

  ofn.hwndOwner = NULL;

  ofn.lpstrFile = szFileName;

  ofn.lpstrFile[0]=L'\0';

  ofn.nMaxFile = sizeof(szFileName);

  ofn.lpstrFilter = L"All\0*.*\0Text\0*.TXT\0";

  ofn.nFilterIndex = 1;

  ofn.lpstrFileTitle = NULL;

  ofn.nMaxFileTitle = 0;

  ofn.lpstrInitialDir = NULL;

  ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

  ofn.lpstrFileTitle = L"Open model";

  if( GetOpenFileName(&ofn) )

  {   

   char buffer[200];

   char buf[100];

           wcstombs ( buffer, (LPCWSTR)ofn.lpstrFile, sizeof(buffer) );

   ifstream ifs;

   

   ifs.open( buffer );

   if( ifs.is_open() )

   {

    while(!ifs.eof())

    {

     C_Record *n;

     n= new C_Record();

     ifs>>*n;

     

     int key=0;

     C_Record *curr;

     if(C_Record::begin!=0)

     {

      curr = C_Record::begin;

      while(curr->next!=0)

      {

       curr=curr->next;

      }

      key = curr->m_key+1;

      curr->next=n;

      curr->next->m_key = key;

     }

     else

     {

      C_Record::begin = n;

      C_Record::begin->m_key=1;

     }

     ifs>>*n;

    }

   }

   ifs.close();

 

  }

}

 


Результат виконання 

Додавання нового елементу.

Список із 6 елементів.

Зберігання списку у файл.

Список після сортування.

Виведення інформації про об’єкт (пошук за значенням атрибуту).

Модифікація значень атрибуту певного об’єкту.

Список після модифікації одного поля (рейтингу ресторану) об’єкта під номером 4.

Висновки

Набуто практичні навички опрацювання структур та роботи з файлами. Створено програму для зберігання і редагування списку ресторанів. Результати операцій можна зберігати у файлі за допомогою користувацького меню.


 

А также другие работы, которые могут Вас заинтересовать

14536. АМСТЕРДАМСКИЙ ДОГОВОР (1997 ГОД). ПРОБЛЕМЫ ДАЛЬНЕЙШЕГО РАСШИРЕНИЯ И УГЛУБЛЕНИЯ «ИНТЕГРАЦИОННОГО СТРОИТЕЛЬСТВА» 19.74 KB
  Амстердамский Договор 1997 год. Проблемы дальнейшего расширения и углубления Интеграционного Строительства. Маастрихтский договор оставил ряд нерешённых проблем. Разрешить эти проблемы должна была новая межправительственная конференция которая началась в 1996 году. ...
14537. Філософія та наука: історія і сучасність 191.5 KB
  За таких умов докорінному перегляду піддаються всі аспекти наукової практики. Постає нове розуміння місця наукового знання в культурі.
14538. НИЦЦКИЙ ДОГОВОР (2001 ГОД). ИНТЕГРАЦИЯ ПО ВСЕМ НАПРАВЛЕНИЯМ 22.7 KB
  Ниццкий Договор 2001 год. Интеграция по всем направлениям В начале 1999 года Единая Европа вступила в новый этап своего развития. С 1 января 1999 года начала функционировать первая опора ЕС. В феврале 2000 года для обсуждения очередного редакционного обновления учредительн
14540. ИНСТИТУТЫ ЕС: ЕВРОПЕЙСКИЙ СУД 87 KB
  Институты ЕС: Европейский Суд. Оглавление [1] Институты ЕС: Европейский Суд. [2] Оглавление [3] Введение [4] Структура Суда [5] Состав Суда [6] Рассмотрение дел [7] Юрисдикция Суда [8] Суд первой инстанц
14541. ИНСТИТУТЫ ЕС: СЧЁТНАЯ ПАЛАТА 25.22 KB
  Институты ЕС: Счётная Палата I. Европейская счетная палата 1.СозданииЕвропейской счетной палаты 2.Мандатчленов Европейской счетной палаты. Полномочия. 3.Состав Европейской счетной палаты. 4.Организационная структура Европейской счетной палаты 5.Сотрудничествос...
14542. ЕВРОПЕЙСКИЙ ИНВЕСТИЦИОННЫЙ БАНК 24.63 KB
  Европейский Инвестиционный Банк IV.Европейский инвестиционный банк Состав банка Роль банка Организация работы Совет управляющих Европейский инвестиционный банк Е1В финансовое учреждение Европейского союза задуман и действует как банк и в то же время как евро
14543. ЕДИНАЯ СЕЛЬСКОХОЗЯЙСТВЕННАЯ ПОЛИТИКА ЕВРОПЕЙСКОГО СОЮЗА 43.99 KB
  Единая сельскохозяйственная политика Европейского Союза Оглавление Введение2 1. Необходимость и Цели ЕСХП2 2. Начало ЕСХП4 3. Современные реформы ЕСХП5 4. Реформа Сахарного Режима 2005 20066 Введение Единая Сельскохозяйственная Политика ЕСХП Евро
14544. Шенгенские соглашения 24.59 KB
  Шенгенские соглашения 1.Общая характеристика Шенгенских соглашений 2.Шенгенское соглашение 1985 г. 3.Шенгенская конвенция 1990 г. 1.Общая характеристика Шенгенских соглашений Шенгенские соглашения система из двух договоров которые были подписаны во второй полови