Організація бібліотек функцій для опрацювання даних у файлах засобами С++

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Вступ

Метою виконання цієї курсової роботи є формування знань та навиків розробки алгоритмів і програм алгоритмічною мовою високого рівня C++ в об'єктно-орієнтованому середовищі програмування C++ Builder.

Середовище професійної розробки C++ Builder є доволі простою в освоєнні системою і дозволяє створювати доволі якісні за обсягом та продуктивністю програмні продукти. Це середовище поєднує в собі потужні засоби об'єктно-орієнтовного програмування (ООП) мови С++, інтегроване середовище програмування (IDE — Integrated Development Environment) та розвинуті візуальні засоби RAD (від англ. Rapid Application Development — швидка розробка додатків) для швидкої розробки графічного інтерфейсу програмних проектів. Все це у комплексі дозволить забезпечити простий, зрозумілий і зручний інтерфейс створюваних програмних продуктів.

Засвоєння методології програмування з розміщенням на спеціальних формах об'єктів з настроюванням їх властивостей та поведінки їхнього застосування є невід'ємною складовою успішності розробки сучасного програмного забезпечення. При цьому розробник повинен:

— вільно володіти візуальним середовищем сучасної системи програмування з використанням бібліотеки візуальних компонент (VCL);

— вміти визначити архітектуру програми, тобто розбивати складну задачу на елементарні складові і задавати варіанти їх комбінування;

— вміти бачити задачу одночасно на різних рівнях деталізації, тобто розробник програмного забезпечення повинен вільно переходити від опису задачі у загальних поняттях до суті нижчого рівня, що стоїть за цими поняттями;

— вміти уявляти собі процес, який проектується, у динаміці, оскільки, дані, що оброблюються, у деякий момент часу можуть мати одні значення і взаємозв'язки, а у наступний момент деякі з них можуть змінитися;

— вміти бачити далі за одну програму, що розробляється в даний момент, тобто вміти враховувати широке оточення даної частини задачі і можливість її включення до деякої загальної системи;

— вміти узагальнювати типові ситуації, тобто необхідно уміти знаходити в програмі ідейно однорідні ділянки;

— вміти застосовувати і комбінувати добре відомі прийоми програмування і типові алгоритми, тобто більшість нових ідей повинна знаходитися в тісній взаємодії з вже відомими ідеями і методами;

— вміти модифікувати програму, оскільки постановка задачі в процесі розв’язування уточнюється і розроблена програма, яка вже написана, може не розв’язувати правильно поставлену задачу;

— налагоджувати програми, тобто знаходити помилки в програмі. Така робота містить елементи розв’язування головоломок;

— вміти модифікувати програми: модифікація програм є досить поширеною задачею програмування. Успішність у вирішенні задачі модифікації можна вважати одним з критеріїв розуміння програм.

Використання ООП дозволяє забезпечувати високу ступінь модульності програм. Способи модульної організації програм і взаємодії її складових у значній мірі спрощують написання і розуміння програмних проектів.

Робота складається з чотирьох розділів.

Перший розділ присвячено розповіді коротких теоретичних відомостей про програму С++ Builder.

В другому розділі наведено програмний код обох складових створюваної бібліотеки користувача: заголовного файлу та файлу реалізації. Кожна з чотирьох занесених у бібліотеку функцій містить детальні коментарі.

В третій розділ внесено опис програмного коду для елементів керування головної форми та її вигляд (скріншоти).

В четвертому розділі розглянуто етапи створення та доручення до проекту додаткових форм. Наведено скріншоти цих форм та програмні коди для ініціалізації форм та для елементів керування, розміщених ницих формах.

Створений програмний багатоформовий проект для організації бібліотек функцій опрацювання даних у файлах засобами С++ було створено, протестовано та перевірено в комп’ютерному класі 243 на кафедрі інформаційних технологій академії.

програма бібліотека форма builder

1. Теоретичні відомості

