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.

Висновки

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


 

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

80157. МЕЖДУНАРОДНЫЕ ФИНАНСОВЫЕ ИНСТИТУТЫ 34 KB
  К таким организациям в первую очередь относятся: Международный валютный фонд МВБ; группа Всемирного банка включающая Международный банк реконструкции и развития МБРР Международную ассоциацию развития MP Международную финансовую корпорацию МФК Многостороннее агентство по гарантированию инвестиций МАГИ; Банк международных расчетов и Всемирная торговая организация ВТО. Международный банк реконструкции и развития МБРР начал свою деятельность с июня 1946 г. МБРР головной институт в группе Всемирного банка. Руководящие органы...
80158. МЕТОД ФИНАНСОВОГО ПРАВА 46.5 KB
  Метод финансового права - это совокупность юридических приемов, способов и средств, при помощи которых осуществляется правовое регулирование общественных отношений, составляющих предмет данной отрасли.
80160. МИНИСТЕРСТВО ФИНАНСОВ 49.5 KB
  В соответствии с задачами возложенными на Министерство финансов РФ Положением о Министерстве финансов РФ Минфин РФ: а участвует в работе по комплексному анализу развития экономики разрабатывает необходимые меры по финансовому и налоговому стимулированию предпринимательской и другой хозяйственной деятельности в стране способствующие увеличению национального дохода и поступлений в бюджет; б участвует в работе по составлению долговременных и краткосрочных прогнозов функционирования экономики совместно с федеральными органами...
80161. ПОНЯТИЕ НАУКИ ФИНАНСОВОГО ПРАВА 114 KB
  Но в наш век который может быть назван материальным веком по преимуществу особенное внимание обращают на себя те науки которые ведут к практическим результатам напр. науки естественные а также социальные или общественные эти последние потому что они представляют данные для разрешения многих вопросов волнующих современное общество. Неудивительно поэтому что науки занимающиеся исследованием политического строя и законов общественного развития и пользуются теперь наибольшим вниманием.
80162. Понятие и виды эксплуатационно-технической документации на АЭС 103 KB
  Эксплуатационно-техническая документация ЭТД предназначена для изучения конструкции правил эксплуатации ТО и Р планирование и оформление работ по ТО и Р а также для учета работы численности движения и технического состояния оборудования и сооружений АС учета их доработок и ведения отчетности. Пономерная документация предназначена для оформления государственной регистрации разрешения лицензирования каждого ЭБ АС на эксплуатацию учета наработки и технического состояния данного...
80163. Нарушения нормальной эксплуатации, обусловленные нарушением отвода тепла со стороны 2-го контура 191 KB
  Отключение одного ТПН из двух работающих. Полное прекращение подачи питательной воды от ТПН и ВПЭН на все парогенераторы. г Закрывается задвижка пароснабжения ТПН12 от СПП13 RB50S02. м Открываются задвижки пароснабжения ТПН12 от КСН RQ50S0102 и регулятор байпаса RQ50S03.
80164. Нарушения нормальной эксплуатации, обусловленные нарушениями в работе компенсатора давления и подпитки 1-го контура 111.5 KB
  Лекция № 18 Тема: Нарушения нормальной эксплуатации обусловленные нарушениями в работе компенсатора давления и подпитки 1го контура План лекции 1. Внезапный переход на подпитку 1го контура водой с температурой 6070 оС. Отключение трех подпиточных насосов подпиткипродувки первого контура. Указанная ситуация возможна после динамических возмущений реакторной установки приводящих к повышению давления 1 контура до открытия...
80165. Нарушения нормальной эксплуатации, обусловленные нарушениями в работе вспомогательного оборудования реакторной установки 114 KB
  Рассматривается ситуация, связанная с прекращением подачи охлаждающей воды системы промконтура (TF) на потребители системы. Указанное нарушение может явится следствием отказов в цепях блокировок и механических повреждений насосов