75660

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

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

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

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

Украинкский

2015-01-24

874.46 KB

1 чел.

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

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

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

Кафедра ПЗ

Лабораторна робота №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.

Висновки

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


 

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

22305. Данные и основные операторы 725.5 KB
  Хороший выбор структур данных позволяет разрабатывать на языке Паскаль простые и эффективные алгоритмы. Достоинства Паскаля: он ориентирован на структурное программирование имеет развитые средства контроля и достаточно прост в изучении; язык имеет хороший состав типов и структур данных; трансляторы с Паскаля есть во всех распространенных ПК; конкретные реализации языка дают возможность использовать все аппаратные средства ПК; на основе языка Паскаль разработана Delphi одна из современных систем визуального программирования....
22306. Организация лечебно-эвакуационного обеспечения населения при ЧС 269.5 KB
  Опыт ликвидации медико-санитарных последствий ЧС позволяет выделить общие факторы обстановки, которые, как правило, имеют место при всех ЧС, сопровождающихся значительными потерями населения, и влияют на организацию лечебно-эвакуационного обеспечения. К ним можно отнести следующие...
22307. МЕДИЦИНСКОЕ ОБЕСПЕЧЕНИЕ НАСЕЛЕНИЯ ПРИ ПРОВЕДЕНИИ МЕРОПРИЯТИЙ ГРЖДАНСКОЙ ОБОРОНЫ 196 KB
  Процесс оповещения населения обязательно сопровождается организацией оповещения органов управления и ответственных должностных лиц, принимающих решения о проведении конкретных мероприятий по защите населения, аварийно-спасательных и других неотложных работ в районах чрезвычайных ситуаций.
22308. Медико-санитарное обеспечение при ликвидации последствий чрезвычайных ситуаций техногенного (антропогенного) характера 233.5 KB
  Изучить классификацию АОХВ, характеристику очагов химического и радиационного заражения при авариях на радиационно опасных и химически опасных объектах. Изучить виды дорожно-транспортных аварий и катастроф, а также чрезвычайных ситуаций на пожаро - и взрывоопасных объектах
22309. ОРГАНИЗАЦИЯ ЛЕЧЕБНО-ЭВАКУАЦИОННОГО ОБЕСПЕЧЕНИЯ НАСЕЛЕНИЯ ПРИ ЛИКВИДАЦИИ ПОСЛЕДСТВИЙ НАПАДЕНИЯ ПРОТИВНИКА 160.5 KB
  Изучить организацию лечебно-эвакуационного обеспечения населения в очагах массовых санитарных потерь при применении противником ОМП. Рассмотреть организацию оказания медицинской помощи пострадавших, медицинскую сортировку. Изучить принципиальную схему развертывания этапа медицинской эвакуации, организацию медицинской эвакуации пострадавших
22310. Медико-санитарное обеспечение при ликвидации последствий чрезвычайных ситуаций природного характера (стихийных бедствий) 271.5 KB
  Изучить условия, определяющие систему лечебно-эвакуационного обеспечения населения при ликвидации последствий чрезвычайной ситуации природного характера, особенности формирования очагов массовых санитарных потерь при землетрясениях, наводнениях, лесных и торфяных пожарах
22311. РАБОТА НЕШТАТНЫХ АВАРИЙНО-СПАСАТЕЛЬНЫХ ФОРМИРОВАНИЙ ГРАЖДАНСКОЙ ОБОРОНЫ ЗДРАВООХРАНЕНИЯ ПРИ ПРОВЕДЕНИИ СПАСАТЕЛЬНЫХ РАБОТ 235.5 KB
  Первая врачебная помощь — комплекс общеврачебных мероприятий, оказываемых в целях устранения или ослабления последствий ранений (заболеваний), угрожающих жизни пораженным, раненых и больных, предупреждения развития опасных для жизни осложнений или уменьшения их тяжести, а также подготовки нуждающихся к дальнейшей эвакуации.
22312. Управління користувачами в невеликій мережі 28 KB
  Створюючи групи і додаючи в них користувачів ви визначаєте громадянство які мають права доступу до комп'ютерів в мережі. Крім того ви дістаєте можливість розділити користувачів на групи що володіють різними правами доступу. Двічі клацніть на значку Користувачі і паролі щоб відкрити діалогове вікно. Дозвольте користувачам обов'язково указувати свої ім'я користувача і пароль для чого встановите відповідний прапорець єдиний на вкладці Користувачі діалогового вікна Користувачі і паролі Перейдіть на вкладку Додатково.