В процесі розв’язання складних задач часто виникає необхідність у багаторазовому обчисленні за одними й тими ж виразами за різних початкових даних. В таких випадках для більш ефективного програмування обчислень, які багаторазово повторюються, оформлюються у вигляді самостійного програмного модуля, який багаторазово, в міру необхідності, може бути використаний. Така автономна частина програми, яка реалізує певний алгоритм і дозволяє звертатись до неї з різних частин основної (головної) програми, називається функцією (підпрограмою). Підпрограми підвищують продуктивність праці, економлять пам’ять, роблять всю програму більш наочною і спрощують розроблення великих програм. Кожна підпрограма визначається лише один раз, а виконуватись може багаторазово.

Використання функцій веде до спрощення структури програми, дозволяє уникнути написання аналогічних частин коду, оскільки функцію записують один раз, а викликати її на виконання можна багато разів з різних точок програми і з різними аргументами.

У загальному випадку функція задається своїм ім'ям. Вона може приймати параметри і повертати значення.

Функція починає виконуватися у момент виклику. Будь-яка функція повинна бути оголошена і визначена. Оголошення функції повинне знаходитися в тексті раніше її виклику для того, щоб компілятор міг здійснити перевірку правильності виклику.

В оголошенні функції (прототипі, заголовку) описується її інтерфейс. Він містить всі дані про те, яку інформацію повинна одержувати функція (список формальних параметрів) і яку інформацію вона повертає. Визначення функції містить, окрім оголошення, тіло функції, що є послідовністю операторів і описів у фігурних дужках:

тип ім'я ([список_параметрів])

{тіло_функції}

Тип значення, що повертається, може бути будь-яким, окрім масиву і функції (але може бути покажчиком на масив або функцію). Якщо функція не повинна повертати значення, указується тип void.

Список параметрів визначає величини, які вимагається передати у функцію при її виклику. Елементи списку параметрів розділяються комами. Для кожного параметра, переданого у функцію, указуються тип і ім'я (у оголошенні імена можна опускати).

Тіло функції - дії, які виконує функція.

Повернення значення з функції у функцію, яка викликає її, реалізується оператором

return вираз;

Якщо функція описана як void, вираз не указується.

Приклади:

int f1 () {return 1;} // правильно — функція типу int повертає 1

void f2 () {return 1;} // неправильно, f2 не повинна повертати значення

double f3 {return 1;} // правильно, 1 перетвориться до типу double.

Щоб використовувати функцію, не треба знати, як вона працює, — достатньо знати, як її викликати. Для виклику функції потрібно вказати її ім'я, за ним в круглих дужках через кому перераховуються аргументи, які передаються. У ролі фактичних параметрів можуть виступати відповідно до їх типу константи, змінні або вирази. Виклик функції може знаходитися в будь-якому місці програми, де за синтаксисом допустимий вираз того типу, який формує функція. Якщо тип значення, що повертається, не void, вона може входити до складу виразів або, в окремому випадку, розташовуватися в правій частині оператора присвоєння.

Параметри, перелічені в заголовку опису функції, називаються формальними, а записані в операторі виклику функції - фактичними. При виклику функції в першу чергу обчислюються вирази, що стоять на місці фактичних параметрів; потім в стеку виділяється пам’ять під формальні параметри функції відповідно до їх типу і кожному з них привласнюється значення відповідного фактичного параметра. При цьому перевіряється відповідність типів і, при необхідності, виконуються їх перетворення. При невідповідності типів видається діагностичне повідомлення.

У визначенні, в оголошенні і при виклику однієї і тієї ж функції потрібно дотримуватися наступних правил щодо параметрів:

порядок проходження параметрів повинен бути однаковим;

тип відповідних параметрів у визначенні і оголошенні повинен бути однаковим;

типи фактичних параметрів повинні співпадати з типами відповідних формальних параметрів або бути такими, щоб можна було їх неявно перетворити до типу формальних параметрів.

2. Бібліотека користувача

Заголовний файл Bibl. h

#ifndef libH

#define libH

#include «DateUtils. hpp» // долучення бібліотеки для роботи з типом даних Дата-Час

#include «stdio. h» // библиотека работы с файлами

// -

