Долмашняя фонотека

Автор работы: Пользователь скрыл имя, 25 Апреля 2013 в 21:28, курсовая работа

Краткое описание

Домашняя фонотека – это база данных, содержащая сведения о домашней музыкальной коллекции.
Цель выполнения курсового проекта состоит в том, чтобы научится описывать предметную область реального мира – объект и его атрибуты, закрепить навыки использования основных структур данных, способов их описания и основных операций над ними. Освоить разработку удобного пользовательского интерфейса.

Прикрепленные файлы: 1 файл

волохов-КУРСОВАЯ.doc

— 381.50 Кб (Скачать документ)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  1. Технология обработки данных

 

Сразу после запуска  программа загружает данные из файла songs.txt в кольцевой список, отображает загруженные данные на экране и выводит результат загрузки в файл result.txt. Далее программа ждет ввода пользователя.

Если пользователь выбрал сортировку, то программа выполняет сортировку списка простым включением и выводит  результат сортировки.

Если пользователь выбрал поиск, то программа выполняет последовательный поиск в списке и выводит результат  поиска.

Блок схема алгоритма  программы приведена в Приложении 5.

 

Сортировка

 

В программе реализован алгоритм сортировки простым включением. Каждый элемент списка, начиная со второго, последовательно сравнивается с предыдущими элементами. Если предыдущий элемент больше, то элементы меняются местами. Рисунок 2 демонстрирует работу алгоритма сортировки. [4]

 

Программная реализация приведена ниже:

 

Сортировка  простым включением

void RingList::InclusionSort(int byField)

{

    if (Empty())

        return;

 

    Reset();

    while (Next())

    {

        RingListNode* n2 = m_current;

        RingListNode* n1 = n2->GetPrev();

        while (n2 != m_head && n2->GetData()->Compare(n1->GetData(), byField) < 0)

        {

            Swap(n1, n2);

            n1 = n2->GetPrev();

        }

    }

}

 

Блок-схема алгоритма  приведена в Приложении 5.

 

Рис. 2. Графическое представление  алгоритма сортировки

 

Поиск

 

В программе реализован последовательный поиск. Последовательно, начиная с самого первого элемента списка, сравниваем элементы с искомым  значением, пока не будет найден нужный элемент. [3]

 

// Последовательный  поиск

Song* RingList::Search(CString s, int byField)

{

    if (Empty())

        return NULL;

 

    Reset();

    do

    {

        if (Current()->Compare(s, byField) == 0)

            return Current();

    }

    while (Next());

 

    return NULL;

}

 

Блок-схема алгоритма  приведена в Приложении 5.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Заключение

 

В процессе выполнения курсового  проекта я научился описывать  конкретную предметную область, обрабатывать динамические структуры данных  средствами алгоритмического языка  Си++.

Выполняя полученное задание, получил блок-схемы алгоритмов сортировки и поиска данных.

Преимущество блок-схем состоит в их наглядности.

Полученная мной программа  осуществляет чтение данных из текстового файла, сортировку и поиск данных по любому полю, создает выходной файл.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Список литературы

 

  1. Н. Б. Культин, С/С++ в задачах и примерах, СПб: БХВ-Петербург, 2001.
  2. Т. А. Павловская, С/С++. Программирование на языке высокого уровня, СПб: Питер, 2005.
  3. А. А. Кубенский, Структуры и алгоритмы обработки данных, СПб: БХВ-Петербург, 2004.
  4. Л. Г. Гагарина, В. Д. Колдаев, Алгоритмы и структуры данных, М.: Финансы и статистика; ИНФРА-М, 2009.
  5. В. Д. Колдаев, Основы алгоритмизации и программирования, М.: ИД «ФОРУМ» - ИНФРА-М, 2006.
  6. Г. Шилдт, Искусство программирования на С++, БХВ-Петербург, 2005.
  7. В. В. Подбельский, Язык Си++, Финанся и статистика, 2009.
  8. Р. Лафоре, Объектно-ориентированное программирование, Питер, 2003.
  9. В. Кораблев, Visual C++.NET, Питер, 2010.
  10. Х. М. Дейтел, П. Дж. Дейтел, Как программировать на C++, Бином, 2001.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Приложение 1

Графическое описание данных

 


 




 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Приложение 2

Представление данных в памяти ЭВМ

 

Song

Genre

CString

2 байта 

Artist

CString

2 байта

Name

CString

2 байта 

Album

CString

2 байта 

Year

Int

2 байта 


 

 

           

               



 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Приложение 3

Схема списковой структуры

 

 

Рис. 3. 1. Кольцевой список

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Приложение 4

Формат выходного  документа

 

 

Рис. 4. 1. Поиск данных

 

 

