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.

Висновки

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


 

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

13069. Птицы – наши друзья. Классный час 21.47 KB
  Классный час на тему: Птицы – наши друзья Цель познакомить учащихся с многообразием пернатых; закреплять знания о пользе птиц которую они приносят человеку; прививать любовь и бережное отношение к окружающей природе; развивать внимание память логическое ...
13070. Классный час. Как жить будем 39 KB
  Классный час Как жить будем Предварительная работа. В конце предыдущего учебного года я диагностировала уровень сформированности детского коллектива в классе при помощи методики А.Н. Лутошкина Какой у нас коллектив. Выяснилось что большинство школьников относят ...
13071. Ваше здоровье в ваших руках. Внеклассное мероприятие 44.5 KB
  Внеклассное мероприятие по теме Ваше здоровье в ваших руках для старших классов классный час Цель: Формирование здорового образа жизни. Сегодня существует целый ряд определений здоровья которые как правило содержат пять критериев определяющих здоровье человек
13072. Здоровье в саду на грядке. Внеклассное мероприятие 33.88 KB
  Конспект пробного занятия по педагогике Тема. Здоровье в саду на грядке Цель: формировать отношение к правильному питанию как составной части здорового образа жизни Основные образовательные задачи: Формировать у обучающихся правильное представление о з...
13073. НИКТО НЕ ЗАБЫТ, НИЧТО НЕ ЗАБЫТО. Внеклассное мероприятие 40 KB
  НИКТО НЕ ЗАБЫТ НИЧТО НЕ ЗАБЫТО Классный час Цели: воспитывать чувство патриотизма; прививать нравственноэстетические качества; обогащать опыт поисковой работы. Оборудование: 1. Карта России; флажки с названиями великих сражений звездочки. 2. Проигрыватель с г...
13074. Наркотики. Внеклассное мероприятие 33 KB
  Планконспект проведения классного часа Тема: Наркотики Рассказ учителя. Тема нашего сегодняшнего разговора серьезная и тяжелая: мы будем говорить о наркотиках. Как повашему что такое наркотики Ответы 5 мин.. Да ребята наркотики это беда разрушение и сме
13075. Технология подготовки и проведения классного часа 104 KB
  Технология подготовки и проведения классного часа. Классный час есть форма прямого общения воспитателя со своими воспитанниками В. П. Созонов Классный час можно назвать специально ориентированной деятельностью способствующей формированию у школьнико...
13076. Первое апреля – День смеха. План – конспект классного часа 46 KB
  План – конспект классного часа в 1а классе 1 апреля – День смеха. Цели: 1 способствовать развитию эмоционально-чувственной сферы детей умение осознанно выражать свои эмоции и чувства навыки эмоционального самоконтроля; знакомство с историей праздника способство...
13077. Классный час «Правила поведения в столовой» 29 KB
  Классный час Правила поведения в столовой Цель: объяснить детям правила поведения в столовой. Учитель: Ребята мы сейчас отправимся в самое вкусное место в школе. Куда же это Ученики: В школьную столовую. Проводится игра. Давайте покажем как идем в столовую В