// глобальне оголошення файлових змінних (для текстового і бінарного файлів)

FILE *fT, *fB;

/* глобальне оголошення структури data з такими полями:

Naimen[30] - прізвище

DataProizvod[20] - посада

SrokGodnosti[20] - датта підписання контракту

NomerSerii[20] - строк дії контракту

float Cena — зарплата

*/

struct data

{

char Naimen[30], DataProizvod[20], SrokGodnosti[20], NomerSerii[20];

float Cena;

};

// глобальне оголошення змінної типу data

data dan;

// глобальне оголошення змінних для зберігання імен бінарного і текстового файлів

char *nB= «kurs. dat»;

char *nT= «kurs. txt»;

// прототипи функцій

int kol (FILE **f); // кількість записів (структури) у файлі

void zapis (FILE **FT, FILE **FB); // створення txt-файла з бінарного умові

// по заданій (Завдання стовпчик 4)

void formir (FILE **f, data mass[], int k); // читання з бін. файла і формування масиву

// структур даних

void sort (data mass[], int k); // сортування (Завдання стовп. 3)

#endif

Файл реалізації Bibl. cpp

#pragma hdrstop

#include «Bibl. h»

#pragma package (smart_init)

// -

// функція визначення кількості записів

int kol (FILE **f)

{

fseek (*f, 0,2); // встановити курсор у кінець файла

int n= ftell (*f)/sizeof (data); // визначити кількість структур у файлі

fseek (*f, 0,0); // перемістити курсор на початок файла

return n;

}

// -

// функція формування масиву записів void formir (FILE **f, data mass[], int k)

{

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

fread (& mass[i], sizeof (dan), 1, *f); // зчитати один запис з файла і записати його як елемент масиву

}

// -

// функція сортування масиву за зростанням по полю прізвища void sort (data mass[], int k)

{

int i, j; data temp;

for (i=0; i< k-1; i++)

for (j=i+1; j< k; j++)

if (mass[i]. Naimen < mass[j]. Naimen)

{

temp = mass[i];

mass[i] = mass[j];

mass[j] = temp;

}

}

// -

// Функція запису до текстового файла даних з бінарного файла по заданій умові (Відомості про товари, вироблених більше місяця назад)

void zapis (FILE **FT, FILE **FB)

{

// допоки не дійшли до кінця бінарного файла зчитувати дані з нього

while (fread (& dan, sizeof (dan), 1, *FB)> 0)

// перевірка умови (завдання стовп. 4) і, якщо вона виконується,

// записати дані до текстового файла

if (MonthSpan (Now (), StrToDate (dan. DataProizvod))> 1)

fprintf (*FT, «%s % s % s % s % 5. 2fn»,&dan. Naimen,& dan. DataProizvod,& dan. SrokGodnosti,& dan. NomerSerii, dan. Cena);

}

3. Основний модуль проекту

Головна форма проекту має вигляд:

Текст програмного коду для командних елюентів головної форми:

include < vcl. h>

#pragma hdrstop

#include «Unit1. h»

#include «Bibl. h» // Долучення заголовного файла власної бібліотеки

// -

#pragma package (smart_init)

#pragma resource «*. dfm»

TForm1 *Form1;

// -

__fastcall TForm1: TForm1 (TComponent* Owner)

: TForm (Owner)

{

}

// -

// Функція запису до комірок певного компонента StringGrid даними полів структури

void setkaData (TStringGrid *Sg, data d, int N)

{

Sg-> Cells[0] [N]=IntToStr (N); // порядковий номер

Sg-> Cells[1] [N]=(String) d. Naimen;

Sg-> Cells[2] [N]=(String) d. Dataproizvod;

Sg-> Cells[3] [N]=(String) d. SrokGodnosti;

Sg-> Cells[4] [N]=(String) d. NomerSerii;

Sg-> Cells[5] [N]=FormatFloat («0. 00», d. Cena);

}

// -

// Функція запису до фіксованого рядка (певного компонента StringGrid) заголовками стовбців

void setkaTitle (TStringGrid *Sg)

