C++_Информатика_КР_Швайко_Ясинский

advertisement
Министерство образования и науки Украины
Одесская национальная академия связи им. А. С. Попова
Кафедра информационных технологий
Курсовая работа
по дисциплине Информатика
модуль 3
Задания и методические указания
по выполнению
для студентов
технических специальностей академии
Одесса 2013
Вступление
Методическое пособие содержит теоретические сведения и указания по выполнению
курсовой работы по дисциплине «Информатика», а также задания двух уровней сложности,
которые позволяют всесторонне усвоить работу с библиотеками подпрограммам, структурами,
бинарными и текстовыми файлами, динамическими массивами, типом данных дата-время на
языке С++, создание вспомогательных форм и приложений. Для самостоятельного выполнения
курсовой работы в пособии приведена последовательность выполнения этой работы за
компьютером.
Пособие предназначено для приобретения практических навыков программирования на
языке С++ и работы в среде Builder, студентами всех специальностей академии, изучающих
дисциплину «Информатика».
2
Курсовое задание
(базовый уровень)
1.
2.
3.
4.
5.
6.
7.
8.
Создать библиотеку пользователя, в заголовочном файле которой описать поля
структуры, приведенными в таблице (согласно варианту).
С помощью средств С++Builder создать бинарный файл. Произвести запись в файл
заданных структур (не менее 10-ти записей).
Создать (сформировать) динамический массив структур из данных бинарного файла.
Определение количества элементов в массиве и его формирование должны
осуществляться в отдельных функциях, расположенных в созданной библиотеке
пользователя.
Отсортировать полученный массив по одному из полей (согласно заданию). Вывести
данный массив в компонент StringGrid.
Вывести в компоненты StringGrid содержимое бинарного файла, отсортированного
массива и данные, соответствующие заданию.
С помощью средств С++Builder создать текстовый файл. Произвести запись в файл
данных согласно условию. Вывести содержимое текстового файла в компонент
Memo.
Создать заставку.
Вывести сведения о задании и авторе.
Варианты индивидуальных заданий приведены в таблице 5.
3
Теоретические сведения.
Библиотеки
Библиотекой называются файлы, которые содержат подпрограммы-функции. Файл
организован таким образом, что каждую из подпрограмм можно из библиотеки присоединить к
любой „внешней” программе. Кроме функций, библиотеки могут содержать объявления
констант, переменных и типов, которыми тоже может пользоваться любая внешняя программа.
Обычно в библиотеку включают подпрограммы, которые часто используются в проектах и
(или) являются важными для тех или иных задач.
Библиотека пользователя состоит из двух файлов. Один из них называется
заголовочным. Он может содержать определения типов, констант, объявления функций.
Заголовочные файлы имеют расширение .h. Другой файл содержит определения функций,
прототипы которых указаны в заголовочном файле, то есть реализацию. Он называется файлом
реализации и имеет расширение .cpp.
Функции.
В С++ одна задача может быть разделена на несколько более простых и понятных задач
при помощи функций. Использование функций ведет к упрощению структуры программы,
позволяет избежать написания аналогичных частей кода, поскольку функцию записывают один
раз, а вызывать ее на выполнение можно многократно из разных точек программы и с
различными аргументами.
В общем случае функция задается своим именем. Она может принимать параметры и
возвращать значение.
Функция начинает выполняться в момент вызова. Любая функция должна быть
объявлена и определена. Объявление функции должно находиться в тексте раньше ее вызова.
В объявлении функции (прототипе, заголовке) описывается ее интерфейс. Он содержит
все данные о том, какую информацию должна получать функция (список формальных
параметров) и какую информацию она возвращает. Определение функции содержит, кроме
объявления, тело функции, представляющее собой последовательность операторов и описаний
в фигурных скобках:
тип имя ([список_параметров])
{тело_функции}
Тип возвращаемого значения может быть любым, кроме массива и функции (но может
быть указателем на массив или функцию). Если функция не должна возвращать значение,
указывается тип void.
Список параметров определяет величины, которые требуется передать в функцию при ее
вызове. Элементы списка параметров разделяются запятыми. Для каждого параметра,
передаваемого в функцию, указываются тип и имя (в объявлении имена можно опускать, но это
не приветствуется).
Тело функции – действия, которые производит функция.
Возврат значения из функции в вызывавшую ее функцию реализуется оператором
return выражение;
Если функция описана как void, выражение не указывается.
Для вызова функции нужно указать ее имя, за которым в круглых скобках через запятую
перечисляются передаваемые аргументы. В качестве фактических параметров могут выступать
в соответствии с их типом константы, переменные или выражения. Вызов функции может
находиться в любом месте программы, где по синтаксису допустимо выражение того типа,
который формирует функция. Если тип возвращаемого значения не void, она может входить в
состав выражений или, в частном случае, располагаться в правой части оператора
присваивания.
4
Параметры, перечисленные в заголовке описания функции, называются формальными, а
записанные в операторе вызова функции – фактическими. В определении, в объявлении и при
вызове одной и той же функции нужно придерживаться следующих правил относительно
параметров:
порядок следования параметров должен быть одинаковым;
тип соответствующих параметров в определении и объявлении должен быть
одинаковым;
типы фактических параметров должны либо совпадать с типами соответствующих
формальных параметров, либо быть такими, чтобы можно было их неявно преобразовать к типу
формальных параметров.
Все величины, описанные внутри функции, а также ее параметры, являются локальными.
Это означает, что другим функциям данной программы о них ничего не известно. После
завершения работы функции значения этих переменных не сохраняются.
Структуры
Структурой называется составной тип данных, который как правило содержит данные
разных типов (в отличии от массивов). Эти данные называются полями структуры. Все поля
структуры образуют запись.
Описание структуры имеет следующий вид:
struct имя_структуры
{
тип1 поле1;
тип2 поле2;
……………..
типN полеN;
};
Ключевое слово struct определяет тип данных – структуру, а имя_структуры – имя
структурного типа; поле1, поле2 и т. д. – элементы структуры. Заканчивается описание
структуры закрывающей фигурной скобкой с точкой с запятой ( }; ).
Например,
struct student {
AnsiString FIO, Gruppa;
int Bal_math, Bal_inform;
};
Этот пример описывает структуру, которая задается именем student, содержащую четыре
поля. Поля FIO, Gruppa строкового типа. Первое задает имя студента, второе – группу, в
которой студент учится. Поля Bal_math, Bal_inform – целого типа. Они задают оценки студента
соответственно по математике и информатике.
Определение структуры не создает никаких переменных; а создает только шаблон. Другими
словами, не происходит ни выделения физической памяти, ни объявления переменной.
Определение структуры задает лишь ее внутреннюю организацию, описывая поля, входящие в
состав структуры. Описание структуры определяет новый тип, имя которого можно
использовать в дальнейшем наряду со стандартными типами. При определении структурной
переменной под нее выделяется память, причем столько, сколько достаточно для хранения всех
ее полей, т.е. создается экземпляр структуры. Например:
struct Worker
{
char fio[30];
int date, code;
};
Worker a[100],work, *ps;
5
Поля структуры могут иметь любой тип, кроме типа этой же структуры, но могут быть
указателями на него. Если отсутствует имя типа, должен быть указан список описателей
переменных, указателей или массивов. В этом случае описание структуры служит
определением элементов этого списка.
Здесь объявленна переменная work типа Worker, массив a из 100 элементов, каждый из
которых является структурой типа Worker, и указатель ps на объект типа Worker.
Переменные структуры могут объявляться и непосредственно в описании структуры
после закрывающей фигурной скобки, то есть, как принято в С, описание типа предшествует
имени переменной. В этом случае имя структуры задавать необязательно:
struct { AnsiString FIO, Gruppa;
int Bal_math, Bal_inform;
}
st, stArray[10], *stud;
Доступ к отдельным элементам структуры осуществляется операцией точка (.) для
объекта, и операцией стрелка (->) для указателя на объект. Например:
st.FIO=”Лебедев”;
stArray[2].Gruppa=”ИК-1.02”;
stArray[i].Bal_math=80;
stud->Bal_inform=95;
Файлы
Файл – это набор данных, который хранится на магнитном носителе. Каждый файл
имеет имя и расширение. С++ различает два вида файлов: текстовые и бинарные. С помощью
С++ можно выполнять те же действия, что и пользователь, работающий в операционной
системе (открывать и закрывать, записывать, считывать и редактировать информацию в файле).
Для работы с файлами необходимо подключить библиотеку <stdio.h>, объявить
файловую переменную, которая будет связывать файловую переменную с файлом на диске:
FILE *f.
Для записи данных в файл его необходимо открыть (создать). Для этого служит команда
fopen(fname,x), где fname- имя файла на диске, а x – режим открытия файла. Режимы открытия
файла представлены в таблице 1. Если файл бинарный, то после параметра, представленного в
таблице, добавляется буква b, а если текстовый - t.
Таблица 1
Режимы открытия файла
параметр
Описание
r
Файл открывается для чтения(запись при этом не разрешена
w
Файл открывается для записи; если файл уже существует, он пересоздается (чтение
не разрешено)
a
Файл открывается для добавления данных в конец файла (чтение не разрешено)
r+
Файл открывается для чтения с возможностью записи
w+
Файл открывается для записи с возможностью чтения
a+
Файл открывается для добавления данных в конец файла с возможностью чтения
Бинарные файлы
Бинарные файлы представляют собой последовательность символов без каких либо
разделителей.
Запись в бинарный файл производится с помощью команды fwrite. Ее синтаксис:
fwrite(el, sizeof(el), kol_el, f), где el – элемент, который мы записываем, sizeof(el) – размер этого
элемента, kol_el – их количество, f – файловая переменная (указатель на файл). После
окончания работы с файлом его необходимо закрывать с помощью функции fclose(f).
6
Приведем пример записи данных о работниках (структура с полями фамилия и год
рождения):
struct Worker
{
char fio[30];
int year;
};
Worker work;
//глобальное объявление файловой переменной
FILE *f;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//считываем и преобразуем строку в массив символов
strcpy(work.fio,Edit1->Text.c_str());
work.year= StrToInt(Edit2->Text);
//открываем (создаем) бинарный файл для записи структуры в конец файла
f=fopen( “filename.date”,"ab");
//записываем структуру в бинарный файл
fwrite(&work,sizeof(work),1,f);
//закрываем файл
fclose(fb);
}
Чтение данных из бинарного файл производится с помощью команды fread. Ее
синтаксис: fread (el, sizeof(el), kol_el, f), где el – элемент, который мы считываем, sizeof(el) –
размер этого элемента, kol_el – их количество, f – файловая переменная (указатель на файл).
Приведем пример чтения данных о работниках:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
//открываем бинарный файл для чтения данных
f=fopen( “filename.date”,"rb");
//в цикле считываем данные (пока не дошли до конца файла)
while( fread(&work,sizeof(work),1,f))
{
Memo1->Lines->Add((String) work.fio+” | “+IntToStr(work.year));
}
//закрываем файл
fclose(f);
}
Текстовые файлы
Текстовые файлы состоят из строк. Запись данных в текстовый файл можно производить
с помощью функций fputs и fprintf.
Для чтения из файла данных построчно используется команда fgets. Например:
fgets(s, 40, f);
Эта команда считывает из файла f в переменную s строку размером не более
40 символов (если строка больше, то считывается только 40 символов). Переменная s должна
быть объявлена как С-строка:
char * s;
или:
char s[40];
7
Для записи строки s в файл используется команда fputs:
fputs(s, f);
Эта команда записывает в файл строку s. При этом переход на новую строку не выполняется.
Чтобы сохранить и закрыть файл, нужно написать команду:
fclose(f);
Последовательность работы с файлом при записи данных такова:
1. открыть или создать файл для записи (или для чтения и записи) в конец файла:
f=fopen(filename,”at+”);
или
f=fopen(filename,”wt+”);
2. записать данные в файл:
fputs(S,f);
или
fprint(f, <данные типа (char *) с форматом либо без>);
3. закрыть файл - fclose(f);
Здесь filename – переменная (C-строка), которая содержит физическое имя файла, а S –
строка, из которой в файл записываются данные.
Чтение данных из файла выполняется в такой последовательности:
1. открыть файл для чтения:
f=fopen(filename,"rt+");
2. осуществить чтение данных из файла:
fscanf(f, <форматированные данные>);
или
fgets(S,80,f);
3. закрыть файл:
fclose(f);
Для чтения последовательно всех данных из файла необходимо организовать цикл пока
не достигли конца файла, используя либо функцию feof(f), которая возвращает значение true
при достижении конца файла:
while (!feof(f)){ fgets(s, 40, f); . . .}
либо функцию чтения данных, которая дает нулевой результат при достижении конца файла:
while (fgets(s, 40, f)) {. . .}
т. е. буквально: считывать строки файла, пока они есть.
При чтении или записи указатель текущей записи файла автоматически смещается на
количество обработанных байтов. Узнать позицию указателя можно функцией ftell, которая
возвращает текущую позицию:
long ftell(FILE *f);
Изменить позицию указателя в файле f можно функцией fseek:
int fseek(FILE *f, long offset, int whence);
Эта функция задает сдвиг offset на количество байтов относительно точки отсчета,
определяемой параметром whence. Параметр whence может принимать значения, указанные в
табл. 2:
Таблица 2
Значения параметр whence
константа
Whence
Точка отсчета
SEEK_SЕТ
0
Начало файла
SEEK_CUR
1
Текущая позиция
SEEK_END
2
Конец файла
8
Если задано значение whence = 1, то offset может быть положительным (сдвиг вперед)
или отрицательным (сдвиг назад). Функция rewind перемещает указатель на начало файла
(позиция 0). Впрочем, то же самое можно сделать оператором
fseek(f, 0, 0);
Работа с датой и временем.
Для того чтобы в программе были доступны функции и методы для работы с типом
данных дата-время необходимо подключать библиотеку DateUtils.hpp.
В табл. 3 представлен перечень функций преобразования дат и времени в строку и
наоборот.
Таблица 3
Функции преобразования дат и времени
Название функции
DateTimeToStr
DateTimeToString
FormatDateTime
DateToStr
TimeToStr
StrToDate
StrToTime
StrToDateTime
Date( )
Time( )
Now( )
Синтаксис / описание
AnsiString DateTimeToStr(TdateTime DateTime)
Преобразует DateTime в строку
Преобразует DateTime в строку по формату
Преобразует DateTime в строку по формату
Преобразует Date в строку
Преобразует Time в строку
Преобразует AnsyString строку в дату TDateTime
Преобразует AnsyString строку во время TDateTime
Преобразует AnsyString строку в дату и время TDateTime
Возвращает текущую дату
Возвращает текущее время
Возвращает текущие дату и время
В табл. 4 представлены некоторые функции, наиболее часто используемые при
обработке данных типа «дата» и «время».
Таблица 4
Некоторые функции для обработки данных типа TdateTime
Функция/Синтаксис
int YearsBetween (TdateTime Now,
TdateTime Athen)
double YearSpan (TdateTime Now,
TdateTime Athen)
int MonthsBetween(TdateTime Now,
TdateTime Athen)
double MonthSpan(TdateTime Now,
TdateTime Athen)
int HoursBetween(TdateTime Now,
TdateTime Athen)
double HourSpan(TdateTime Now,
TdateTime Athen)
int MinutesBetween(TdateTime Now,
TdateTime Athen)
Описание
Возвращает целое количество лет между
датами Now и Athen
Возвращает вещественное количество лет
между
датами
Now
и
Athen,
(с учетом части года)
Возвращает целое количество месяцев между
датами Now и Athen
Возвращает
вещественное
количество
месяцев между датами Now и Athen,
(с учётом части месяца)
Возвращает целое количество часов между
Now и Athen
Возвращает вещественное количество часов
между Now и Athen, (с учётом части часа)
Возвращает целое количество минут между
Now и Athen
9
double MinuteSpan(TdateTime Now,
TdateTime Athen)
int SecondsBetween(TdateTime Now,
TdateTime Athen)
double SecondSpan(TdateTime Now,
TdateTime Athen)
int MillisecundsBetween(TdateTime Now,
TdateTime Athen)
double MillisecundSpan(TdateTime Now,
TdateTime Athen)
Возвращает вещественное количество минут
между Now и Athen, (с учётом части минуты)
Возвращает целое количество секунд между
Now и Athen
Возвращает вещественное количество секунд
между Now и Athen, (с учётом части секунды)
Возвращает целое количество миллисекунд
между Now и Athen
Возвращает
вещественное
количество
миллисекунд
между
Now
и
Athen,
(с учётом части миллисекунды)
Рассмотрим пример выполнения курсовой работы базового уровня.
Возьмем структуру с полями: Фамилия, Имя, Отчество, Должность, Дата устройства на
работу, Зарплата. Отсортируем массив по убыванию зарплаты, выведем данные об инженерах,
проработавших более 20-ти лет и произведем запись в текстовый файл сведений о сотрудниках,
проработавших более 5-ти лет.
Начнем проект с создания собственной библиотеки подпрограмм. Для этого выполним
команду File/New/Unit. Создастся пустой модуль без связанного с ним окна формы. Сохраним
файл на диске с именем создаваемой библиотеки. Unit2 в обоих файлах автоматически
заменится на новое имя. Например, зададим имя lib.
В заголовочном файле опишем нашу структуру. В нашем случае будет пять полей
строкового типа (fam[20]-Фамилия, Name[20]-Имя, otch[20]-Отчество, dolg[20]-должность,
ustr[10]-дата приема на работу) и одно поле –вещественного (zarp –оклад):
#ifndef libH
#define libH
struct dannie
{
char fam[20],Name[20],otch[20],dolg[20],ustr[10];
float zarp;
};
//глобальное объявление переменной типа dannie
dannie dan;
char *nb="kurs.dat";
char *nt="kurs.txt";
#endif
Приступим непосредственно к записи данных в бинарный файл. Для более компактного
размещения компонент на форме установим компонент PageControl (многостраничное окно).
Компонент PageControl находится на закладке Win32. Нажмем на нем правой клавишей мыши и
выберем New Page (новая закладка). На этой закладке также установим 6 компонентов Label,
Button, по три компонента Edit и ComboBox согласно рис.1. Для компонент ComboBox в
свойстве Items предварительно запишем имена, отчества и должности.
10
Рис. 1. Расположение компонентов на закладке «Запись в бинарный файл»
Приведем пример записи данных в бинарный файл
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//считываем и преобразуем строки в массивы символов
strcpy(dan.fam,Edit1->Text.c_str());
strcpy(dan.Name,ComboBox1->Text.c_str());
strcpy(dan.otch,ComboBox2->Text.c_str());
strcpy(dan.ustr,Edit2->Text.c_str());
strcpy(dan.dolg,ComboBox3->Text.c_str());
//
dan.zarp= StrToFloat(Edit3->Text);
//открытие бинарного файла для записи в конец файла
fb=fopen(nb,"ab");
//записываем структуру в бинарный файл
fwrite(&dan,sizeof(dan),1,fb);
//закрываем файл
fclose(fb);
}
Для удобства вывода содержимого бинарного файла в компонент StringGrid напишем
функцию.
//функция заполнения ячеек компонентов StringGrid
void setka(TStringGrid *sg, dannie d, int N)
{
11
sg->Cells[0][N]=IntToStr(N);
sg->Cells[1][N]=(String)d.fam;
sg->Cells[2][N]=(String)d.Name;
sg->Cells[3][N]=(String)d.otch;
sg->Cells[4][N]=(String)d.dolg;
sg->Cells[5][N]=(String)d.ustr;
sg->Cells[6][N]=FormatFloat("0.00",d.zarp);
}
Аналогичным образом напишем функцию заполнения фиксированных строк комонентов
StringGrid
//функция заполнения фиксированной строки комонентов StringGrid
void setka2(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]="дата";
sg->Cells[6][0]="зарплата";
}
Выведем содержимое бинарного файла в компонент StringGrid, расположенного на
новой (второй) закладке компонента PageControl (Рис. 2).
//просмотр содержимого бинарного файла
void __fastcall TForm1::Button2Click(TObject *Sender)
{
//вызов функции заполнения фиксированной строки
setka2(SG1);
//открытие бинарного файла
fb=fopen(nb,"rb");
int k=1;
while( fread(&dan,sizeof(dan),1,fb)>0 )
{
//вызов функции вывода даных
setka(SG1, dan,k);
k++;
}
//устанавливаем нужное нам количество строк компонента StringGrid
SG1->RowCount=k;
fclose(fb);
}
12
Рис. 2. Просмотр результатов на закладке «Просмотр бинарного файла»
Чтобы вывести данные об инженерах, проработавших более 20-ти лет необходимо
работать с типом данных дата-время. Для работы с типом данных дата-время необходимо
подключить библиотеку "DateUtils.hpp". Определять стаж работы мы будем с помощью
функции int YearsBetween (TdateTime Now, TdateTime Athen), которая Возвращает целое
количество лет между датами Now и Athen. Превым праметром в данной функции будет
текущая дата (Now()), а вторым – преобразованный в дату массив символов (dan.ustr – дата
устройства на работу). Вывод данных из бинарного файла, удовлетворяющих нашим условиям,
будем также производить в компонент StringGrid, расположенный на новой (третьей) закладке
компонента PageControl.
//вывод инженеров, стаж работы которых превышает 20 лет
void __fastcall TForm1::Button4Click(TObject *Sender)
{
fb=fopen(nb,"rb");
int k=1;
while( fread(&dan,sizeof(dan),1,fb)>0 )
if (YearSpan(Now(),StrToDate(dan.ustr))>20)&&((String)dan.dolg=="Инженер"))
{
setka(SG3, dan,k);
k++;
}
SG3->RowCount=k;
setka2(SG3);
fclose(fb);
}
13
Рис. 3. Просмотр результатов на закладке «Задание»
Для сортировки данных файла по одному из полей структуры необходимо сформировать
динамический массив. Для формирования динамического массива нам нужно знать количество
элементов. Определить количество элементов массива можно двумя способами (с помощью
счетчика определить количество считывания данные из файла или поделить размер всего файла
на размер структуры). Рассмотрим их в виде функций
//функция определения количества записей c помощью счетчика
int kol1(FILE *f1 ) {
f1=fopen(nb,"rb");
//начальное количество записей равно нулю
int n=0;
//в цикле определяем количество считываний данных из файла
while(fread(&dan,sizeof(dan),1,f1))
{
n++;
}
fclose(f1);
return n;
}
//функция определения количества записей с помощью “деления”
int kol(FILE *f1 ) {
f1=fopen(nb,"rb");
//устанавливаем курсор в конец файла
fseek(f1,0,2);
// определяем количество структур в файле
int n= ftell(f1)/sizeof(dannie);
fclose(f1);
14
return n;
}
Функция формирования массива будет иметь следующий вид:
//функция формирования массива
void formir(FILE *f1 ,dannie mas[],int k)
{
f1=fopen(nb,"rb");
for(int i=0;i<k;i++)
{ fread(&dan,sizeof(dan),1,f1);
mas[i]=dan;
} fclose(f1);
}
Сортировку массива также будем производить с помощью функции. В нашем примере
будем сортировать содержимое бинарного файла (сформированного ранее динамического
массива структур) по полю зарплата по убыванию
//функция сортировки массива
void sort(dannie mas[],int k)
{ int i,j; dannie z;
for(i=0;i<k;i++)
for(j=i+1;j<k;j++)
if(mas[i].zarp<mas[j].zarp)
{ z=mas[i]; mas[i]= mas[j]; mas[j]=z;}
}
Последние функции находятся в библиотеке (lib), а вызывать их мы будем в главной
программе, то в заголовочном файле надо описать их прототипы:
//прототипы функций
int kol(FILE *f1 );
void formir(FILE *f1 ,dannie mas[],int k);
void sort(dannie mas[],int k);
Вывод отсортированных данных из файла будем производить также в компонент
StringGrid (четвертая закладка компонента PageControl):
void __fastcall TForm1::Button4Click(TObject *Sender)
{
fb=fopen(nb,"rb");
//вызов функции определения количества записей
int k=kol(fb) ;
// выделение места в памяти под массив структур, состоящий из к элементов;
dannie *mas= new dannie [kol(fb)];
//вызов функции формирования динамического массива
formir(fb , mas, k);
//вызов функции сортировки динамического массива
sort(mas,k);
// вывод отсортированного массива
for(int i=0;i<k;i++)
setka(SG3, mas[i],i+1);
setka2(SG4);
15
SG3->RowCount=k+1;
// очистка памяти
delete []mas;
fclose(fb);
}
Рис. 4. Просмотр результатов на закладке «сортировка массива»
Для записи в текстовый файл сведений о сотрудниках, проработавших более 5-ти лет,
будем использовать функцию с параметрами – указателями на файлы (текстовый и бинарный
соответственно). Текст этой функции, расположенной в библиотеке, приведен ниже:
void zapis(FILE *f1, FILE *f2)
{ //открытие бинарного файла для чтения
f2=fopen(nb,"rb");
//открытие(создание)текстового файла для записи данных
f1=fopen(nt,"wt");
//пока не дошли до конца текстового файла производим считывание данных
while( fread(&dan,sizeof(dan),1,f2)>0 )
{
//запись данных в текстовый файл
if ((YearSpan(Now(),StrToDate(dan.ustr))>5))
fprintf(f1,"%s %s %s %s %s %5.2f\n", &dan.fam,&dan.Name,&dan.otch,&dan.dolg, &dan.ustr,
dan.zarp);
}
//закрытие файлов
fclose(f1);
fclose(f2);
}
16
Рис. 5. Просмотр результатов на закладке «Просмотр текстового файла»
Создание вспомогательных форм для отображения пунктов меню
«об авторе» и «о задании».
Начнем с формы, отображающей авторство проекта. В С++ Builder выполним команду
File->New->Other… В диалоговом окне NewItems на закладке Forms выбираем форму, которая
называется AboutBox и нажимаем Ok. На этой форме изменим содержимое свойства Caption
компонент Label, которые отображают авторство, тему и руководителя работы.
Рис. 6. Вспомогательная форма «об авторе»
17
После внесения изменений необходимо присоединить созданную форму к главному
модулю (выполнить команду File->Include Unit Hdr…и выбрать Unit2 или же самостоятельно
подключить библиотеку #include "Unit2.h") и выполнить отклик для пункта меню «об авторе»,
программная реализация которого имеет вид:
void __fastcall TForm1::N2Click(TObject *Sender)
{
AboutBox->ShowModal();
}
В данном варианте вызова вспомогательной формы она становится «модальной». Это
означает, что завершение работы с формой осуществляется с помощью нажатия кнопки Ok и
при этом ни одного события для этой кнопки определять не нужно. До нажатия кнопки Ok
переход к другим формам будет невозможен.
Для вывода информации о задании создадим еще одну вспомогательную форму
(выполнив команду File->New-> Form), на которую установим такие компоненты: RichEdit,
MainMenu, OpenDialog, SaveDialog, FontDialog, Label.
Компонент RichEdit находится на закладке Win32, а компоненты OpenDialog, SaveDialog и
FontDialog на закладке Dialogs.
Назначение компонентов:
 MainMenu – для создания меню на новой форме.
 RichEdit – компонент, предназначенный для просмотра данных, записанных в редакторе
Word в формате RTF. Компонент RichEdit работает с текстом в обогащенном формате
RTF. Этот компонент является основным окном при редактировании пользователем
текстовых файлов и при программной подготовке каких-либо документов, которые
пользователь в дальнейшем может редактировать. Атрибуты форматирования в окне
RichEdit задаются свойством SelAttributes. Если в окне имеется выделенный фрагмент
текста, то свойство
SelAttributes определяет формат этого фрагмента. А если
выделенного текста нет, то свойство SelAttributes определяет формат того текста,
который будет вводиться, начиная с текущей позиции курсора.
 OpenDialog и SaveDialog – компоненты для открытия и сохранения данных в файле
соответственно.
 FontDialog – компонент для изменения стиля и размера шрифтов при корректировании
данных.
программная реализация каждого события приведена ниже.
//просмотр задания
void __fastcall TForm2::N2Click(TObject *Sender)
{
char *ffname;
SaveDialog1->Filter="Doc files(*.rtf)|*.rtf";
if(SaveDialog1->Execute())
//ffname=OpenDialog1->FileName.c_str();
RichEdit1->Lines->SaveToFile(SaveDialog1->FileName );
RichEdit1->Modified=false;
}
//изменение шрифта и стиля
void __fastcall TForm2::N3Click(TObject *Sender)
{
FontDialog1->Execute();
18
RichEdit1->SelAttributes->Assign( FontDialog1->Font);
}
//выход
void __fastcall TForm2::N4Click(TObject *Sender)
{
int r;
if(RichEdit1->Modified)
{r=MessageDlg("текст
был
изменен.\n
mtWarning,TMsgDlgButtons()<<mbYes<<mbNo,0);
if(r==mbYes) N2Click( Sender );
}
Сохранить
изменгения?",
RichEdit1->Clear();
Close();
}
Рис. 7. Вспомогательная форма «о задании»
Создание заставки
На вспомогательной форме установим компоненты Image и Timer. Компонент Timer
расположен на закладке System, а компонент Image - на закладке Additional. Свойство Interval
для компонента Timer установим равным 3000 (3 секунды)
void __fastcall TForm4::Timer1Timer(TObject *Sender)
{
Close();
}
19
Свойство для формы BorderStyle установим bsNone
Чтобы расположить тематическую картинку в компоненте Image, ее нужно загрузить.
Для этого следует щелкнуть на трех точках свойства Picture и в диалоговом окне Picture Editor
выполнить команду Load, после чего подобрать картинку и выполнить команду Ok. Затем,
чтобы картинка заполнила все пространство, отведенное компонентом Image, рекомендуется
установить свойство Stretch в значение True. Внешний вид заставки приведен на рис. 8.
Рис. 8. Форма «Заставка»
Дальше создадим шаблон события onCreate первой (главной) формы приложения,
который будет иметь вид:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Form4=new TForm4(this);
Form4->ShowModal();
Form4->Free();
}
Следует не забывать подключать созданные модули к главному. Теперь при запуске
спроектированного приложения на экране будет появляться заставка, представленная на рис. 8.
Далее приведем полный текст библиотеки и главново модулей.
20
Заголовочный файл библиотеки
#include "stdio.h"
#ifndef libH
#define libH
//подключение библиотеки для работы с типом данных Дата-Время
#include "DateUtils.hpp"
//глобальное объявление файловых переменных
FILE *ft,*fb;
/*глобальное объявление структуры со следующими полями:
fam[20]-Фамилия
Name[20]-Имя
otch[20]-Отчество
dolg[20]-должность
ustr[10]-дата приема на работу
zarp -оклад
*/
struct dannie
{
char fam[20],Name[20],otch[20],dolg[20],ustr[10];
float zarp;
}
;
//глобальное объявление переменной типа dannie
dannie dan;
char *nb="kurs.dat";
char *nt="kurs.txt";
//прототипы функций
// void zapis(FILE *f1, FILE *f2);
int kol(FILE *f1 );
void formir(FILE *f1 ,dannie mas[],int k);
void sort(dannie mas[],int k);
void zapis(FILE *f1, FILE *f2);
#endif
Файл реализации
#pragma hdrstop
#include "lib.h"
#pragma package(smart_init)
//функция определения количества записей
int kol(FILE *f1 ) {
f1=fopen(nb,"rb");
//устанавливаем курсор в конец файла
fseek(f1,0,2);
// определяем количество структур в файле
int n= ftell(f1)/sizeof(dannie);
21
fclose(f1); return n;
}
//функция формирования массива
void formir(FILE *f1 ,dannie mas[],int k)
{
f1=fopen(nb,"rb");
for(int i=0;i<k;i++)
{ fread(&dan,sizeof(dan),1,f1);
mas[i]=dan;
} fclose(f1);
}
//функция сортировки массива
void sort(dannie mas[],int k)
{ int i,j; dannie z;
for(i=0;i<k;i++)
for(j=i+1;j<k;j++)
if(mas[i].zarp<mas[j].zarp)
{ z=mas[i]; mas[i]= mas[j];
}
mas[j]=z;}
void zapis(FILE *f1, FILE *f2)
{ //открытие бинарного файла для чтения
f2=fopen(nb,"rb");
//открытие(создание)текстового файла для записи данных
f1=fopen(nt,"wt");
//пока не дошли до конца текстового файла производим считывание данных
while( fread(&dan,sizeof(dan),1,f2)>0 )
{
//запись данных в текстовый файл
if ((YearSpan(Now(),StrToDate(dan.ustr))>5))
fprintf(f1,"%s %s %s %s %s %5.2f\n", &dan.fam,&dan.Name,&dan.otch,&dan.dolg,
&dan.ustr, dan.zarp);
}
//закрытие файлов
fclose(f1);
fclose(f2);
}
Главный модуль
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//подключение библиотеки для работы с файлами
// #include "stdio.h"
//подключение библиотеки
#include "lib.h"
/*подключение библиотек для вывода сведений об авторе,задании и заставки*/
22
#include "Unit2.h"
#include "Unit3.h"
#include "Unit4.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//функция заполнениия ячеек комонентов StringGrid
void setka(TStringGrid *sg, dannie d,int N)
{
sg->Cells[0][N]=IntToStr(N);
sg->Cells[1][N]=(String)d.fam;
sg->Cells[2][N]=(String)d.Name;
sg->Cells[3][N]=(String)d.otch;
sg->Cells[4][N]=(String)d.dolg;
sg->Cells[5][N]=(String)d.ustr;
sg->Cells[6][N]=FormatFloat("0.00",d.zarp);
}
//функция заполнениия фиксированной строки комонентов StringGrid
void setka2(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]="дата";
sg->Cells[6][0]="зарплата";
}
//запись данных в бинарный файл
void __fastcall TForm1::Button1Click(TObject *Sender)
{ //преобразуем строки в массив символов
strcpy(dan.fam,Edit1->Text.c_str());
strcpy(dan.Name,ComboBox1->Text.c_str());
strcpy(dan.otch,ComboBox2->Text.c_str());
strcpy(dan.ustr,Edit2->Text.c_str());
strcpy(dan.dolg,ComboBox3->Text.c_str());
dan.zarp= StrToFloat(Edit3->Text);
//открытие бинарного файла для записи в конец файла
fb=fopen(nb,"ab");
//записываем структуру в бинарный файл
fwrite(&dan,sizeof(dan),1,fb);
fclose(fb);
}
//вывод заставки про автора
void __fastcall TForm1::N2Click(TObject *Sender)
{
23
AboutBox->ShowModal();
}
//вывод сведений о задании
void __fastcall TForm1::N3Click(TObject *Sender)
{
Form2->Show();
}
//просмотр содержимого бинарного файла
void __fastcall TForm1::Button3Click(TObject *Sender)
{
setka2(SG2);
//открытие бинарного файла
fb=fopen(nb,"rb");
int k=1;
//вызов функции записи данных из текстового в бинарный файлы
"kurs.dat"
while( fread(&dan,sizeof(dan),1,fb)>0 )
{
setka(SG2, dan,k);
k++;
} SG2->RowCount=k;
fclose(fb);
}
//вывод содержимого текстового файла
//вывод инженеров, стаж работы которых превышает 20 лет
void __fastcall TForm1::Button4Click(TObject *Sender)
{
fb=fopen(nb,"rb");
int k=1;
while( fread(&dan,sizeof(dan),1,fb)>0 )
if ((YearsBetween(Now(),StrToDate(dan.ustr))>20)&&((String)dan.dolg=="Инженер"))
{
setka(SG3, dan,k);
k++;
}
SG3->RowCount=k;
setka2(SG3);
fclose(fb);
}
void __fastcall TForm1::N5Click(TObject *Sender)
{ fb=fopen(nb,"wb");
fclose(fb);
}
void __fastcall TForm1::N6Click(TObject *Sender)
24
{
ft=fopen("kurs.txt","wt");
fclose(ft);
}
void __fastcall TForm1::Button6Click(TObject *Sender)
{
fb=fopen(nb,"rb");
//устанавливаем курсор в конец файла
// fseek(fb,0,2);
// определяем количество структур в файле
int i,j, k=kol(fb) ; //
// ftell(fb)/sizeof(dan);;
// Edit4->Text = k;
// выделение места в памяти под массив структур, состоящий из к элементов;
dannie *mas= new dannie [kol(fb)];
// dannie z;
//устанавливаем курсор в начало файла
//
fseek(fb,0,0);
//считываем данные из файла и формируем массив структур
/* for(i=0;i<k;i++)
{ fread(&dan,sizeof(dan),1,fb);
mas[i]=dan;
}
//сортируем массив по возрастанию зарплаты
formir(fb , mas, k);
sort(mas,k);
for(i=0;i<k;i++)
setka(SG4, mas[i],i+1);
SG4->RowCount=k+1;
setka2(SG4);
delete []mas;
fclose(fb);
}
//закрытие проекта
void __fastcall TForm1::N7Click(TObject *Sender)
{
Close();
}
//вывод инженеров, стаж работы которых превышает 20 лет !!!!!!!
void __fastcall TForm1::Button7Click(TObject *Sender)
{
fb=fopen(nb,"rb");
int i,n=1, k=kol(fb) ;
// выделение места в памяти под массив структур, состоящий из к элементов;
dannie *mas= new dannie [k];
//вызов функции формирования динамического массива
formir(fb , mas, k);
for(i=0;i<k;i++)
if ((YearSpan(Now(),StrToDate(mas[i].ustr))>20)&&((String)mas[i].dolg=="Инженер"))
25
{
setka(SG3, mas[i],n);
n++;
}
SG3->RowCount=n;
setka2(SG3);
delete []mas;
fclose(fb);
}
//Вывод содержимого текстового файла
void __fastcall TForm1::Button10Click(TObject *Sender)
{
// setka2(SG1);
//открытие файлов
ft=fopen(nt,"wt");
fb=fopen(nb,"ab");
zapis(ft,fb);
fclose(ft);
fclose(fb);
Memo1->Lines->LoadFromFile(nt);
}
//подключение заставки
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Form4=new TForm4(this);
Form4->ShowModal();
Form4->Free();
}
Варианты индивидуальных заданий приведены в табл. 5.
26
Таблица 5
Варианты индивидуальных заданий
№
Поля структуры
1
1
2
Фамилия
Имя
Отчество
Пол
Должность
Дата рождения
Задание
Параметры
сортировки
Текстовый файл
3
4
5
Вывести
данные
об Дата рождения по Сведения
обо
инженерах, пенсионного убыванию
всех женщинах
возраста
(мужчинам
больше
65-ти
лет,
женщинам 60)
2
№ поезда
Пункт и время
прибытия
Пункт и время
отбытия
Вывести все сведения о №
поезда
поездах,
время возрастанию
пребывания
в
пути
которых превышает 7
часов 20 минут
по Сведения
поездах
нечетными
номерами
о
с
3
Фамилия
Имя
Отчество
Должность
Зарплата
Дата рождения
Вывести сведения о
сотрудниках, у которых
зарплата выше средней и
возраст менее 30-ти лет
по Сведения
инженерах
об
4
Марка автомобиля
Производитель
Тип
Год выпуска
Дата регистрации
Вывести
сведения
о Год выпуска
машинах марки “Toyota” и убыванию
зарегистрированных
до
2007-го года
5
Фамилия
Имя
Отчество
Должность
Зарплата
Дата рождения
Вывести
сведения
о Дата рождения по Сведения
о
сотрудниках,
которые возрастанию
сотрудниках,
родились в мае.
старших 25 лет
6
№ поезда
Время прибытия
Время отбытия
Направление
Расстояние
Вывести
среднюю Расстояние
скорость каждого поезда
возрастанию
по Сведения
о
поездах,
пребывающих
после 12:00
7
Фамилия
Имя
Отчество
Должность
Пол
Дата приема на
работу
Определить средний стаж Фамилия
работы и вывести все возрастанию
сведения о сотрудниках,
стаж
которых
выше
среднего
по Сведения
обо
всех мужчинах
Зарплата
убыванию
по Сведения
о
машинах
с
нечетным годом
выпуска
27
1
8
9
10
11
12
13
2
Фамилия
Имя
Отчество
Должность
Зарплата
Дата рождения
Марка автомобиля
Производитель
Тип
Год выпуска
Дата регистрации
Название фильма
Дата и время сеанса
Продолжительность
сеанса
Жанр
Бюджет
Наименование
Дата производства
Срок годности
(кол-во дней)
Цена
№ серии
Фамилия
Дата и место
рождения
Амплуа
Количество игр
Количество желтых
карточек
Марка автомобиля
Производитель
Грузоподъемность
Год выпуска
Дата регистрации
14 Фамилия работника
Должность
Дата подписания
контракта
Срок действия
контракта (кол-во
дней)
Оклад
15 № поезда
Направление
Время прибытия
Время отбытия
Расстояние
3
4
Вывести сведения о самом Должность по
молодом сотруднике
убыванию
5
Сведения о
сотрудниках, с
зарплатой выше
3000 грн
Вывести
сведения
о Дата
регистрации Сведения
машинах марки “Ford” и по возрастанию
машинах
зарегистрированных
до
седан
2000-го года
о
типа
Вывести
данные
о
фильмах, начинающихся
после
18:00
и
продолжительностью
сеанса более 1 часа 40
минут
Вывести наименование
товара и конечную дату
применения (годен до:)
Название фильма по Сведения о
убыванию
фильмах жанра
детектив
№ серии по
убыванию
Сведения о
товарах с ценой
более 30грн.
Вывести сведения о
футболистах, старших 20лет и получающих не
более 1 карточки за 10 игр
Фамилия по
возрастанию
Сведения о
полузащитниках
Вывести
сведения
о
машинах,
зарегистрированных более
года назад и имеющих
грузоподъемность более
з3-х тонн
Вывести сведения о
работниках, срок действия
контракта которых
истекает в течении 5-ти
дней
Год выпуска
убыванию
по Сведения
о
машинах марки
Toyota
Фамилия работника
по возрастанию
Вывести
данные
о Расстояние
поездах, пребывающих в убыванию
пути более суток
Сведения
о
сотрудниках, у
которых
срок
действия
контракта более
5-ти лет
по Сведения
о
поездах,
протяженность
маршрута
которых
превышает 500
км
28
1
2
16 № Авиарейса
Время вылета
Время прилета
Направление
Марка самолета
Расстояние
17 Наименование
Дата производства
Срок годности
(кол-во дней)
Цена
№ серии
18 Наименование
Цена
Дата производства
Срок годности
(кол-во дней)
Количество
Производитель
19 Фамилия
Дата рождения
Клуб
Амплуа
Количество игр
Место рождения
20 № Авиарейса
Время вылета
Время прилета
Направление
Марка самолета
Расстояние
21 Фамилия
Имя
Отчество
Должность
Пол
Дата приема на
работу
22 Марка автомобиля
Производитель
Тип
Год выпуска
Дата регистрации
23 Фамилия работника
Должность
Дата подписания
контракта
Срок действия
контракта (кол-во
дней)
Оклад
3
4
Вывести
данные
об № Авиарейса
авиарейсе с максимальной убыванию
скоростью
5
по Сведения
о
самолетах марки
ТУ-134
Вывести товары, срок Наименование
годности
которых возрастанию
заканчивается в течении 5ти суток
по Сведения о
товарах,
произведенных
более месяца
назад.
Определить
количество Дата производства
просроченных товаров
по убыванию
Сведения о
товарах, срок
годности
которых менее
20-ти дней
Вывести
сведения
о Фамилия
защитниках, младше 20- возрастанию
лет и сыгравших за свой
клуб более 40-ка матчей.
по Сведения
нападающих
Вывести
данные
об № Авиарейса
авиарейсе с максимальной возрастанию
длительностью полета.
по Сведения
об
авиарейсах,
вылетающих до
12:00.
Вывести все сведения о Дата приема
сотрудниках,
стаж работу
которых превышает 10 возрастанию
лет.
на Сведения
по бухгалтерах.
Вывести
сведения
о Год выпуска по
машинах, произведенных возрастанию
до
2005-го
года
и
зарегистрированных
в
этом году.
Вывести
сведения
о Оклад по убыванию
работниках, подписавших
контракт менее года назад.
о
о
Сведения
о
машинах,
выпущенных в
текущем году.
Сведения
о
сотрудниках, с
окладом более
3000 грн.
29
1
2
24 Название фильма
Дата и время сеанса
Продолжительность
сеанса
Жанр
Бюджет
3
4
Вывести
данные
о Название фильма по
фильмах, начинающихся возрастанию
до 18:00 и продолжительностью сеанса менее 1
часа 30 минут.
5
Сведения
о
фильмах
с
бюджетом более
1000000 грн.
25 Фамилия
Дата рождения
Амплуа
Количество игр
Количество забитых
мячей
Место рождения
Вывести
сведения
о Количество игр по
футболистах, старших 20- убыванию
ти лет и забивших не
менее 40 мячей.
Сведения
нападающих.
26 Наименование
Цена
Дата производства
Срок годности (колво дней)
Количество
Производитель
Вывести
сведения
о Наименование по
товарах, срок годности возрастанию
которых истекает через
двое суток.
Сведения о
товарах, срок
годности
которых 5 дней.
27 Марка автомобиля
Производитель
Тип
Год выпуска
Дата регистрации
Вывести
сведения
о Производитель
машинах, произведенных убыванию
до
2000-го
года
и
зарегистрированных менее
года назад.
по Сведения
машинах,
выпущенных
2010 году.
28 Фамилия
Имя
Отчество
Дата рождения
Пол
Дата приема на
работу
Определить
количество Дата приема
сотрудников пенсионного работу
возраста
(мужчинам возрастанию
больше
65-ти
лет,
женщинам - 60).
на Сведения
о
по сотрудниках,
принятых
на
работу до 1-го
сентября
2010
года.
29 Наименование
Цена
Дата производства
Срок годности
(кол-во дней)
Количество
Производитель
Определить общую
стоимость просроченных
товаров.
по Сведения
о
товарах,
количество
которых более
20.
30 Марка автомобиля
Производитель
Тип
Год выпуска
Дата прохождения
техосмотра
Дата регистрации
Вывести
машинах,
техосмотр
назад.
Наименование
возрастанию
о
о
в
сведения
о Дата прохождения Сведения
об
прошедших техосмотра
по автомобилях
менее года убыванию
типа купе.
30
Создание и обработка связанных файлов
Рассмотрим некоторую организацию, выпускающую некоторую продукцию, например
товары, или оказывающее некоторые услуги, например, нотариальную контору, автомобили,
предлагаемые в прокат и т.д. Для данного предприятия необходимо организовать учет
финансовой деятельности, а именно, вести учет поставок, предоставленных услуг, их
стоимости, сроках гарантийного обслуживания или сроках выполнения обязательств.
Для организации такого учета рекомендуется создать два или более файлов, в каждом
из которых будут накапливаться необходимые сведения, как за определенный временной срок,
так и на период длительного использования.
Как правило, для ознакомления с деятельностью любого предприятия, на предприятии
разрабатывается список выпускаемой продукции: товары, услуги и т.д., в которых
перечисляются все необходимые сведения о соответствующей продукции, предоставляемых
услугах, и который условно можно назвать прайс-листом.
Достаточно часто создается и другой список – список клиентов (заказчиков), с
которыми очень плотно работает данное предприятие.
И наконец, создается файл, в котором и ведется учет финансовой деятельности
предприятия в виде накладных или бухгалтерских отчетов, и на основе которых можно судить
о финансовой деятельности данного предприятия (в дальнейшем этот файл будем называть
файлом-отчетом).
Из назначения перечисленных файлов можно наложить определенные требования на
каждый их этих файлов, а именно, каждый файл может быть дополнен новой информацией (при
необходимости), любая запись в файле может быть отредактирована или удалена. Но вот по
поводу последнего замечания (редактирования или удаления) необходимо отметить следующее.
Из файла, в котором приводится прайс-лист (т.е. список услуг, стоимости и другие
необходимые сведения) нельзя удалять записи, если эти сведения еще фигурируют в файлеотчете, отражающего финансовую деятельность. В случае необходимости, удаление
информации из прайс-листа, например, в случае прекращения выпуска какого-то продукта,
необходимо предварительно удалить данные из файла-отчета, в котором эти сведения еще
отражаются, т.е. необходимо сперва удалить сведения из файла-отчета, если они уже не нужны,
и лишь затем – из файла прайс-листа. В этом случае, говорят о каскадном удалении или
изменении записей.
Аналогичное требование по поводу удаления и редактирования, относятся и к файлу, в
котором отражается список клиентов, заказчиков.
Следует отметить еще одну особенность для разрабатываемых файлов. Чтобы в файлеотчете, в котором отражается финансовая деятельность предприятия, можно было проследить о
движении или обороте какого-то товара или услуги, определить какой товар пользуется
наибольшим спросом, файл со списком товаров, услуг и файл-отчет должны быть
определенным образом связаны между собой. Связь эта осуществляется, например, через
наименование товара или через код товара. Иначе говорят, что связь осуществляется через
ключевые поля в файле прайс-листа и через вторичные поля – в файле отчете. Например, если
речь идет о списке товаров, то в качестве ключевого поля может выступать как код товара, так
и наименование товара (при одном обязательном замечании – наименование товара не должно
повторяться в списке прайс-листа, иначе будет путаница в выборе или при просмотре сведений
о товаре в файле - отчета).
Рассмотрим пример, в котором постараемся учесть все вышесказанное. Поставим
задачу: создать два файла, один из которых будет содержать информацию о товаре, а другой для отражения данных, например, в накладных или бухгалтерских ведомостях, и служить для
учета финансовых операций. Пусть один из них будет текстовым, а другой – бинарным.
Для каждого из созданных файлов необходимо предусмотреть возможность
дополнения информации, редактирования отдельных записей, удаления ненужной или
устаревшей информации. Кроме того, необходимо выполнять и другие дополнительные
требования, некоторые из которых оговаривались выше, а именно:
31

удалять записи в текстовом файле можно только в том случае, если сведения о
выполненной услуге или товаре, отсутствует в бинарном файле-отчете, т.е. в
бухгалтерской документации;
 при вводе информации о товаре, нельзя повторять наименование товара, которое
уже введено в список прайс-листа;
 при редактировании данных как в текстовом так и в бинарном файлах нельзя
изменять наименование товара;
 номер накладной в файле-отчете должен автоматически изменяться (увеличиваться
на единицу).
Рассмотрим конкретный пример создания двух файлов (текстового и бинарного) для
учета товаров на складе, предлагаемых для реализации в магазинах. В текстовом файле должна
содержаться информация о наименовании товаров, стоимости единицы продукции,
гарантийный срок хранения в долях лет.
В бинарном фале должны накапливаться следующие сведения: номер текущей
квитанции, наименование конкретного товара, дата поставки продукции в магазин, дата
завершения срока хранения проданного в магазин товара, количество полученной продукции,
полученная сумма за товар и, при необходимости, название или номер магазина (что для
рассматриваемого примера и не обязательно).
Перечисленные сведения как в текстовом файле, так и в бинарном файле можно
отобразить в виде соответствующих полей структуры:
struct Tovar
// структура описывающая товары
{char name[25]; // наименование товара
float garan;
// срок гарантии (в долях года, например 1,6 года
float cena;
// цена единицы товара
AnsiString Info()
{return AnsiString(name)+" "+FormatFloat("0.00",garan)+
" "+FormatFloat("0.00",cena); }
// общая информация о товаре
};
struct Magaz // структура магазин
{ int kod_mag; // номер квитанции
char name_tov[25]; //наименование полученного товара
float garant;
// срок гарантии
TDateTime Date_prod; // дата продажи товара магазину
int kol;
// количество товара
float sena; // цена товара
float sum() //функция вычисления суммы за отпущенный товар
{return kol*sena;}
TDateTime srok_gar() //функция вычисления конца срока действия гарантии
{ float ff=garant*365;
return Date_prod.operator +(ff); }
AnsiString Info() // общая информация о полученном товаре
{return IntToStr(kod_mag)+" "+" "+AnsiString(name_tov)+" "+
FormatFloat("0.00",garant)+" "+DateToStr(Date_prod)
+" "+DateToStr(srok_gar())+" "+IntToStr(kol)+" "
+FormatFloat("0.00",sena)+" "+FormatFloat("0.00",sum());}
};
Начнем рассмотрение варианта реализации товаров со склада в магазины с созданием и
обработкой текстового файла. В первую очередь, напомним, что для создания и работы с
любым файлом необходимо подключить библиотеку #include <stdio.h> . Кроме того, объявим
32
глобально переменные файлового типа: FILE *ft,*fb; (переменная ft – для текстового файла, fb
– для бинарного).
Библиотеку и переменные необходимо расположить в той части программной
реализации, где будет выполняться работа по обработке файлов. Так как мы создадим
отдельную библиотеку, которую будем подключать к рабочему выполняемому файлу, то все
приведенное выше описание разместим в файле Unit2.h. Впоследствии, при разработке
функций (методов) по работе с файлами, заголовки методов переименуем в Bibliot.h, а их
реализацию – в Bibliot.cpp.
Дл работы с данными типа ДатаВремя, подключим также соответствующую
библиотеку:
#include <DateUtils.hpp>
Таким образом, в библиотеке (в Bibliot.h) должны быть использованы следующие
библиотеки:
#include <vcl.h>
#include <stdio.h>
#include <DateUtils.hpp>
#include <Grids.hpp>
Что касается последней библиотеки (<Grids.hpp>), то она необходима будет для
работы с объектами TStringGrid для передачи данных из этого объекта в качестве параметров в
функции, в которых будут использовать соответствующие указатели на объекты, что будет
видно из дальнейшего.
В этой же части расположим используемые в библиотеке описание структур, их
объекты, и другие необходимые данные для начальной инициализации создаваемых файлов:
struct Tovar //поля структуры описаны выше
struct Magaz //поля структуры описаны выше
////////
Tovar tov;
Magaz mag;
FILE *ft,*fb;
char st[]="a.txt"; //наименование текстового файла
char sb[]="b.dat"; //наименование бинарного файла
void CreateForm(); //для инициализации файловых переменных
//заголовок этой функции расположен в библиотеке Bibliot.h,
// а реализация – в Bibliot.cpp
void CreateForm() //реализация метода инициализации файловых переменных
{if ( FileExists(st) )
ft = fopen(st,"rt+");
else
ft = fopen(st,"wt");
fclose(ft);
if ( FileExists(sb) )
fb = fopen(sb,"rb+");
else
fb = fopen(sb,"wt");
fclose(ft);
ShortDateFormat="dd.mm.yyyy";
}
33
Вызов этой функции осуществляется для события onFormCreate в рабочем файле
Unit1.cpp
(перед этим событием объявлены глобально дополнительные переменные) :
TEdit *Edi[5]; // эти переменные будут использованы позже, о чем будет сказано
// дополнительно
TStringGrid *SGg[2];// эти данные будут использованы далее
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Edi[2]=Edit2;
Edi[3]=Edit3;
Edi[4]=Edit4;
SGg[0]=SG4;
SGg[1]=SG5;
CreateForm();
}
В дальнейшем, модуль Unit1.cpp сохраним как Kursov.cpp, а Unit1.h – как Kursov.h.
Для работы с файлами будем использоваться компонент PageControl, расположенном
на закладке Win32. Для обработки текстового файла используется первая страница, которую
так и назовем «Текстовый файл». На этой странице разместили 4 компонента Edit и компонент
Memo. Первые три компонента Edit предназначены для ввода данных по товару, что видно из
надписей напротив этих компонентов, Мемо – для контроля введенных значений, а еще один
вспомогательный компонент Edit – для определения размера файла при просмотре всего
текстового файла. Управление этой страницей осуществяется с помощью пунктов меню
«Текстовый файл». Этот пункт меню содержит следующие подпункты:
 добавить;
 редактировать;
 сохранить изменения;
 удалить запись;
 просмотреть текстовый файл.
Наименование пунктов меню
Текстовый файл
Добавить
Редактир
СохранИзмен
УдалитьЗапись
ПросмТехтФайл
Наименование свойства Name пунктов меню
N1
addText
EditingFile
SaveIzmen
DelZapText
ProsmTextFile
Возможный вариант рабочей первой страницы формы для обработки текстового файла,
приведен на рис.8.
Отклики соответствующих пунктов меню имеют вид:
void __fastcall TForm1::N1Click(TObject *Sender)
{ //активизация первой страницы
PageControl1->ActivePage=TabSheet1; }
void __fastcall TForm1::addTextClick(TObject *Sender)
{//добавление данных в текстовый файл
if (Edi[2]->Text==""||Edi[3]->Text==""||Edi[4]->Text=="")
{ShowMessage("Вы не все данные ввели!"); return;}
strcpy(tov.name,Edi[2]->Text.c_str( ));
34
tov.garan=StrToFloat(Edi[3]->Text);
tov.cena=StrToFloat(Edi[4]->Text);
addFileText(tov); // метод для добавления данных в текстовый файл
Memo1->Clear();
Memo1->Lines->Add(tov.Info());
Edi[2]->Clear(); // в этой части кода мы использовали вышеописанное объявление
Edi[3]->Clear(); // например, Edi[3]=Edit3
Edi[4]->Clear(); // но здесь еще можно было бы и обычным оператором, Edit4->Clear();
Edi[2]->SetFocus();
}
Рис. 8. Рабочая форма с отображением 1-ой страницы PageControl
После откликов по пунктам меню будем приводить функции (методы), включенные в
коды соответствующих откликов для лучшего понимания принципов работы с
соответствующими файлами.
Все рассматриваемые впоследствии функции (методы) реализованы в библиотеке
Bibliot.cpp, а заголовки этих методов – Bibliot.h.
void addFileText(Tovar &tov)
{ //метод для добавления данных в текстовый файл
if ((ft=fopen(st,"rt+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
char s[80];
String ss;
AnsiString ssr=AnsiString(tov.name);
//проверяем, есть ли в файле товар с таким наименованием
while (fgets(s,80,ft))
{ ss=AnsiString(s);
if (ss.Pos(ssr)>0)
{ShowMessage("В файле уже есть товар с таким наименованием");
fclose(ft);
return; }
}
fseek(ft,0,2);
fprintf(ft,(tov.Info()+"\n").c_str());
fclose(ft); }
35
Запись данных выполняется в следующей последовательности: сперва вводятся данные
в Edit1, Edit2, Edit3, Edit4, а затем выполняется пункт меню «Добавить».
Следующий пункт меню – редактирование.
int nnt; /*используется глобальная переменная для определения номера редактируемой
cтроки*/
void __fastcall TForm1::EditingFileClick(TObject *Sender)
{//пункт меню редактирование
Edit2Text(mag,nnt,Memo1,Edi); // метод для редакирования данных
}
void Edit2Text(Magaz &mag, int &nnt,TMemo *MM, TEdit *Ed[])
{// реализация метода для редакирования данных
char s[80];
if ((ft=fopen(st,"rt+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
MM->Clear();
fseek(ft,0,0);
while (fgets(s,80,ft))
{if(s[strlen(s)-1]=='\n') s[strlen(s)-1]='\0';
MM->Lines->Add(s);}
char naz[3][40];
EditingText(naz, nnt); //обращение к еще одному методу
//где определяется номер редактируемой строки
Ed[2]->Text=naz[0]; //отображаем редактируемые данные в Edit.
Ed[2]->Enabled=false; //причем, окно в котором отражается наименование
//товара делаем недоступным
Ed[3]->Text=naz[1];
Ed[4]->Text=naz[2];
fclose(ft);
}
void EditingText(char naz[][40], int &nnt)
{// метод, в котором выбирается строка для редактирования
if ((ft=fopen(st,"rt+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
nnt=StrToInt(InputBox("Введите номер редактируемой строки файла",
"N Строки","")) ;
fseek(ft,0,0);
int kk=0; while ((fscanf(ft,"%s%s%s", &naz[0],&naz[1],&naz[2]) ) >0)
{ if (kk==nnt-1) break; /*определяем номер строки в файле, которую надо
редактировать*/
kk++;
// и определяем содержимое полей в этой строке
}
fclose(ft);
}
Две последние функции (и далее другие) реализованы в библиотеке, причем в первой
из них мы уже использовали вышеприведенные объявления, а именно, массив указателей
ссылок на объекты Edit. Кроме того, в этой же функции создали параметр как указатель на
объект Memo. Можно было бы и не использовать такие параметры с указателями, а
36
непосредственно в функции обращаться к нужному компоненту следующим образом: Form1>Edit2->Text или Form1->Memo1->Lines->Add(s), но тогда мы должны были бы включить в
модуль библиотеки Bibliot.h библиотеку #include “Kursov.h”, где и находятся используемые
компоненты. Кроме того, мы были бы жестко привязаны к установленным на форме
компонентам.
Переходим к следующим пунктам меню:
void __fastcall TForm1::SaveIzmenClick(TObject *Sender)
{// записываем внесенные изменения текстовым файле
Edi[2]->Enabled=true;
SaveIzmTextFile(tov,nnt, Memo1,Edi); // метод сохранения данных в файле
Edi[2]->Text="";
Edi[3]->Text="";
Edi[4]->Text="";
}
void SaveIzmTextFile(Tovar &tov,int &nnt, TMemo *MM, TEdit *Ed[])
{//метод для сохрания изменения с перезаписью в файл
char s[80];
char naz[3][40];
if ((ft=fopen(st,"rt+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
fseek(ft,0,0);
strcpy(tov.name,Ed[2]->Text.c_str( ));
tov.garan=StrToFloat(Ed[3]->Text);
tov.cena=StrToFloat(Ed[4]->Text);
//накапливаем строки и записываем их в файл, заменяя только строку с номер nnt
int k=0;
AnsiString ss="";
AnsiString d,s1;
while (fgets(s,80,ft)>0)
{ k++;
if (k==nnt)
ss=ss+tov.Info()+"\n";
else
{s1=AnsiString(s);
ss=ss+s1; }
}
MM->Clear();
ft=fopen(st,"wt+") ;
fseek(ft,0,0);
while (ss.Length()>0)
{ d=ss.SubString(1,ss.Pos("\n"));
fputs(d.c_str(),ft);
ss.Delete(1,ss.Pos("\n"));
}
fseek(ft,0,0);
while (fgets(s,80,ft)) //просматриваем измененные данные
{if(s[strlen(s)-1]=='\n') s[strlen(s)-1]='\0';
MM->Lines->Add(s); }
fclose(ft);
}
37
Пунк меню «Удаление»
void __fastcall TForm1::DelZapTextClick(TObject *Sender)
{//удаление записи в текстовом файле
DelTextFile(Memo1,Edit5); //метод удаления записи из файла
}
void DelTextFile(TMemo *MM, TEdit *Ed)
{ //метод для удаления строки записи из текстового файла
char s[80];
char naz[3][40];
if ((ft=fopen(st,"rt+"))==NULL)
{ShowMessage("Файл не удается открыть"); return;}
if ((fb=fopen(sb,"rb+"))==NULL)
{ShowMessage("Файл не удается открыть"); return;}
fseek(fb,0,0); // одновременно открываем два файла: текстовый и бинарный
FILE *tmp; // и создаем временный текстовый файл
if ((tmp=fopen("bt.txt","wt+"))==NULL)
{ShowMessage("Файл не удается открыть"); return;}
AnsiString ss,s4;
ss=InputBox("Какую строку следует удалить","Укажите номер строки","");
if (ss=="") {ShowMessage("Вы не ввели данные!"); return;}
int k1=StrToInt(ss);
Magaz mag2;
int k2=0;
fseek(ft,0,0);
fseek(tmp,0,0);
while ((fscanf(ft,"%s%s%s", &naz[0],&naz[1],&naz[2]) ) >0)
{ k2++;
if (k1==k2)
{ while (fread(&mag2,sizeof(mag),1,fb))
if (AnsiString(mag2.name_tov)==AnsiString(naz[0]))
{ ShowMessage
("Удалять запись нельзя, \nтак как имеются данные в другой таблице" );
fclose(tmp); remove("bt.txt");fclose(fb);fclose(ft);
return;
} }
else
{s4="";
if (k1!=k2)
s4=s4+AnsiString(naz[0])+" "+AnsiString(naz[1])+" "+AnsiString(naz[2])+"\n";
fputs(s4.c_str(),tmp);
} }
ft=fopen(st,"wt+") ; //обнуляем файл и перезаписываем в него измененные данные
fseek(ft,0,0);
fseek(tmp,0,0);
MM->Clear();
while (fgets(s,80,tmp) >0) //перезаписываем из временного файла в основной
fputs(s,ft);
fclose(tmp);
remove("bt.txt"); //удаляем временный файл
fseek(ft,0,0);
while (fgets(s,80,ft)) //отображаем данные из перезаписанного файла
{if(s[strlen(s)-1]=='\n') s[strlen(s)-1]='\0';
38
MM->Lines->Add(s);}
fseek(ft,0,2);
int d=ftell(ft); //определяем общий объем текстового файла
Ed->Text=d;
fclose(ft);
}
Пункт меню «ПросмТекстФайл»
void __fastcall TForm1::ProsmTextFileClick(TObject *Sender)
{ //проверяем, что в текстовом файле
Memo1->Clear();
int d;
AnsiString ss=choInFileText(d); );// метод для вывода содержимого файла в Мемо
Edit6->Text=IntToStr(d); //отображает размер файла
Memo1->Lines->Add(ss) ; }
AnsiString choInFileText(int &d)
{ //метод для просмотра данных в текстовом файле
char s[80];
AnsiString ss="";
if ((ft=fopen(st,"rt+"))==NULL)
{ShowMessage("Файл не удается открыть"); return ss;}
fseek(ft,0,2);
d=ftell(ft);
fseek(ft,0,0);
while (fgets(s,80,ft))
{if(s[strlen(s)-1]=='\n') s[strlen(s)-1]='\0';
ss=ss+AnsiString(s)+"\r\n";
}
fclose(ft); return ss;
}
Переходим на вторую страничку, где начинаем работать с бинарным файлом (см. рис.9.).
Рис.9. Рабочая форма с отображением 2-ой страницы PageControl
39
Эта страница предназначена для ввода данных в бинарный файл и просмотра
накопленной информации. Эти действия отражаются в пунктах подменю меню «Бинарнный
файл». Меню содержит следующие пункты:
 Добавить;
 Просмотреть файл
Наименование пунктов меню
Бинарный файл
Добавить
Просмотреть файл
Наименование свойства Name пунктов меню
N2
addBinFile
ShowBinFile
Прежде чем представить отклики соответствующих пункто меню, следует сделать
следующее замечание. Бинарный файл связан с текстовым файлом через наименование товара.
Поэтому, на представленной страничке с помощью кнопки «Выбрать товар», необходимо
загрузить ComboBox списком товаров, а затем выбрать из ComboBox тот товар, который
предлагается магазину. Выбранный товар отражается в 3-х компонентах Edit, расположенных
справа от другой группы компонентов Edit. Над этой группы и расположена кнопка «Выбор
товара» и ComboBox1. Таким образом, после того как выбран конкретный товар, данные о
товаре отражаются в праворасположенных Edit, затем заполняются данные в Edit,
расположенные слева, после чего выполняется команда «Добавить».
Отклики соответствующих пунктов меню имеют вид:
void __fastcall TForm1::N2Click(TObject *Sender)
{//активизируем вторую страницу PageControl
PageControl1->ActivePage=TabSheet2;
}
Прежде чем добавить новый товар в бинарный файл, выполним нажатие кнопки
«Выбрать товар»:
void __fastcall TForm1::Button1Click(TObject *Sender)
{//выбрать товар
int nkod,nk;
if ((fb=fopen(sb,"ab+"))==NULL)
{ShowMessage("Файл не открыт!");
return;}
fseek(fb,0,2);
kon=ftell(fb)/sizeof(mag)+1;
fseek(fb,-sizeof(mag),2) ; //переходим на последнюю запись в файле
fread(&nk,sizeof(int),1,fb); // и читаем значение первого поля (переменная целого типа)
if (kon>(nk+1))
{
ShowMessage("Отсортируйте файл-отчет \n по номеру накладной!");
return;}
nkod=nk+1;
fseek(fb,-sizeof(mag),2) ;
fread(&nk,sizeof(int),1,fb);
nkod=nk+1;
fclose(fb);
Edit6->Text=IntToStr(nkod);
OtbTovForAddBin(ComboBox1); //метод, позволяющий отобрать нужный товар
}
40
void OtbTovForAddBin(TComboBox *CB)
{ // отбор товара при помощи change для выбора товара при добавлении в бинфайл
zagruz(CB);// метод для загрузки ComboBox наименованиями товара
}
void zagruz(TComboBox *CB)
{// метод для загрузки ComboBox наименованиями товара
char naz[3][40];
if ((ft=fopen(st,"rt+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
CB->Clear();
fseek(ft,0,0);
while ((fscanf(ft,"%s%s%s", &naz[0],&naz[1],&naz[2]) ) >0)
CB->Items->Add(naz[0]);
fclose(ft);
}
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{ //выбрать товар из ComBox1 для добавл в бин файл
char naz[3][40];
IzmTovInComBox1(naz,ComboBox1);
//метод, с помощью которого заносится информация
Edit7->Text=AnsiString(naz[0]);
//о товаре во все праворасположенные Edit
Edit7->Enabled=false;
//там, где отражается информация о наимен. товара делаем Edit7 недоступным
Edit8->Text=naz[1];
Edit9->Text=naz[2];
}
void IzmTovInComBox1(char naz[][40],TComboBox *CB)
{//метод для определения данных (значений полей) для выбранного товара
int nn=CB->ItemIndex;
char s[80];
if ((ft=fopen(st,"rt+"))==NULL)
{ShowMessage("Файл не открыт!");
return;}
int k=0;
fseek(ft,0,0);
while ((fscanf(ft,"%s%s%s", &naz[0],&naz[1],&naz[2]) ) >0)
{if (k==nn)break;
k=k+1;
}
fclose(ft);
}
После того, как выбран товар и заполнены все поля, выполняется пунк меню
«Добавить»
void __fastcall TForm1::addBinFileClick(TObject *Sender)
{// добавить выбранные данные в бинарный файл
if (Edit10->Text==""||Edit11->Text=="")
{ShowMessage("Не все данные введены!");return;}
41
int nn=ComboBox1->ItemIndex;
char naz[3][40];
mag.kod_mag=StrToInt(Edit6->Text);
mag.kol=StrToInt(Edit10->Text);
mag.Date_prod=DateToStr(Edit11->Text);
addFileBin(mag,naz,nn);//метод добавления данных в бинарный файл
Edit6->Text="";
Edit10->Text="";
Edit11->Text="";
Edit7->Enabled=true;
Edit7->Text="";
Edit8->Text="";
Edit9->Text="";
ComboBox1->Clear();
}
void addFileBin(Magaz &mag, char naz[][40],int &nn)
{ //добавляем данные в бинарный файл
if ((ft=fopen(st,"rt"))==NULL)
{ShowMessage("Файл не удается открыть"); return;}
int k=0;
while ((fscanf(ft,"%s%s%s", &naz[0],&naz[1],&naz[2],&naz[3]) ) >0)
{ if (k==nn)break;//читаем выбранные данные из текстового файла
k=k+1; }
AnsiString s=AnsiString(naz[0]);
strcpy(mag.name_tov,s.c_str());
mag.garant=StrToFloat(naz[1]);
mag.sena=StrToFloat(naz[2]) ;
fclose(ft);
if ((fb=fopen(sb,"ab+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
fseek(fb,0,2);
fwrite(&mag,sizeof(mag),1,fb);
fclose(fb);
}
Пункт меню «Просмотр»
void __fastcall TForm1::ShowBinFileClick(TObject *Sender)
{// что в бинарном файле ?
ChoInBinFile(mag,SG1); //метод для отображения данных из бинарного файла
}
void ChoInBinFile(Magaz &mag,TStringGrid *Sg)
{ //что в бинарном файле?
if ((fb=fopen(sb,"rb+"))==NULL)
{ShowMessage("Файл не открыт!"); return;}
Sg->Cells[0][0]= "№ накл";
Sg->Cells[1][0]="Наим. тов";
Sg->Cells[2][0]="Дата прод.";
Sg->Cells[3][0]="Гаран.срок";
Sg->Cells[4][0]="Кол.тов";
42
Sg->Cells[5][0]="Цена";
Sg->Cells[6][0]="Сумма";
fseek(fb,0,0);
Sg->RowCount=2;
int i=0;
while (fread(&mag,sizeof(mag),1,fb))
{i++;
Sg->Cells[0][i]=mag.kod_mag;
Sg->Cells[1][i]=mag.name_tov;
Sg->Cells[1][i]=mag.name_tov;
Sg->Cells[2][i]=mag.Date_prod;
Sg->Cells[3][i]=mag.srok_gar();
Sg->Cells[4][i]=IntToStr(mag.kol);
Sg->Cells[5][i]=FloatToStrF(mag.sena,ffFixed,5,2);
Sg->Cells[6][i]=FloatToStrF(mag.sum(),ffFixed,5,2);
Sg->RowCount=i+1;
}
fclose(fb);
}
Переходим к следующей страницы PageControl, на которой отражены дальнейшие
операции по обработке бинарного файла (см. рис. 10).
Рис.10 Рабочая форма с отображением 3-ой страницы PageControl
На третьей страницы выполняются следующие операции по обработке бинарного
файла:



Просмотр бинарного файла;
Сохранение после редактирования;
Удаление записи в бинарном файле.
43
Наименование пунктов меню
РедактПросмУдал
ПросмотрБинФайл
СохранитьБинИзмен
УдалениеЗаписиБин
Наименование свойства Name пунктов меню
N3
AllProcmFileBin
SaveIzmeneniy
DelBinFile
Пункт редактирования как таковой отсутствует в меню, но редактировать запись в
бинарном файле можно следующим образом. Для этого, по аналогии с предыдущей страницей,
с помощью кнопки «Выбрать товар для редактирования в бинфайле», загружаем ComboBox3,
выбираем наименование товара из ComboBox3, и данные в бинарном файле со сведениями об
этом товаре загружаются в StringGrid, ячейки которого и редактируются. На приведенной
странице показан также еще один StringGrid, служащий для отображения информации о числе
байт в файле до той строки, которая будет редактироваться. Эта информация позволит
вернуться к редактируемой записи и перейти на ту же строку для записи после редактирования.
Для того чтобы, этот компонент не отвлекал внимание во время работы, делаем его не
видимым.
На этой же странице размещены также компонент Memo, служащий для отображения
изменений до и после редактирования, а также после удаления.
Ниже приведены все отклики как на подпункты меню, так и отклик на кнопку
«Выбрать товар для редактирования в бинфайле» для выбора наименования товара из
ComboBox3:
Пункт меню «ПросмотрБинФайла»
void __fastcall TForm1::AllProcmFileBinClick(TObject *Sender)
{//просмотр содержимое бинарного файла в Мемо4
prosmotrBinFile(Memo4);//функция для просмотра
}
void prosmotrBinFile(TMemo *MM)
{//функция (метод) для просмотра бинфайла в Мемо4
if ((fb=fopen(sb,"rb+"))==NULL)
{ShowMessage("Файл не открыт!");
return;}
MM->Clear();
fseek(fb,0,0);
while (fread(&mag,sizeof(mag),1,fb))
MM->Lines->Add(IntToStr(mag.kod_mag)+" "+AnsiString(mag.name_tov)+" "
+mag.Date_prod+" "+ mag.srok_gar()+" "+FormatFloat("0.00",mag.garant)+" "+
IntToStr(mag.kol)+" "+FormatFloat("0.00",mag.sena)+" "
+FormatFloat("0.00",mag.sum()));
fclose(fb);
}
Приводим последовательность программных кодов для редактирования:
void __fastcall TForm1::Button8Click(TObject *Sender)
{ //кнопка отобрать товар для редактирования
OtbTovForAddBin(ComboBox3); //используем тот же метод, что и вышеописанный
}
Выбираем в ComboBox3 нужное наименование товара
void __fastcall TForm1::ComboBox3Change(TObject *Sender)
{ //отбор наименования товара из ComboBox3 для редактирования
44
OtborCB3Tov(mag,SGg,ComboBox3);
//метод для просмотра информации по выбранному по наименованию товара
}
void OtborCB3Tov(Magaz &mag,TStringGrid *Sg[],TComboBox *CB)
{//метод для просмотра данных по выбранному товару
String ss=CB->Text;
if ((fb=fopen(sb,"rb+"))==NULL)
{ShowMessage("Файл не открыт!");
return;}
Sg[0]->Cells[0][0]="№ Накл";
Sg[0]->Cells[1][0]="НаимТов";
Sg[0]->Cells[2][0]="ДатаПрод";
Sg[0]->Cells[3][0]="СрокГаран";
Sg[0]->Cells[4][0]="ДатаГаран";
Sg[0]->Cells[5][0]="Кол";
Sg[0]->Cells[6][0]="Цена";
Sg[0]->Cells[7][0]="Сумма";
fseek(fb,0,0);
int i=1;
int posi=0;
while (fread(&mag,sizeof(mag),1,fb)>0)
{ if (AnsiString(mag.name_tov)==ss)
{
posi=ftell(fb);
Sg[0]->Cells[0][i]=AnsiString(mag.kod_mag);
Sg[0]->Cells[1][i]=AnsiString(mag.name_tov);
Sg[0]->Cells[2][i]=mag.Date_prod;
Sg[0]->Cells[3][i]=mag.srok_gar();
Sg[0]->Cells[4][i]=FormatFloat("0.00",mag.garant);
Sg[0]->Cells[5][i]=IntToStr(mag.kol);
Sg[0]->Cells[6][i]=FormatFloat("0.00",mag.sena);
Sg[0]->Cells[7][i]=FormatFloat("0.00",mag.sum()) ;
Sg[1]->Cells[0][i]=IntToStr(posi);
i++;
Sg[1]->RowCount=i;
Sg[0]->RowCount=i;
}
}
if (i==1)
{ShowMessage("Такого товара нет!");
Sg[0]->RowCount=2;
Sg[1]->RowCount=2;
}
CB->Text="";
fclose(fb);
}
Пункт меню сохранения данных после редактирования
void __fastcall TForm1::SaveIzmeneniyClick(TObject *Sender)
{//сохранить изменения после редактирования
Magaz mag1;
45
saveIzmenBinFile(mag1,SGg);//метод для сохранения
AllProcmFileBinClick(NULL);// здесь запускаем пункт меню «Просмотреть»
ComboBox3Change(0);
for(int j=0;j<SGg[0]->ColCount;j++)
for (int k=0; k<SGg[0]->RowCount;k++)
{
SGg[0]->Cells[j][k]="";
SGg[1]->Cells[j][k]="";
}
SGg[0]->RowCount=2;
SGg[1]->RowCount=2;
}
void saveIzmenBinFile(Magaz &mag1, TStringGrid *Sg[])
{ //сохраняем данные после редактирования
if ((fb=fopen(sb,"rb+"))==NULL)
{ShowMessage("Файл не открыт!");
return;}
int posi;
fseek(fb,0,0);
for (int i=1;i<Sg[0]->RowCount;i++)
{posi=StrToInt(Sg[1]->Cells[0][i]);
posi=posi-sizeof(mag1);
fseek(fb,posi,0);
fread(&mag1,sizeof(mag1),1,fb);
mag1.garant=StrToFloat(Sg[0]->Cells[4][i]);
mag1.kol=StrToInt(Sg[0]->Cells[5][i]);
mag1.sena=StrToFloat(Sg[0]->Cells[6][i]);
fseek(fb,(-1)*sizeof(mag1),1);
fwrite(&mag1,sizeof(mag),1,fb);
fseek(fb,0,0);
} fclose(fb);
}
Прежде чем удалять запись из файла необходимо выполнить пункт меню
«ПросмотрБинФайла», затем в окне просмотра Мемо выделить строку, соответствующую
записи, которую необходимо удалить и удалите ее, например нажав кнопку «Del», после чего
выполнить команду пункта меню «УдалениеЗаписиБин».
Пункт меню «УдалениеЗаписиБин»:
void __fastcall TForm1::DelBinFileClick(TObject *Sender)
{ //удаление файла
String s;
int ni;
int k=Memo4->Lines->Count;
for (int i=0;i<k;i++)
{ s=Memo4->Lines->Strings[i];
if (s=="") ni=i+1; //определяем, какая строка удалена
}
delFileBin(ni) ; // метод для удаления записи в бинфайле
AllProcmFileBinClick(NULL);// опять просматриваем Мемо4
}
46
void delFileBin(int ni)
{//метод для удаления записи из бин файла
FILE *tmp;// Создаем временный бинарный файл
int k1;
if ((fb=fopen(sb,"rb+"))==NULL)
{ShowMessage("Файл не открыт!");return;}
if ((tmp=fopen("bb.dat","wb+"))==NULL)
{ShowMessage("Файл не открыт!"); return;}
Magaz mag2;
int k2;
while (fread(&mag2,sizeof(Magaz),1,fb))
{k2=ftell(fb)/sizeof(Magaz);
if (k2==ni) continue;
fwrite(&mag2,sizeof(Magaz),1,tmp);
}
fclose(fb);
fseek(tmp,0,0);
fb=fopen(sb,"wb+");
while (fread(&mag2,sizeof(Magaz),1,tmp))
fwrite( &mag2,sizeof(Magaz),1,fb); //переписываем данные в файле
fclose(tmp);
remove("bb.dat"); // удаляем временный файл
fclose(fb);
}
Здесь следует обратить внимание на следующее. В последних двух откликах
SaveIzmeneniyClick и DelBinFileClick приведены обращения к откликам
AllProcmFileBinClick(NULL) и ComboBox3Change(0), что позволяет оперативно отслеживать
изменяющуюся информацию после редактирования или при удалении записей.
Еще одна особенность, а именно, так как загрузки 3-x компонентов ComboBox
выполняются по одному и тому же алгоритму, реализацию этого алгоритм выделим в
отдельную функцию, которую назавем zagruz(TcomboBox *CB). Обращение к этой функции
будем выполнять одинаково при загрузке всех 3-х ComboBox значениями наименований
товаров, как это было показано выше:
void OtbTovForAddBin(TComboBox *CB)
{ // отбор наименования товаров в ComboBox1
zagruz(CB);
}
Переходим к 4-ой странице на PageControl, на которой отразим некоторые итоги по
отчетам из бинарного файла, и при необходимости, проведем сортировку по некоторым полям
результаты сортировки . На этой странице разместим:
 компонент StringGrid, в котором будем отражать суммы, полученные как по
отдельным товарам, так и по всем товарам одновременно;
 компонент Button, с помощью которого будем загружать в ComboBox
наименование товаров, а затем проводить отбор этих товаров для представления
отчета по отдельному товару;
 два компонента Memo, в которых отразим последовательность данных в файле до и
после сортировки;
 компонент Edit, в котором будем отображать количество записей в бинарном
файле;
 компонент RadioGroup, при помощи которого можно будет сортировать бинарный
файл по коду накладной или по наименование товара.
47
Все используемые компоненты делаются невидимыми и они отражаются
последовательно только во время выполнения приложения.
Для управления отображением данных на этой странице используется меню «Отчеты»
с подпунктами:
 сортировка;
 отчет по одному товару;
 общий отчет;
Наименование пунктов меню
РедактПросмУдал
Сортировка
ОтчетпоОдному
Общийотчет
Наименование свойства Name пунктов меню
N4
FileBinSort
OtchetBinOne
AllBinOtchet
На рис. 11 показаны рабочие формы во время выполнения поочередных пунктов меню.
Пункт меню «Отчеты»
void __fastcall TForm1::N5Click(TObject *Sender)
{
RG1->Visible=false;
SG3->Visible=false;
ComboBox2->Visible=false;
Button11->Visible=false;
SG2->Visible=false;
Memo6->Visible=false;
Memo7->Visible=false;
Edit15->Visible=false;
Label22->Visible=false;
Label18->Visible=false;
Label19->Visible=false;
Label2->Visible=false;
PageControl1->ActivePage=TabSheet5;
}
Как видно из приведенного кода, все компоненты невидимые.
Начнем описание выполнения пункта меню «Сортировка»
void __fastcall TForm1::FileBinSortClick(TObject *Sender)
{
RG1->Visible=true;
Memo6->Visible=true;
Memo7->Visible=true;
Edit15->Visible=true;
Label22->Visible=true;
Label18->Visible=true;
Label19->Visible=true;
}
Для сортировки файла по одному из полей файла используется компонент
RadioGroup. Выбор поля осуществляется щелчком мыши против выбранного поля, после чего
выполняется соответствующий код:
void __fastcall TForm1::RG1Click(TObject *Sender)
{
Memo6->Clear();
48
Memo7->Clear();
SortBinFile(Memo6,Memo7,Edit15,RG1);//функция (метод) сортировки
}
Рис. 11. Внешний вид 4-ой страницы в режиме выполнения трех пунктов меню
49
void SortBinFile(TMemo *MM1,TMemo *MM2,TEdit *Ed, TRadioGroup *RR)
//сортировать бин файл по накладной или по товару
{if ((fb=fopen(sb,"rb+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
fseek(fb,0,0);
while (fread(&mag,sizeof(mag),1,fb))
MM1->Lines->Add(IntToStr(mag.kod_mag)+" "
+AnsiString(mag.name_tov)+" "+mag.Date_prod+" "
+FloatToStrF(mag.sum(),ffFixed,5,2)+" "+mag.srok_gar()) ;
int k,raz;
fseek(fb,0,2);
k=ftell(fb); //объем файла
raz=k/sizeof(mag); //количество записей
Ed->Text=IntToStr(raz);
fseek(fb,0,0);
Magaz *a=new Magaz[raz]; //создаем динамический массив
int i=0;
while (fread(&mag,sizeof(mag),1,fb))
{a[i]=mag;
i++;}
fclose(fb);
Magaz temp; //дополнительная переменная структуры типа Magaz
for (int i=0;i<raz-1;i++)
for (int j=i+1;j<raz;j++)
{if (RR->ItemIndex==1 )
if ((AnsiString)a[i].name_tov>(AnsiString)a[j].name_tov)
{temp=a[i]; a[i]=a[j]; a[j]=temp;}//сортируем по наименованию товара
if (RR->ItemIndex==0)
if (a[i].kod_mag>a[j].kod_mag)
{temp=a[i]; a[i]=a[j]; a[j]=temp;}//сортируем по номеру накладной
}
if ((fb=fopen(sb,"wb"))==NULL) //открываем файл для перезаписи
{ShowMessage("Файл не удается открыть"); return;}
for(int i=0;i<raz;i++)
fwrite(&a[i],sizeof(mag),1,fb);
fclose(fb);
fb=fopen(sb,"rb+");
while (fread(&mag,sizeof(mag),1,fb))
MM2->Lines->Add(IntToStr(mag.kod_mag)+" "+AnsiString(mag.name_tov)+
" "+mag.Date_prod+" "+FloatToStrF(mag.sum(),ffFixed,5,2)+" "+mag.srok_gar()) ;
fclose(fb);
delete []a; // удаляем динамический массив
}
Второй пункт меню «Отчет по одному товару»:
void __fastcall TForm1::OtchetBinOneClick(TObject *Sender)
{//отчет по одному выбранному товару
ComboBox2->Visible=true;
Button11->Visible=true;
SG2->Visible=true;
}
50
Как видно из рисунка, для выполнения этого пункта меню необходимо выбрать
наименование товара из ComboBox2:
void __fastcall TForm1::Button11Click(TObject *Sender)
{ //кнопка для отбора наименования товара для создания отчета
OtbTovForAddBin(ComboBox2);// метод для выбора товара
}
void __fastcall TForm1::ComboBox2Change(TObject *Sender)
{ //отобор товара в СomboBox2 при создании отчета для выбраннолго товара
ChanTovForOtchBin(ComboBox2);//выбираем товар
OtchetOneTov(SG2,ComboBox2);
}
void ChanTovForOtchBin(TComboBox *CB)
{ int nn=CB->ItemIndex;
char s[80];
if ((ft=fopen(st,"rt+"))==NULL)
{ShowMessage("Файл не удается открыть"); return;}
int k=0;
fseek(ft,0,0);
while (fgets(s,80,ft))
{ if (k==nn)break;
k=k+1;
}
fclose(ft);
}
void OtchetOneTov(TStringGrid *Sgt,TComboBox *CB)
{//функция построения отчета по одному товару
AnsiString ss=CB->Text;
float ssum=0;
if ((fb=fopen(sb,"rb+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
Sgt->RowCount=2;
AnsiString sss=" ";
sss=sss+" "+" "+" "+" ";
Sgt->Rows[1]->DelimitedText=sss; //очищаем ячейки
Sgt->Rows[2]->DelimitedText=sss;
Sgt->Cells[0][0]="Код";
Sgt->Cells[1][0]="Наим.";
Sgt->Cells[2][0]="Дпродаж";
Sgt->Cells[3][0]="Дсрокгар";
Sgt->Cells[4][0]="Сумма";
Sgt->Cells[5][0]="Кол";
Sgt->Cells[6][0]="Цена";
int i=0;
fseek(fb,0,0);
while (fread(&mag,sizeof(mag),1,fb))
if (AnsiString(mag.name_tov)==ss)
{
i++;
ssum=ssum+mag.sum();
Sgt->Cells[0][i]=IntToStr(mag.kod_mag);
51
Sgt->Cells[1][i]=mag.name_tov;
Sgt->Cells[2][i]=mag.Date_prod;
Sgt->Cells[3][i]=mag.srok_gar();
Sgt->Cells[4][i]=FloatToStrF(mag.sum(),ffFixed,5,2);
Sgt->Cells[5][i]=IntToStr(mag.kol);
Sgt->Cells[6][i]=FormatFloat("0.00",mag.sena);
Sgt->RowCount=i+1;
}
if (i>=1)
{ Sgt->RowCount=i+2;
Sgt->Cells[2][i+1]="Итого";
Sgt->Cells[4][i+1]=FormatFloat("0.00",ssum);
}
else ShowMessage("Данных по выбранному товару нет!");
fclose(fb);
}
«Отчет по всем товарам»
void __fastcall TForm1::AllBinOtchetClick(TObject *Sender)
{ //содание общего отчета
SG3->Visible=true;
Label2->Visible=true;
OtchetAllTov(SG3) ;//функция (метод) для отображения общего отчета
}
void OtchetAllTov(TStringGrid *Sgt)
{ char naz[3][40];
if ((ft=fopen(st,"rt+"))==NULL)
{ShowMessage("Файл не удается открыть"); return;}
if ((fb=fopen(sb,"rb+"))==NULL)
{ShowMessage("Файл не удается открыть"); return;}
bool flag=false;
Sgt->Cells[0][0]="Код";
Sgt->Cells[1][0]="Наим.";
Sgt->Cells[2][0]="Дпродаж";
Sgt->Cells[3][0]="Дсрокгар";
Sgt->Cells[4][0]="Сумма";
Sgt->Cells[5][0]="Кол";
Sgt->Cells[6][0]="Цена";
float summ=0;
float ssum;
int k=0;
int i=0;
fseek(ft,0,0);
while ((fscanf(ft,"%s%s%s", &naz[0],&naz[1],&naz[2])) >0)
{ ssum=0;
fseek(fb,0,0);
while (fread(&mag,sizeof(mag),1,fb))
{if (AnsiString(mag.name_tov)==AnsiString(naz[0]))
{flag=true;
i++;
ssum=ssum+mag.sum();
52
Sgt->Cells[0][i]=IntToStr(mag.kod_mag);
Sgt->Cells[1][i]=mag.name_tov;
Sgt->Cells[2][i]=mag.Date_prod;
Sgt->Cells[3][i]=mag.srok_gar();
Sgt->Cells[4][i]=FloatToStrF(mag.sum(),ffFixed,5,2);
Sgt->Cells[5][i]=IntToStr(mag.kol);
Sgt->Cells[6][i]=FormatFloat("0.00",mag.sena);
Sgt->RowCount=i+1;
Sgt->Cells[2][i+1]="Итого";
Sgt->Cells[4][i+1]=FormatFloat("0.00",ssum);
} else flag!=flag;
}
if (flag) { i++; Sgt->RowCount=i+1; }
summ=summ+ssum;
} k=i+1;
Sgt->RowCount=k+1;
Sgt->Cells[2][k]="Всего";
Sgt->Cells[4][k]=FormatFloat("0.00",summ);
fclose(ft);
fclose(fb);
}
Таким образом, выше показаны реализация всех откликов по пунктам меню и кнопок
по загрузки всех ComboBox наименованиями товаров и все методы, которые реализованы в
библиотеке Bibliot.cpp. В загрузочном файле Bibliot.h объявлены структуры, типы данных для
работы с файлами и перечислены все прототипы функций (методов). Причем, для работы с
файлами необходимо подключить соответствующие библиотеки
#include <stdio.h>
#include <DateUtils.hpp>// для работы с данными типа TdateTime.
#include <Grids.hpp>// для возможности введения в параметры функций
// указателей на объект TSringGrid
Содержимое загрузочного файла приводится ниже:
struct Tovar
{char name[25];
float garan;
float cena;
AnsiString Info()
{return AnsiString(name)+" "+FormatFloat("0.00",garan)+
" "+FormatFloat("0.00",cena); }
};
struct Magaz
{ int kod_mag;
char name_tov[25];
float garant;
TDateTime Date_prod;
int kol;
float sena;
float sum()
{return kol*sena;}
53
TDateTime srok_gar()
{ float ff=garant*365;
return Date_prod.operator +(ff); }
AnsiString Info()
{return IntToStr(kod_mag)+" "+" "+AnsiString(name_tov)+" "+
FormatFloat("0.00",garant)+" "+DateToStr(Date_prod)
+" "+DateToStr(srok_gar())+" "+IntToStr(kol)+" "
+FormatFloat("0.00",sena)+" "+FormatFloat("0.00",sum());}
};
Tovar tov;
Magaz mag;
FILE *ft,*fb;
char st[]="a.txt";
char sb[]="b.dat";
void CreateForm(); //инициализация файловых переменных
void addFileText(Tovar &); // добавление в текстовый файл
AnsiString choInFileText(int &); //что в текстовом файле ?
void EditingText(char naz[][40], int &);// редактирование 1 текстового файла
void Edit2Text(Magaz &mag, int &nnt,TMemo *MM, TEdit *Ed[]); //для редактирования
// текстового файла
void SaveIzmTextFile(Tovar &,int &, TMemo *MM, TEdit *Ed[]); // сохранение изменений
void DelTextFile(TMemo *MM, TEdit *Ed);
// удаление из текстового файла
void OtbTovForAddBin(TComboBox *CB); //кнопка выбрать товар для ввода в бин файл
void IzmTovInComBox1(char naz[][40],TComboBox *CB);//выбрать товар из ComBox1
// для добавл в бин файл
void addFileBin(Magaz &,char naz[][40],int &); //добавление в бин файл
void ChoInBinFile(Magaz &mag,TStringGrid *Sg); // что в бинарном файле
void prosmotrBinFile(TMemo *MM);
//просмотр данных в бин файле
void OtborCB3Tov(Magaz &mag,TStringGrid *Sg[],TComboBox *CB); //отбор товара в
//ComBox3 для редактирования
void saveIzmenBinFile(Magaz &mag, TStringGrid *Sg[]); //сохранить изменения в бин файле
void delFileBin(int ni);
// удалить запись из бин файла
void ChanTovForOtchBin(TComboBox *CB);//отбор товара с помощью Combobox2
void OtchetOneTov(TStringGrid *Sgt,TComboBox *CB);//для создания отчета по одному
//товару
void OtchetAllTov(TStringGrid *Sgt); // для создания общего отчета
void SortBinFile(TMemo *MM1,TMemo *MM2,TEdit *Ed, TRadioGroup *RR) ;
//сортировать бин файл по товару
#endif
Реализация методов отражены в файле реализации Bibliot.cpp:
void CreateForm() //инициализация файловых переменных
{if ( FileExists(st) )
ft = fopen(st,"rt+");
else
ft = fopen(st,"wt");
54
fclose(ft);
if ( FileExists(sb) )
fb = fopen(sb,"rb+");
else
fb = fopen(sb,"wt");
fclose(ft);
ShortDateFormat="dd.mm.yyyy";
}
void addFileText(Tovar &tov)
{ //добавить в текст файл
if ((ft=fopen(st,"rt+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
char s[80];
String ss;
AnsiString ssr=AnsiString(tov.name);
while (fgets(s,80,ft))
{ ss=AnsiString(s);
if (ss.Pos(ssr)>0)
{ShowMessage("В файле уже есть товар с таким названием");
fclose(ft);
return;
}
}
fseek(ft,0,2);
fprintf(ft,(tov.Info()+"\n").c_str());
fclose(ft);
}
AnsiString choInFileText(int &d)
{ //просмотр данных в текстовом файле
char s[80];
AnsiString ss="";
if ((ft=fopen(st,"rt+"))==NULL)
{ShowMessage("Файл не удается открыть");
return ss;}
fseek(ft,0,2);
d=ftell(ft);
fseek(ft,0,0);
while (fgets(s,80,ft))
{if(s[strlen(s)-1]=='\n') s[strlen(s)-1]='\0';
ss=ss+AnsiString(s)+"\r\n";
}
fclose(ft);
return ss;
}
void EditingText(char naz[][40], int &nnt)
{ if ((ft=fopen(st,"rt+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
55
nnt=StrToInt(InputBox("Введите номер редактируемой строки файла",
"N Строки","")) ;
fseek(ft,0,0);
int kk=0; //0
while ((fscanf(ft,"%s%s%s", &naz[0],&naz[1],&naz[2]) ) >0)
{ if (kk==nnt-1) break; //nnt-1
kk++;
}
fclose(ft);
}
void Edit2Text(Magaz &mag, int &nnt,TMemo *MM, TEdit *Ed[])
{char s[80];
if ((ft=fopen(st,"rt+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
MM->Clear();
fseek(ft,0,0);
while (fgets(s,80,ft))
{if(s[strlen(s)-1]=='\n') s[strlen(s)-1]='\0';
MM->Lines->Add(s);}
char naz[3][40];
EditingText(naz, nnt); //Редактирование, обращ к вышестоящему методу
Ed[2]->Text=naz[0];
Ed[2]->Enabled=false;
Ed[3]->Text=naz[1];
Ed[4]->Text=naz[2];
fclose(ft);
}
void SaveIzmTextFile(Tovar &tov,int &nnt, TMemo *MM, TEdit *Ed[])
{//сохраняем изменения и перезаписываем в файл
char s[80];
char naz[3][40];
if ((ft=fopen(st,"rt+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
fseek(ft,0,0);
strcpy(tov.name,Ed[2]->Text.c_str( ));
tov.garan=StrToFloat(Ed[3]->Text);
tov.cena=StrToFloat(Ed[4]->Text);
//записываем в строкe, заменяя только строку с nnt
int k=0;
AnsiString ss="";
AnsiString d,s1;
while (fgets(s,80,ft)>0)
{ k++;
if (k==nnt)
ss=ss+tov.Info()+"\n";
else
{s1=AnsiString(s);
56
ss=ss+s1; }
}
MM->Clear();
ft=fopen(st,"wt+") ;
fseek(ft,0,0);
while (ss.Length()>0)
{ d=ss.SubString(1,ss.Pos("\n"));
fputs(d.c_str(),ft);
ss.Delete(1,ss.Pos("\n"));
}
fseek(ft,0,0);
while (fgets(s,80,ft))
{if(s[strlen(s)-1]=='\n') s[strlen(s)-1]='\0';
MM->Lines->Add(s); }
fclose(ft);
}
void DelTextFile(TMemo *MM, TEdit *Ed)
{ //удаляем запись из текстового файла
char s[80];
char naz[3][40];
if ((ft=fopen(st,"rt+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
if ((fb=fopen(sb,"rb+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
fseek(fb,0,0);
FILE *tmp;
if ((tmp=fopen("bt.txt","wt+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
AnsiString ss,s4;
ss=InputBox("Какую строку следует удалить","Укажите номер строки","");
if (ss=="") {ShowMessage("Вы не ввели данные!"); return;}
int k1=StrToInt(ss);
Magaz mag2;
int k2=0;
fseek(ft,0,0);
fseek(tmp,0,0);
while ((fscanf(ft,"%s%s%s", &naz[0],&naz[1],&naz[2]) ) >0)
{ k2++;
if (k1==k2)
{ while (fread(&mag2,sizeof(mag),1,fb))
if (AnsiString(mag2.name_tov)==AnsiString(naz[0]))
{ ShowMessage
("Удалять запись нельзя, \nтак как имеются данные в другой таблице" );
fclose(tmp); remove("bt.txt");fclose(fb);fclose(ft);
return;
}
}
else
57
{s4="";
if (k1!=k2)
s4=s4+AnsiString(naz[0])+" "+AnsiString(naz[1])+" "+AnsiString(naz[2])+"\n";
fputs(s4.c_str(),tmp);
}
}
ft=fopen(st,"wt+") ;
fseek(ft,0,0);
fseek(tmp,0,0);
MM->Clear();
while (fgets(s,80,tmp) >0) //перезаписываем из временного файла в основной
fputs(s,ft);
fclose(tmp);
remove("bt.txt");
fseek(ft,0,0);
while (fgets(s,80,ft)) //отображаем данные из перезаписанного файла
{if(s[strlen(s)-1]=='\n') s[strlen(s)-1]='\0';
MM->Lines->Add(s);}
fseek(ft,0,2);
int d=ftell(ft);
Ed->Text=d;
fclose(ft);
}
void zagruz(TComboBox *CB)
{
char naz[3][40];
if ((ft=fopen(st,"rt+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
CB->Clear();
fseek(ft,0,0);
while ((fscanf(ft,"%s%s%s", &naz[0],&naz[1],&naz[2]) ) >0)
CB->Items->Add(naz[0]);
fclose(ft);
}
void OtbTovForAddBin(TComboBox *CB)
{ // отбор товара при помощи change для выбора товара при добав в бинфайл
zagruz(CB);
}
void IzmTovInComBox1(char naz[][40],TComboBox *CB)
{
int nn=CB->ItemIndex;
char s[80];
if ((ft=fopen(st,"rt+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
int k=0;
fseek(ft,0,0);
while ((fscanf(ft,"%s%s%s", &naz[0],&naz[1],&naz[2]) ) >0)
58
{if (k==nn)break;
k=k+1;
}
fclose(ft);
}
void addFileBin(Magaz &mag, char naz[][40],int &nn)
{ //добавляем данные в бин файл
if ((ft=fopen(st,"rt"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
int k=0;
while ((fscanf(ft,"%s%s%s", &naz[0],&naz[1],&naz[2],&naz[3]) ) >0)
{ if (k==nn)break;
k=k+1; }
AnsiString s=AnsiString(naz[0]);
strcpy(mag.name_tov,s.c_str());
mag.garant=StrToFloat(naz[1]);
mag.sena=StrToFloat(naz[2]) ;
fclose(ft);
if ((fb=fopen(sb,"ab+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
fseek(fb,0,2);
fwrite(&mag,sizeof(mag),1,fb);
fclose(fb);
}
void prosmotrBinFile(TMemo *MM)
{//просмотр данных в бин фале
if ((fb=fopen(sb,"rb+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
MM->Clear();
fseek(fb,0,0);
while (fread(&mag,sizeof(mag),1,fb))
MM->Lines->Add(IntToStr(mag.kod_mag)+" "+AnsiString(mag.name_tov)+" "
+mag.Date_prod+" "+ mag.srok_gar()+" "+FormatFloat("0.00",mag.garant)+" "+
IntToStr(mag.kol)+" "+FormatFloat("0.00",mag.sena)+" "
+FormatFloat("0.00",mag.sum()));
fclose(fb);
}
void delFileBin(int ni)
{//удалить запись из бин файла
FILE *tmp;
int k1;
if ((fb=fopen(sb,"rb+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
if ((tmp=fopen("bb.dat","wb+"))==NULL)
59
{ShowMessage("Файл не удается открыть");
return;}
Magaz mag2;
int k2;
while (fread(&mag2,sizeof(Magaz),1,fb))
{k2=ftell(fb)/sizeof(Magaz);
if (k2==ni) continue;
fwrite(&mag2,sizeof(Magaz),1,tmp);
}
fclose(fb);
fseek(tmp,0,0);
fb=fopen(sb,"wb+");
while (fread(&mag2,sizeof(Magaz),1,tmp))
fwrite( &mag2,sizeof(Magaz),1,fb);
fclose(tmp);
remove("bb.dat");
fclose(fb);
}
void ChanTovForOtchBin(TComboBox *CB)
{ int nn=CB->ItemIndex;
char s[80];
if ((ft=fopen(st,"rt+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
int k=0;
fseek(ft,0,0);
while (fgets(s,80,ft))
{ if (k==nn)break;
k=k+1;
}
fclose(ft);
}
void OtchetOneTov(TStringGrid *Sgt,TComboBox *CB)
{//отчет по одному товару
// AnsiString s;
AnsiString ss=CB->Text;
float ssum=0;
if ((fb=fopen(sb,"rb+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
Sgt->RowCount=2;
AnsiString sss=" ";
sss=sss+" "+" "+" "+" ";
Sgt->Rows[1]->DelimitedText=sss;
Sgt->Rows[2]->DelimitedText=sss;
Sgt->Cells[0][0]="Код";
Sgt->Cells[1][0]="Наим.";
Sgt->Cells[2][0]="Дпродаж";
Sgt->Cells[3][0]="Дсрокгар";
Sgt->Cells[4][0]="Сумма";
60
Sgt->Cells[5][0]="Кол";
Sgt->Cells[6][0]="Цена";
int i=0;
fseek(fb,0,0);
while (fread(&mag,sizeof(mag),1,fb))
if (AnsiString(mag.name_tov)==ss)
{
i++;
ssum=ssum+mag.sum();
Sgt->Cells[0][i]=IntToStr(mag.kod_mag);
Sgt->Cells[1][i]=mag.name_tov;
Sgt->Cells[2][i]=mag.Date_prod;
Sgt->Cells[3][i]=mag.srok_gar();
Sgt->Cells[4][i]=FloatToStrF(mag.sum(),ffFixed,5,2);
Sgt->Cells[5][i]=IntToStr(mag.kol);
Sgt->Cells[6][i]=FormatFloat("0.00",mag.sena);
Sgt->RowCount=i+1;
}
if (i>=1)
{ Sgt->RowCount=i+2;
Sgt->Cells[2][i+1]="Итого";
Sgt->Cells[4][i+1]=FormatFloat("0.00",ssum);
}
else ShowMessage("Данных по выбранному товару нет!");
fclose(fb);
}
void OtchetAllTov(TStringGrid *Sgt)
{
char naz[3][40];
if ((ft=fopen(st,"rt+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
if ((fb=fopen(sb,"rb+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
bool flag=false;
Sgt->Cells[0][0]="Код";
Sgt->Cells[1][0]="Наим.";
Sgt->Cells[2][0]="Дпродаж";
Sgt->Cells[3][0]="Дсрокгар";
Sgt->Cells[4][0]="Сумма";
Sgt->Cells[5][0]="Кол";
Sgt->Cells[6][0]="Цена";
float summ=0;
float ssum;
int k=0;
int i=0;
fseek(ft,0,0);
while ((fscanf(ft,"%s%s%s", &naz[0],&naz[1],&naz[2])) >0)
{ ssum=0;
fseek(fb,0,0);
61
while (fread(&mag,sizeof(mag),1,fb))
{if (AnsiString(mag.name_tov)==AnsiString(naz[0]))
{flag=true;
i++;
ssum=ssum+mag.sum();
Sgt->Cells[0][i]=IntToStr(mag.kod_mag);
Sgt->Cells[1][i]=mag.name_tov;
Sgt->Cells[2][i]=mag.Date_prod;
Sgt->Cells[3][i]=mag.srok_gar();
Sgt->Cells[4][i]=FloatToStrF(mag.sum(),ffFixed,5,2);
Sgt->Cells[5][i]=IntToStr(mag.kol);
Sgt->Cells[6][i]=FormatFloat("0.00",mag.sena);
Sgt->RowCount=i+1;
Sgt->Cells[2][i+1]="Итого";
Sgt->Cells[4][i+1]=FormatFloat("0.00",ssum);
} else flag!=flag;
}
if (flag)
{i++; Sgt->RowCount=i+1;
//Form1->SG3->RowCount=i+1;
}
summ=summ+ssum;
} k=i+1;
Sgt->RowCount=k+1;
// Form1->SG3->RowCount=k+1;
Sgt->Cells[2][k]="Всего";
Sgt->Cells[4][k]=FormatFloat("0.00",summ);
fclose(ft);
fclose(fb);
}
void SortBinFile(TMemo *MM1,TMemo *MM2,TEdit *Ed, TRadioGroup *RR)
//сортировать бин файл по товару
{if ((fb=fopen(sb,"rb+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
fseek(fb,0,0);
while (fread(&mag,sizeof(mag),1,fb))
MM1->Lines->Add(IntToStr(mag.kod_mag)+" "
+AnsiString(mag.name_tov)+" "+mag.Date_prod+" "
+FloatToStrF(mag.sum(),ffFixed,5,2)+" "+mag.srok_gar()) ;
int k,raz;
fseek(fb,0,2);
k=ftell(fb);
raz=k/sizeof(mag);
Ed->Text=IntToStr(raz);
fseek(fb,0,0);
Magaz *a=new Magaz[raz]; //создаем динамический массив
int i=0;
while (fread(&mag,sizeof(mag),1,fb))
{a[i]=mag;
i++;}
fclose(fb);
62
Magaz temp;
for (int i=0;i<raz-1;i++)
for (int j=i+1;j<raz;j++)
{if (RR->ItemIndex==1 )
if ((AnsiString)a[i].name_tov>(AnsiString)a[j].name_tov)
{temp=a[i]; a[i]=a[j]; a[j]=temp;}
if (RR->ItemIndex==0)
if (a[i].kod_mag>a[j].kod_mag)
{temp=a[i]; a[i]=a[j]; a[j]=temp;}
}
if ((fb=fopen(sb,"wb"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
for(int i=0;i<raz;i++)
fwrite(&a[i],sizeof(mag),1,fb);
fclose(fb);
fb=fopen(sb,"rb+");
while (fread(&mag,sizeof(mag),1,fb))
MM2->Lines->Add(IntToStr(mag.kod_mag)+" "+AnsiString(mag.name_tov)+
" "+mag.Date_prod+" "+FloatToStrF(mag.sum(),ffFixed,5,2)+" "+mag.srok_gar()) ;
fclose(fb);
delete []a;
}
void saveIzmenBinFile(Magaz &mag1, TStringGrid *Sg[])
{ //сохранить изменения в бин файле после реактирования по одному товару
if ((fb=fopen(sb,"rb+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
int posi;
fseek(fb,0,0);
for (int i=1;i<Sg[0]->RowCount;i++)
{posi=StrToInt(Sg[1]->Cells[0][i]);
posi=posi-sizeof(mag1);
fseek(fb,posi,0);
fread(&mag1,sizeof(mag1),1,fb);
mag1.garant=StrToFloat(Sg[0]->Cells[4][i]); //3
mag1.kol=StrToInt(Sg[0]->Cells[5][i]);
//4
mag1.sena=StrToFloat(Sg[0]->Cells[6][i]); //5
fseek(fb,(-1)*sizeof(mag1),1);
fwrite(&mag1,sizeof(mag),1,fb);
fseek(fb,0,0);
} fclose(fb);
}
void OtborCB3Tov(Magaz &mag,TStringGrid *Sg[],TComboBox *CB)
{
String ss=CB->Text;
if ((fb=fopen(sb,"rb+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
Sg[0]->Cells[0][0]="№накл";
63
Sg[0]->Cells[0][0]="№накл";
Sg[0]->Cells[1][0]="НаимТов";
Sg[0]->Cells[2][0]="ДатПрод";
Sg[0]->Cells[3][0]="СрокГар";
Sg[0]->Cells[4][0]="ДатаГаран";
Sg[0]->Cells[5][0]="Кол";
Sg[0]->Cells[6][0]="Цена";
Sg[0]->Cells[7][0]="Сумма";
fseek(fb,0,0);
int i=1;
int posi=0;
while (fread(&mag,sizeof(mag),1,fb)>0)
{ if (AnsiString(mag.name_tov)==ss)
{
posi=ftell(fb);
Sg[0]->Cells[0][i]=AnsiString(mag.kod_mag);
Sg[0]->Cells[1][i]=AnsiString(mag.name_tov);
Sg[0]->Cells[1][i]=AnsiString(mag.name_tov);
Sg[0]->Cells[2][i]=mag.Date_prod;
Sg[0]->Cells[3][i]=mag.srok_gar();
Sg[0]->Cells[4][i]=FormatFloat("0.00",mag.garant);
Sg[0]->Cells[5][i]=IntToStr(mag.kol);
Sg[0]->Cells[6][i]=FormatFloat("0.00",mag.sena);
Sg[0]->Cells[7][i]=FormatFloat("0.00",mag.sum()) ;
Sg[1]->Cells[0][i]=IntToStr(posi);
i++;
Sg[1]->RowCount=i;
Sg[0]->RowCount=i;
}
}
if (i==1)
{ShowMessage("Этого товара\n в магазине нет!");
Sg[0]->RowCount=2;
Sg[1]->RowCount=2;
}
CB->Text="";
fclose(fb);
}
void ChoInBinFile(Magaz &mag,TStringGrid *Sg)
{ //Что в бинарном файле
if ((fb=fopen(sb,"rb+"))==NULL)
{ShowMessage("Файл не удается открыть");
return;}
Sg->Cells[0][0]= "№ накд";
Sg->Cells[0][0]="№ накд";
Sg->Cells[1][0]="Наим.тов";
Sg->Cells[2][0]="Дата прод.";
Sg->Cells[3][0]="Гаран.срок";
Sg->Cells[4][0]="Кол. тов";
Sg->Cells[5][0]="Цена";
Sg->Cells[6][0]="Сумма";
64
fseek(fb,0,0);
Sg->RowCount=2;
int i=0;
while (fread(&mag,sizeof(mag),1,fb))
{i++;
Sg->Cells[0][i]=mag.kod_mag;
Sg->Cells[1][i]=mag.name_tov;
Sg->Cells[1][i]=mag.name_tov;
Sg->Cells[2][i]=mag.Date_prod;
Sg->Cells[3][i]=mag.srok_gar();
Sg->Cells[4][i]=IntToStr(mag.kol);
Sg->Cells[5][i]=FloatToStrF(mag.sena,ffFixed,5,2);
Sg->Cells[6][i]=FloatToStrF(mag.sum(),ffFixed,5,2);
Sg->RowCount=i+1;
Sg->RowCount=i+1;
}
fclose(fb);
}
Задание
1. Для нотариальной конторы создать:
А. Текстовый файл, в котором необходимо отразить следующие данные:
- текущий номер услуги;
- наименование услуг;
- стоимость услуг;
- количество дней на выполнение услуг.
Б. Бинарный файл, в котором необходимо вести бухгалтерский учет:
- номер выданной квитанции;
- фамилия клиента, воспользовавший услугами нотариальной конторой;
- текущий номер услуги ;
- наименование услуги;
- дата заказа услуги;
- дата получения документа по услуге;
- сумма за услуги.
2. Для фирмы, занимающейся прокатом автомобилей, создать:
А. Текстовый файл, в котором необходимо отразить следующие данные:
- код марки автомобиля;
- марка автомобиля;
- стоимость проката в день;
- штрафные санкции в процентах при несвоевременном возврате автомобиля.
Б. Бинарный файл, в котором необходимо вести бугхалтерский учет:
- номер выданной квитанции;
- фамилия клиента;
- код марки автомобиля;
- марка автомобиля, взятого на прокат;
- дата взятия автомобиля на прокат;
- количество предполагаемых дней, взятых на прокат;
- дата предполагаемого возврата автомобиля;
- дата истинного дня возврата автомобиля;
- сумма за прокат автомобиля;
- сумма за несвоевременный возврат автомобиля.
65
По бухгалтерским документам вести учет выданных в прокат автомобилей, и суммы
дохода как по отдельным автомобилям, так и по всему парку выданных авто; а также
предусмотреть возможность просмотра данных по тем автомобилям, которые еще не
возвращены в парк.
3. Для фирмы, занимающейся ремонтом компьютерной техники, создать:
А. Текстовый файл, в котором необходимо отразить следующие данные:
- текущий код ремонтируемой техники;
- наименование компьютера;
- наименование ремонта;
- степень сложности в числовом исчислении (например, 1,2,3 и т.д.) ;
- срок времени, необходимый для ремонта (в днях);
- стоимость ремонта;
- гарантийный срок рослеремонтного обслуживания.
Б. Бинарный файл, в котором необходимо вести бухгалтерский учет:
- номер квитанции;
- фамилия клиента;
- код ремонтируемого компьютера;
- наименование компьютера;
- наименование ремонта;
- дата взятие компьютера в ремонт;
- срок времени для ремонта;
- дата предполагаемого завершения ремонта;
- дата завершения гарантийного срока;
- стоимость ремонта с учетом сложности выполнения ремонта;
- сумма за ремонт с учетом сложности (вычесляется по заданной формуле).
2. Для фирмы, по изготовлению корпускной мебели, создать:
А. Текстовый файл, в котором необходимо отразить следующие данные:
- текущий номер (код) списка мебели;
- наименование изготовляемой мебели;
- стоимость изготовление;
- срок исполнения (в днях);
Б. Бинарный файл, в котором необходимо вести бухгалтерский учет:
- текущий номер заказа;
- код изготовляемой мебели;
- наименование мебели;
- дата заказа;
- дата выполнения заказа;
- сумма за заказ;
3. Для агенства по недвижимости создать:
А. Текстовый файл, в котором необходимо отразить следующую информацию:
- текущий номер предлагаемой недвижемости;
- наименование предлагаемой недвижимости;
- цель использования недвижимости (купля, продажа, аренда);
- стоимость квадратного метра недвижимости в зависимости от цели;
- коэффициенты пересчета стоимости в зависимости от цели.
Б. Бинарный файл, в котором необходимо вести учет спроса на недвижимость:
- номер договора;
- код недвижемости из списка;
- наименование недвижимости;
- цель использования недвижимости;
- дата оформления договора;
- дата вступления в силу договора;
66
- при использовании недвижимости для аренды, определить длительность аренды;
- стоимость недвижимости по договору в зависимости от цели использования.
По бухгалтерским документам вести учет как по проданным, купленным объектам
недвижимости, так и при аренде недвижимости.
4. Для отдела ремонта АТС, создать:
А. Текстовый файл, в котором необходимо отразить следующую информацию:
- текущий номер из списка ремонта;
- наименование ремонта;
- коэффициент сложности ремонта;
- стоимость ремонта ;
- срок выполнения ремонта;
- срок гарантии после ремонта;
Б. Бинарный файл, в котором необходимо вести бухгалтерский учет:
- текущий номер заказа;
- код ремонта из списка;
- наименование ремонта;
- дата заказа на выполнения ремонта;
- коэффициент сложности выполнения ремонта;
- дата завершения ремонта;
- сумма ремонта;
7.
Для строительной компании создать:
А. Текстовый файл, в котором необходимо отразить следующую информацию:
- текущий номер строительного объекта;
- наименование строительного объекта;
- дата начала строительства;
- предполагаемая длительность завершения строительства (в годах);
- средняя стоимость квадратного метра с учетом этажности;
- коэффициэнты пересчета квадратного метра с учетом этажности.
Б. Бинарный файл, в котором необходимо вести учет спроса на предлагаемые метры
объекта строительства:
- номер договора;
- код строительного объекта;
- наименование строительного объекта;
- дата начала строительства;
- дата завершения строительства;
- заявленная площадь в строительном объекте;
- этажность, приобретаемого объекта;
- стоимость приобретаемого объекта с учетом этажности.
8. Для фирмы, занимающей ремонтом автомобилей, создать:
А. Текстовый файл, в котором необходимо отразить следующую информацию:
- текущий номер предлагаемых возможностей ремонта;
- наименование ремонта;
- коэффициент сложности выполняемого ремонта;
- средняя стоимость ремонта;
- срок выполнения ремонта;
- гарантийный срок на выполненый ремонт;
- сумма стомости с учетом сложности выполнения ремонта;
Б. Бинарный файл, в котором необходимо вести бухгалтерский учет:
- текущий номер заказа;
- код ремонта из списка;
- наименование ремонта;
- дата заказа на выполнения ремонта;
67
- коэффициент сложности выполнения ремонта;
- дата завершения ремонта;
- сумма ремонта;
9. Для магазина, предоставляющие на прокат диски и кассеты, создать:
А. Текстовый файл, в котором необходимо отразить следующую информацию:
- текущий номер диска или кассеты;
- наименование диска или кассеты;
- стоимость проката в сутки;
- минимальное количество дней проката;
- штрафные санкции в случае задержки по возврату;
Б. Бинарный файл, в котором необходимо вести бухгалтерский учет:
- текущий номер заказа;
- код диска или кассеты;
- наименование диска или кассеты;
- дата заказа;
- количество дней для проката;
- дата возврата кассеты;
- сумма за проката;
- общая сумма за прокат, если была задеожка;
10. Для отдела заказов универмага создать:
А. Текстовый файл, в котором необходимо отразить следующую информацию:
- текущий номер списка предоставляемых заказов;
- наименование возможного заказа;
- стоимость заказа;
- количество дней на выполнение заказа;
Б. Бинарный файл, в котором необходимо вести бухгалтерский учет:
- текущий номер поступившего заказа;
- текущий номер заказанного изделия;
- наименование заказанного изделия;
- дата оформления заказа;
- дата выполнения заказа;
- количество заказанного изделия;
- сумма за заказ;
11. Для фирмы, занимающей морскими перевозками, создать:
А. Текстовый файл, в котором необходимо отразить следующую информацию:
- текущий номер предлагаемог к перевозке товара или оборудования;
- наименования перевозимого оборудования;
- стоимость перевозки за тону на расстояние 1 км;
- количество дней на перевозку с учетом 200 км в сутки;
- максимальный тонаж перевозимого оборудования;
Б. Бинарный файл, в котором необходимо вести бухгалтерский учет:
- текущий номер заказа на перевозку;
- код изделия или оборудование для перевозки;
- наименование перевозимого изделия или оборудования;
- дата заказа для перевозки;
- общее расстояние, на которое перевозится заказ;
- дата доставки груза;
- в каком количестве в тонах перевозится груз;
- стоимость перевозки груза;
12. Для оптового рынка создать:
А. Текстовый файл, в котором необходимо отразить следующую информацию:
- код предлагаемого изделия;
68
- наименование изделия;
- коэффициент скидки при покупке изделия более 50 единиц;
- стоимость изделия без скидки;
- количество дней на предъявления претензий;
Б. Бинарный файл, в котором необходимо вести бухгалтерский учет:
- текущий номер накладной;
- код приобретаемого изделия;
- дата приобретения изделия;
- дата возможного возвращения изделя;
- количество приобретеного изделия;
- общая сумма за изделие с учетом скидок, если они есть;
13. Для множительного центра создать:
А. Текстовый файл, в котором необходимо отразить следующую информацию:
- код предлагаемой услуги;
- наименование услуги при размножении;
- скидка при количестве услуги более 50 единиц;
- стоимость услуги без учета скидок;
- количество дней на выполнение заказа;
Б. Бинарный файл, в котором необходимо вести бухгалтерский учет:
- текущий номер накладной;
- код выполняемого заказа по размножению документа;
- наименование выполняемой услуги;
- дата заказа на размножение;
- дата выполнения заказа;
- объем заказа на выполнение;
- общая сумма за выполнение заказа с учетом скидок;
14. Для фирмы, занимающей проектными работами, создать:
А. Текстовый файл, в котором необходимо отразить следующую информацию:
- текущий номер проектной работы;
- наименование проекта;
- стоимость выполнения проекта;
- количество дней на выполнения проекта;
Б. Бинарный файл, в котором необходимо вести бухгалтерский учет:
- текущий номер заказа на проект;
- код проекта;
- наименование проекта;
- дата заказа проекта;
- дата выполнения заказа;
- сумма за выполнения проекта;
15. Для библиотеки, создать:
А. Текстовый файл, в котором необходимо отразить следующие данные:
- код книги;
- наименование технической книги по программированию;
- количество дней, на которые выдается книга;
- штрафные санкции при задержки книги за день;
- стоимость книги при ее утере;
Б. Бинарный файл, в котором необходимо вести бухгалтерский учет:
- текущий номер абонента;
- код взятой книги;
- наименование книги;
- дата выдачи книги;
- дата ожидаемого возврата книги;
69
- сумма штрафных санкций за задежку или потери книги;
16. Для фирмы, реализующей компьютерную технику, создать:
А. Текстовый файл, в котором необходимо отразить следующие данные:
- номер из списка для реализации;
- наименование компьютера;
- стоимость стандартной конфигурации компьютера;
- дополнительная доплата за увеличения объема диска;
- дополнительная доплата за увеличение объема памяти;
- гарантийный срок;
Б. Бинарный файл, в котором необходимо вести бухгалтерский учет:
- текущий номер счета;
- код компьтера;
- наименование компьтера;
- дата покупки компьютера;
- дата возможного возврата компьютера по предъявлению претензий;
- стоимость покупки;
- доплата за объем диска;
- доплата за объем памяти;
- общая сумма к оплате.
17. Для завода по производству оборудования средств связи создать:
А. Текстовый файл, в котором необходимо отразить следующие данные:
- текущий номер оборудования;
- наименование оборудования;
- для каких целей предназначено данное оборудование;
- гарантийный срок безотказной работы;
- срок выполнения оборудования;
- стоимость оборудования.
Б. Бинарный файл, в котором необходимо вести бухгалтерский учет:
- номер квитанции;
- код создаваемого оборудования;
- наименование оборудования;
- дата заказа на изготовление;
- гарантийный срок безотказной работы;
- дата срока действия гарантийного срока безотказной работы;
- количество выпускаемой продукции в месяц;
- стоимость единицы продукции;
- сумма за продукцию, предложенную для реализации.
По бугхартеским документам предусмотреть возможность вести учет по отдельным видам
деятельности, так и по работе, так и по всем видам деятельности предприятия. Предусмотреть
также возможность сортировки данных в бинарных файлах по некоторым полям, в том числе,
по номеру текущей записи.
Кроме того, обеспечить возможность автоматического увеличения текущих кодов в
каждом файле на единицу и соблюдать общие требования, высказанные при обсуждении общей
постановки задачи, а именно, удалению записей, дублированию записей в текстовых файлах
(так называемых, прайс-листа).
70
Список использованной литературы
71
Download