Рис. 4. 2. Сортировка данных

 

 

 

Рис. 4. 3. Текстовый файл

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Приложение 5

Схема последовательности обработки данных

 

 

 

 

Рис. 5.1. Блок-схема основной программы

 

Рис. 5. 2. Блок-схема алгоритма сортировки

 

 

Рис. 5. 3. Блок-схема алгоритма поиска

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Приложение 6

Листинг программы

 

Music.h

 

#pragma once

 

#include "resource.h"  // main symbols

 

class CMusicApp : public CWinApp

{

public:

CMusicApp();

 

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CMusicApp)

public:

virtual BOOL InitInstance();

//}}AFX_VIRTUAL

 

// Implementation

 

//{{AFX_MSG(CMusicApp)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

 

Music.cpp

 

#include "stdafx.h"

#include "Music.h"

#include "MusicDlg.h"

 

BEGIN_MESSAGE_MAP(CMusicApp, CWinApp)

//{{AFX_MSG_MAP(CMusicApp)

//}}AFX_MSG

ON_COMMAND(ID_HELP, CWinApp::OnHelp)

END_MESSAGE_MAP()

 

CMusicApp::CMusicApp()

{

}

 

CMusicApp theApp;

 

BOOL CMusicApp::InitInstance()

{

// Standard initialization

 

#ifdef _AFXDLL

Enable3dControls();   // Call this when using MFC in a shared DLL

#else

Enable3dControlsStatic(); // Call this when linking to MFC statically

#endif

 

CMusicDlg dlg;

m_pMainWnd = &dlg;

int nResponse = dlg.DoModal();

if (nResponse == IDOK)

{

}

else if (nResponse == IDCANCEL)

{

}

 

// Since the dialog has been closed, return FALSE so that we exit the

//  application, rather than start the application's message pump.

return FALSE;

}

 

MusicDlg.h

 

#pragma once

 

#include "RingList.h"

 

class CMusicDlg : public CDialog

{

// Construction

public:

CMusicDlg(CWnd* pParent = NULL); // standard constructor

 

// Dialog Data

//{{AFX_DATA(CMusicDlg)

enum { IDD = IDD_MUSIC_DIALOG };

CListCtrl m_list1;

CComboBox m_combo2;

CComboBox m_combo1;

CString m_edit1;

//}}AFX_DATA

 

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CMusicDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

 

// Implementation

protected:

HICON m_hIcon;

 

// Generated message map functions

//{{AFX_MSG(CMusicDlg)

virtual BOOL OnInitDialog();

afx_msg void OnButton1();

afx_msg void OnButton2();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

 

private:

 

    RingList m_songs;

 

    // Заполнить таблицу из списка

    void FillTable();

 

    // Выделить строку таблицы

    void SelectRow(Song* s);

};

 

MusicDlg.cpp

 

#include "stdafx.h"

#include "Music.h"

#include "MusicDlg.h"

 

CString columnNames[] = {"Жанр", "Исполнитель", "Название", "Альбом", "Год"};

 

CMusicDlg::CMusicDlg(CWnd* pParent /*=NULL*/)

: CDialog(CMusicDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CMusicDlg)

m_edit1 = _T("");

//}}AFX_DATA_INIT

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

 

void CMusicDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CMusicDlg)

DDX_Control(pDX, IDC_LIST1, m_list1);

DDX_Control(pDX, IDC_COMBO2, m_combo2);

DDX_Control(pDX, IDC_COMBO1, m_combo1);

DDX_Text(pDX, IDC_EDIT1, m_edit1);

//}}AFX_DATA_MAP

}

 

BEGIN_MESSAGE_MAP(CMusicDlg, CDialog)

//{{AFX_MSG_MAP(CMusicDlg)

ON_BN_CLICKED(IDC_BUTTON1, OnButton1)

ON_BN_CLICKED(IDC_BUTTON2, OnButton2)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

 

BOOL CMusicDlg::OnInitDialog()