{

Sg-> Cells[0] [0]= «№»;

Sg-> Cells[1] [0]= «Назва»;

Sg-> Cells[2] [0]= «Дата виробництва»;

Sg-> Cells[3] [0]="Срок придатності

Sg-> Cells[4] [0]= «Номер серії»;

Sg-> Cells[5] [0]= «Ціна»;

}

// -

// Перша вкладка: Запис даних до бінарного файла (кнопка «Записати у файл«)

void __fastcall TForm1: Button1Click (TObject *Sender)

{

// Введення даних з приведенням типів

strcpy (dan. Naimen, Edit1-> Text. c_str ());

strcpy (dan. DataProizvod, Edit2-> Text. c_str ());

strcpy (dan. SrokGodnosti, Edit3-> Text. c_str ());

strcpy (dan. NomerSerii, Edit4-> Text. c_str ());

dan. Cena= StrToFloat (Edit5-> Text);

fB=fopen (nB, «ab»); // відкрити бінарний файл для запису у кінець файла

fwrite (& dan, sizeof (dan), 1, fB); // записати структуру у бінарний файл

fclose (fB); // закрити бінарний файл

}

// -

// Друга вкладка: Перегляд вмісту бінарного файла (кнопка «Перегляд»)

void __fastcall TForm1: Button2Click (TObject *Sender)

{

SetkaTitle (SG2); // підписати стовпці SG2 (StringGrid2)

fB = fopen (nB, «rb»); // відкрити бінарний файл для зчитування

int k=1;

while (fread (& dan, sizeof (dan), 1, fB) > 0)

{

setkaData (SG2, dan, k); // записати дані до SG2 у k-рядок

k++;

}

SG2-> RowCount = k; // встановити потрібну кількість рядків

fclose (fB); // закрити файл

}

// -

// Третя вкладка: Завдання — виведення відомостей про товари термін придатності яких закінчується на протязі 5 днів.

void __fastcall TForm1: Button3Click (TObject *Sender)

{

fB = fopen (nB, «rb»);

int k=1;

while (fread (& dan, sizeof (dan), 1, fB) > 0)

if ((DaySpan (Now (), StrToDate (dan. SrokGodnosti))< 5)

{

SetkaData (SG3, dan, k);

k++;

}

if (k> 1)

{

SG3-> RowCount=k;

setkaTitle (SG3);

}

else ShowMessage («Товари із закінченням терміну придатності на протязі 5 днів відсутні»);

fclose (fB);

}

// -

// Четверта вкладка: Сортування масиву (завдання відсортучвати за прізвищем за зростанням)

void __fastcall TForm1: Button4Click (TObject *Sender)

{

int i, j, k;

fB = fopen (nB, «rb»); // відкрити бінарний файл для зчитування

k=kol (& fB); // визначити кількість записів у файлі

data *mass = new data[k]; // виділити місце у пам’яті під масив структур із k елементів

formir (& fB, mass, k); // виклик функції «Заповнення масиву даними з файла»

sort (mass, k); // виклик функції «Сортування»

for (i=0; i< k; i++) // вивести відсортовані дані

setkaData (SG4, mass[i], i+1);

setkaTitle (SG4); // підписати стовпці таблиці SG4

SG4-> RowCount=k+1; // встановити потрібну кількість рядків таблиці SG4

delete [] mass; // звільнити динамічну пам’яті, виділену під масив структур

fclose (fB); // закрити бінарний файл

}

// -

// Створення текстового файлу з бінарного по заданій умові (завдання Стовп. 4)

void __fastcall TForm1: Button5Click (TObject *Sender)

{

Memo1-> Clear (); // підготовка (очищення) компонента для виведення результатів

fT=fopen (nT, «wt»); // відкрити текстовий файл

fB=fopen (nB, «rb»); // відкрити бінарний файл

// Виклик функції для записування до текстового файла даних за умовою

zapis (& fT, & fB);

fclose (fT); // закрити текстовий файл

fclose (fB); // закрити бінарний файл

Memo1-> Lines->LoadFromFile (nT); // завантажити вміст текстового файла до Memo1

}

// -

// Робота з MainMenu

// -

// Меню — Очищення файлів — Бінарний

void __fastcall TForm1: N5Click (TObject *Sender)

{

fB = fopen (nB, «wb»);

if (fT == NULL) {ShowMessage («Помилка роботи з файлом»); return; }

fclose (fB);

}

// -

// Меню — Очищення файлів — Текстовий

void __fastcall TForm1: N6Click (TObject *Sender)

{

fT = fopen («kurs. txt», «wt»);

if (fT == NULL) {ShowMessage («Помилка роботи з файлом»); return; }

fclose (fT);

}

// -

// Вихід (Меню)

void __fastcall TForm1: N7Click (TObject *Sender)

{Close ();

}

4. Створення додаткових форм

Форми «Про автора» та «Завдання»

Для забезпечення інформаційної частини проекту, а саме надання інформації про автора роботи та для ознайомлення з постановкою завдання, додамо, послідовно ще дві форми.

Почнемо з форми, яка відображає авторство проекту. Для цього в С++Builder виконаємо команду File / New Form. У діалоговому вікні NewItems на закладці Forms виберемо форму, яка називається AboutBox, і настигнемо OК. На цій формі змінимо, при необхідності, компоненти Label, які відображатимуть інформацію про авторство, тему і керівника роботи. Зовнішній вигляд форми:

Після внесення змін необхідно приєднати створену форму до першого модуля і створити програмний код для пункту меню «Про автора»:

void __fastcall TForm1: AvtorClick (TObject *Sender)

{

AboutBox-> ShowModal ();

}

В даному варіанті виклику допоміжної форми вона стає «модальною». Це означає, що завершення роботи з формою здійснюється при натисканні кнопки OК і при цьому жодного події для цієї кнопки визначати не потрібно.

Для виведення інформації про постановку математичної задачі створимо ще одну допоміжну форму, на яку встановимо такі компоненти:

1) MainMenu (закладка Standart) — для створення меню на новій формі;

