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.

Висновки

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


 

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

20539. Уравнение Беллмана для непрерывных процессов 92.5 KB
  Разобьем этот интервал на 2 интервала Рис Где бесконечно малая величена Запишем уравнение 3 на этих 2х отрезках Используя принцип оптимальности: 4 Обозначим через Подставив в 4 Поскольку значение от выбора управления не зависит то ее можем внести под знак минимума и тогда выражение 5 Разделим каждое слагаемое этого уровня на Перейдем к приделу при На основании теоремы о среднем значении интеграла на бесконечно малом отрезке времени Пояснение Рисунок Тогда 5а 6 полная производная этой функции. Вместо Полученное...
20540. Многокритериальные задачи теории принятия решений 31.5 KB
  Проблему решения оптимизационных задач с учетом множества показателей эффективности называют проблемой решения многокритериальных задач или проблемой векторной оптимизации. Формулировка проблемы оптимизации по векторному критерию была в первые сформулирована Вильфредо Парето 1896г. Таким образом проблема векторной оптимизации это проблема принятия компромиссного решения. В настоящие время можно выделить 4 подхода к основной проблеме векторной оптимизации: т.
20541. Множество решений, оптимальных по Парето 153 KB
  Пусть задача принятия решения состоит в максимизации двух противоречивых и не сводимых друг к другу. Кривая АВ определяет для рассматриваемого примера область Парето которая характеризуется тем свойством что любое принадлежащий этой области решения нельзя улучшить одновременно по всем скалярным критерием. Действительно выбрав произвольно точку М в допустимой области решения не лежащую на кривой АВ не трудно убедится что определяемая ее решению можно улучшить по критерию в точке и максимум в точке достигает максимума. Из сказанного...
20542. Основная задача управления 36.5 KB
  Пусть компоненты управления u представляют собой кусочнонепрерывные функции времени с конечным числом точек разрыва или параметрами. Значение вектора управления u принадлежат заданой допустимой области U uU границы которой могут быть функции времени. Задача определения управления гарантирующего выполнения ограничения1 является типичной задачей управления которую назовем ОЗУосновная задача управления.
20543. Геометрическая интерпретация ОЗУ 323.5 KB
  Пусть вектор управления U и вектор функционала J имеет по две компоненты: U=U1 U2; J=J1 J2 Управление принимает свои значения из области U а функционалы J из прямоугольника a1≤J1≤A2; a2≤J2≤A1 Задавая различные управления U1U2 из области U и используя уравнение процесса получим на плоскости функционалов некоторую область В. область U отображается в область В. Пересечение областей А и В это есть область выполнения ограничений при допустимых управлениях U. При заданной области допустимых управлений U реализуется область Au= А∩В...
20544. Методологические основы теории принятия решений. Основные этапы принятия решений 27 KB
  Процесс принятия решения является одним из наиболее сложных .этапы: 1 определить цель принимаемого решения 2 определить возможные решения данной проблемы 3 определить возможные исходы каждого решения 4 оценить каждый исход 5 выбрать оптимальные решения на основе поставленной цели.
20545. Количественный анализ при сбыте продукции 35 KB
  Предполагаемые объемы продаж по ценам: Предполагаемый объем продаж при данной цене Возможная цена за единицу 8 долл. 86 долл. 88 долл.000 Переменный расход 4 долл.
20546. Функция полезности. Определение размеров риска 29.5 KB
  Теория полезности позволяет принимающему решение влиять на результат исходов согласно своим оценкам полезности. Количественно рациональность выбора определяется fей полезности. Теория полезности экспериментально подтверждается в зче о вазах.