{

CDialog::OnInitDialog();

 

SetIcon(m_hIcon, TRUE);   // Set big icon

SetIcon(m_hIcon, FALSE);  // Set small icon

 

// Стиль таблицы

    m_list1.SetExtendedStyle(m_list1.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

    // Добавляем  столбцы в таблицу

    m_list1.InsertColumn(0, columnNames[0], LVCFMT_LEFT, 100);

    m_list1.InsertColumn(1, columnNames[1], LVCFMT_LEFT, 100);

    m_list1.InsertColumn(2, columnNames[2], LVCFMT_LEFT, 100);

    m_list1.InsertColumn(3, columnNames[3], LVCFMT_LEFT, 100);

    m_list1.InsertColumn(4, columnNames[4], LVCFMT_LEFT, 100);

 

    // Названия столбцов для сортировки

    m_combo1.AddString(columnNames[0]);

    m_combo1.AddString(columnNames[1]);

    m_combo1.AddString(columnNames[2]);

    m_combo1.AddString(columnNames[3]);

    m_combo1.AddString(columnNames[4]);

    m_combo1.SetCurSel(0);

 

    // Названия  столбцов для поиска

    m_combo2.AddString(columnNames[0]);

    m_combo2.AddString(columnNames[1]);

    m_combo2.AddString(columnNames[2]);

    m_combo2.AddString(columnNames[3]);

    m_combo2.AddString(columnNames[4]);

    m_combo2.SetCurSel(0);

 

    // Загружаем описание режущего инструмента из файла cutters.txt

    try

    {

        fstream f("songs.txt", ios::in);

        while (!f.eof())

        {

            CString s;

            f.getline(s.GetBuffer(1000), 1000);

            s.ReleaseBuffer();

            if (s.GetLength() > 0)

            {  

                Song* n = new Song(s);

                m_songs.Insert(n);

            }

        }

        f.close();

    }

    catch (std::exception& e)

    {

        MessageBox(e.what(), "Ошибка", MB_OK|MB_ICONERROR);

    }

 

    // Показываем  список

    FillTable();

 

    // Результат  загрузки

    try

    {

        fstream f("result.txt", ios::out | ios::trunc);

        f << "ЗАГРУЗКА файла \"songs.txt\"" << endl;

        m_songs.OutToStream(f);

    }

    catch (std::exception& e)

    {

        MessageBox(e.what(), "Ошибка", MB_OK|MB_ICONERROR);

    }

 

 

return TRUE;  // return TRUE  unless you set the focus to a control

}

 

void CMusicDlg::OnButton1()

{

    // Индекс  поля для сортировки

    int byField = m_combo1.GetCurSel();

 

    // Сортируем

    m_songs.InclusionSort(byField);

 

    // Показываем

    FillTable();

 

    // результат  сортировки

    try

    {

        fstream f("result.txt", ios::out | ios::app);

        f << endl << "СОРТИРОВКА по полю: \"" << columnNames[byField] << "\"" << endl;

        m_songs.OutToStream(f);

    }

    catch (std::exception& e)

    {

        MessageBox(e.what(), "Ошибка", MB_OK|MB_ICONERROR);

    }

 

}

 

void CMusicDlg::OnButton2()

{

    // Считываем  значения из элементов управления

    UpdateData(TRUE);

 

    // индекс  поля для поиска

    int byField = m_combo2.GetCurSel();

 

    // ищем

    Song *s = m_songs.Search(m_edit1, byField);

 

    // Выделяем

    SelectRow(s);

 

    // результат  поиска

    try

    {

        fstream f("result.txt", ios::out | ios::app);

        f << endl << "ПОИСК значения \"" << m_edit1 << "\" в поле \"" << columnNames[byField] << "\"" << endl;

        m_songs.OutToStream(f);

        if (s)

        {

            f << "НАЙДЕНО: " << endl;

            s->OutToStream(f);

        }

        else

        {

            f << "НЕ НАЙДЕНО" << endl;

        }

    }

    catch (std::exception& e)

    {

        MessageBox(e.what(), "Ошибка", MB_OK|MB_ICONERROR);

    }

}

 

// Заполнить  таблицу из списка

void CMusicDlg::FillTable()

{

    // Чистим  список

    m_list1.DeleteAllItems();

    // Добавляем элементы в список

    if (!m_songs.Empty())

    {

        m_songs.Reset();

        int n = 0;

        do

        {

            Song* s = m_songs.Current();

            m_list1.InsertItem(n, s->GetGenre());

            m_list1.SetItemText(n, 1, s->GetArtist());

            m_list1.SetItemText(n, 2, s->GetName());

            m_list1.SetItemText(n, 3, s->GetAlbum());

            CString year;

            year.Format("%i", s->GetYear());

            m_list1.SetItemText(n, 4, year);

            m_list1.SetItemData(n, (DWORD)s);

            n++;

        }

        while (m_songs.Next());

    }

}

 

// Выделить строку  таблицы

void CMusicDlg::SelectRow(Song* s)

{

    int count = m_list1.GetItemCount();

    for (int i = 0; i < count; i++)

    {

        DWORD data = m_list1.GetItemData(i);

        if (data == (DWORD)s)

        {

            m_list1.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);

            m_list1.EnsureVisible(i, TRUE);

            break;

        }

    }

}

 

RingList.h

 

#pragma once

Информация о работе Долмашняя фонотека