2) RichEdit (закладка Win32) — для перегляду даних, записаних у текстовому редакторі Word у форматі RTF. Цей компонент є основним вікном для редагування користувачем текстових файлів. Атрибути форматування задаються властивістю SelAttributes. Якщо у вікні виділено фрагмент тексту, то властивість SelAttributes визначає формат саме цього фрагмента. А якщо виділеного тексту немає (ніякий фрагмент не виділено), то властивість SelAttributes визначає фрагмент того тексту, який буде вводитися, починаючи з поточної позиції курсору;

3) OpenDialog, SaveDialog (закладка Dialogs) — компоненти для відкриття і збереження файлу після його коригування;

4) FontDialog (закладка Dialogs) — для зміни стилю та розміру шрифту при форматуванні даних у RichEdit.

Компоненти OpenDialog, SaveDialog, FontDialog є невидимими, тому їх можна встановлювати у будь-якому місці на формі. Зовнішній вигляд форми після встановлення:

void __fastcall Tform6: view_zadanClick (TObject *Sender) // Перегляд завдення

char * ffname;

OpenDialog1-> Filter= «Doc files (*. rtf)

// -

void __fastcall Tform6: Font_StyleClick (TObject *Sender) // Зберегти зміни

{

FontDialog1-> Execute ();

RichEdit1-> SelAttributes->Assign (FontDialog1-> Font);

}

// -

void __fastcall TForm6: Savе_modClick (TObject *Sender) // Змінити шрифт і стиль

char * ffname;

SaveDialog1-> Filter= «Doc files (*. rtf)

// -

void __fastcall TForm7: ExitClick (TObject *Sender) // Вихід

{int r;

if (RichEdit1-> Modified) // якщо текст було змінено,

{r = MessageDlg («Текст було змінено. nЗберегти зміни?»,

mtWarning, TMsgDlgButtons () < < mbYes < < mbNo, 0);

if (r == mrYes) // користувач клацнув на кнопці Yes

Sav_modClick (Sender);

}

RichEdit1-> Clear ();

Close ();

}

Створення заставки до курсової роботи

Створимо форму-заставку до проекту, яка міститиме зображення (компонент Image) та коротку інформацію про програму, що запускається. Через певний час форма-заставка сама зникатиме.

Отже, на допоміжній формі (Form3) встановимо компоненти Image (закладка Additional) і TTimer (закладка System). Властивість Interval для компонента TTimer встановимо рівним 3000, що становить 3 секунди.

void __fastcall TForm3: TTimer (TObject *Sender)

{

Close ();

}

Властивість для форми BorderStyle встановимо в bsNone.

Щоб розташувати тематичну картинку в компоненті Image, слід клацнути на трьох крапках властивості Picture і в діалоговому вікні Picture Editor виконати команду Load, після чого підібрати картинку і натиснути OK. Щоби зображення заповнило весь простір, відведений компонентом Image, рекомендується встановити властивість Stretch в значення True.

Далі створимо шаблон події onCreate головної форми проекту:

void __fastcall TForm1: FormCreate (TObject *Sender)

{

Form2=new TForm2 (this);

Form2-> ShowModal ();

Form2-> Free ();

}

Залишилось приєднати створений модуль до головного модуля директивою #include.

Висновки

Дана курсова робота дозволила мені набути практичні навички поводження із програмою С++ Builder, а особливо зі створення бібліотек підпрограм. Я навчився застосовувати і комбінувати прийоми програмування, складати алгоритми програм, налагоджувати їх. Також я навчився створювати додаткові інформаційні структури та форми як то наприклад: заставки, форми авторства та форми із завданням.

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

1) Швайко І.Г., Буката Л. Н. Курсова робота з інформатики «Створення бібліотек функцій для опрацювання масивів», модуль 3. — Одесса, ОНАЗ, 2007.

2) С++. Основи програмування. Теорія та практика: підручник / [О.Г. Трофименко, Ю. В. Прокоп, І.Г. Швайко, Л. М. Буката та ін. ]; за ред. О. Г. Трофименко. — Одеса: Фенікс, 2010. — 544 с.

3) С++. Теорія та практика: навч. посібник / [О.Г. Трофименко, Ю. В. Прокоп, І. Г. Швайко, Л. М. Буката та ін. ]; за ред. О. Г. Трофименко. — Одеса: ВЦ ОНАЗ, 2011. — 587 с.

4) Трофименко О. Г., Буката Л. М., Леонов Ю. Г. Алгоритмізація обчислювальних процесів і особливості програмування в С++: Метод. посібник до лаб. і практ. занять з дисципліни «Комп'ютерна техніка та організація обчислювальних робіт». — Одеса: ІЦ ОНАЗ, 2009. — Мод. 2, ч. 2. — 93 с.

5) Трофименко Е. Г. Информатика. Модуль 2. Часть 1. Программирование задач с циклами и масивами: Конспект лекций. — Одесса: ИЦ ОНАС, 2007. — 40 с.

6) Трофименко Е. Г. Информатика. Модуль 2. Часть 2. Программирование задач с циклами и масивами: Метод. указания к лаб. и практ. раб. — Одесса: ИЦ ОНАС, 2007. — 60 с.

7) Информатика. Модуль 3. Часть 2. Программирование задач со структурированными типами данных: Метод. указания к лаб. и практ. раб. по информатике // Ю. Г. Леонов, Ю. В. Прокоп, И. Г. Швайко, Е. Д. Шпинова, В. В. Ясинський. — Одесса: ОНАС, 2008. — 80 с.

8) Информатика. Модуль 4. Часть 2. Программирование задач со списками и файлами. Объектно-ориентированное программирование: Метод. указания к лаб. и практ. раб. // Швайко И. Г., Прокоп Ю. В., Леоненко Л. Л., М. В. Северин. — Одесса: ОНАС, 2007. — 104 с.

9) Архангельский А. Я., Тагин М. А. Программирование в С++ Builder 6 и 2006. — М.: «Бином», 2007. — 1184 с.

ПоказатьСвернуть
Заполнить форму текущей работой