- •В.В. Чуркин лабораторные работы по программированию
- •Содержание
- •Введение
- •Основное окно иср
- •Лабораторная работа 1
- •Задания
- •Проектирование приложения. Выбор, размещение и задание свойств компонентов. Коды обработчиков событий и функций
- •Тестирование и использование приложения
- •Контрольные вопросы
- •Задания
- •Лабораторная работа 2
- •Тестирование и использование приложения
- •Контрольные вопросы
- •Задания
- •Лабораторная работа 3
- •Задание
- •Проектирование приложения. Выбор, размещение и задание свойств компонентов. Коды классов, функций и обработчиков событий
- •Тестирование и использование приложения
- •Заголовочный файл
- •Файл реализации
- •Контрольные вопросы
- •Задания
- •Лабораторная работа 4
- •Введение
- •Алгоритмы шифрования и дешифрования
- •Проектирование приложения. Выбор, размещение и задание свойств компонентов. Коды классов, функций и обработчиков событий
- •Тестирование и использование приложения
- •Контрольные вопросы
- •Лабораторная работа 5
- •Введение
- •Алгоритмы
- •Проектирование приложения. Выбор, размещение и задание свойств компонентов. Коды классов, функций и обработчиков событий
- •Диспетчеризация действий на основе компонента ActionList
- •Тестирование и использование приложения
- •Контрольные вопросы
- •Лабораторная работа 6
- •Введение
- •Проектирование приложения. Выбор, размещение и задание свойств компонентов. Коды классов, функций и обработчиков событий
- •Тестирование и использование приложения
- •Контрольные вопросы
- •Задания (стеки, очереди)
- •Лабораторная работа 7
- •Введение
- •Проектирование приложения. Выбор, размещение и задание свойств компонентов. Коды классов, функций и обработчиков событий
- •Диспетчеризация действий на основе компонентов ActionManager, ActionMainMenuBar, ActionToolBar
- •Тестирование и использование приложения
- •Контрольные вопросы
- •Задания
- •Лабораторная работа 8
- •Введение
- •Проектирование приложения. Выбор, размещение и задание свойств компонентов. Коды классов, функций и обработчиков событий
- •Тестирование и использование приложения
- •Контрольные вопросы
- •Задания
- •Лабораторная работа 9
- •Введение
- •Проектирование приложения. Выбор, размещение и задание свойств компонентов. Коды классов, функций и обработчиков событий
- •Тестирование и использование приложения
- •Контрольные вопросы
- •Задания
- •Библиографический список
Тестирование и использование приложения
Запустите приложение на выполнение, нажав быстрые кнопки Сохранить все и Запуск.
Выполните тестирование по рис.7.5. Рекомендуется добавлять и удалять элементы с включенным индикатором. Команда Вывести список необходима при отладке и тестировании приложения.
Составьте и выполните тесты, которые проверят правильность всех случаев добавления и удаления элементов подсписков (см. комментарии в файлах f_7.cpp и LR_7.cpp).
Убедитесь в правильности сохранения списка в файле.
Модифицируйте код, переместив данные-элементы классов TRoll и TBike в закрытые части классов. Выполните отладку. Результаты продемонстрируйте преподавателю.
Рис.7.5 – форма с результатами тестирования
Файл реализации LR_7.cppмодуляLR_7
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "LR_7.h"
#include "f_7.h"
#include<string.h>
#include<fstream.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CSPIN"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
//при создании формы создаем заголовок таблицы
void __fastcall TForm1::FormCreate(TObject *Sender)
{
StringGrid1->FixedRows=1;
StringGrid1->RowCount=1;
StringGrid1->FixedCols=0;
StringGrid1->ColCount=8;
StringGrid1->Cells[0][0]="номер";
StringGrid1->Cells[1][0]="изделие";
StringGrid1->Cells[2][0]="кол-во(шт) в п/сп";
StringGrid1->Cells[3][0]="дата поступления";
StringGrid1->Cells[4][0]="производитель";
StringGrid1->Cells[5][0]="диам колес(мм)";
StringGrid1->Cells[6][0]="вес(кг)";
StringGrid1->Cells[7][0]="кол-во скоростей";
}
//---------------------------------------------------------------------------
//активация компонентов для ввода данных элемента списка - велосипед
void __fastcall TForm1::RadioButton1Click(TObject *Sender)
{
GroupBox1->Caption="Велосипед";
DateTimePicker1->SetFocus();
LabeledEdit3->Enabled=true;
CSpinEdit1->Enabled=true;
Label2->Enabled=true;
}
//---------------------------------------------------------------------------
//подготовка компонентов для ввода данных элемента
// списка - ролик. коньки
void __fastcall TForm1::RadioButton2Click(TObject *Sender)
{
GroupBox1->Caption="Ролик. коньки";
DateTimePicker1->SetFocus();
LabeledEdit3->Enabled=false;
CSpinEdit1->Enabled=false;
Label2->Enabled=false;
}
//---------------------------------------------------------------------------
listspisok;//создаем объект класса - список
void __fastcall TForm1::AddExecute(TObject *Sender)
{
if(RadioButton1->Checked)
{ //создаем элемент списка - велосипед
TBike *bike=new TBike;
strcpy(bike->date,(DateToStr(DateTimePicker1->Date)).c_str());
if(LabeledEdit1->Text=="")
{
MessageBox(NULL,"Введите название производителя!","Ошибка", 0);
LabeledEdit1->SetFocus();
return;
}
strcpy(bike->comp,(LabeledEdit1->Text).c_str());
if(LabeledEdit2->Text==""||!isdigit(LabeledEdit2->Text[1]))
{
MessageBox(NULL,"Введите диаметр колес!","Ошибка",0);
LabeledEdit2->SetFocus();
return;
}
bike->diam=StrToInt(LabeledEdit2->Text);
if(LabeledEdit3->Text==""||!isdigit(LabeledEdit3->Text[1]))
{
MessageBox(NULL,"Введите вес!","Ошибка",0);
LabeledEdit3->SetFocus();
return;
}
bike->weight=StrToFloat(LabeledEdit3->Text);
bike->speeds=CSpinEdit1->Value;
//созданный элемент добавляем в список
spisok.append_bike(bike);
}
if(RadioButton2->Checked)
{ //создаем элемент списка - роликовые коньки
TRoll *roll=new TRoll;
strcpy(roll->date,(DateToStr(DateTimePicker1->Date)).c_str());
if(LabeledEdit1->Text=="")
{
MessageBox(NULL,"Введите название производителя!","Ошибка",0);
LabeledEdit1->SetFocus();
return;
}
strcpy(roll->comp,(LabeledEdit1->Text).c_str());
if(LabeledEdit2->Text==""||!isdigit(LabeledEdit2->Text[1]))
{
MessageBox(NULL,"Введите диаметр колес!","Ошибка",0);
LabeledEdit2->SetFocus();
return;
}
roll->diam=StrToInt(LabeledEdit2->Text);
//созданный элемент добавляем в список
spisok.append_roll(roll);
}
MessageBox(NULL,"Элемент добавлен!","",0);
//если индикатор включен - список выводится в таблицу
if(CheckBox1->Checked)spisok.out_list();
//вывод информации о списке
Form1->StatusBar1->SimpleText="Количество подсписков - "+
IntToStr(spisok.count_dsp)+" "+"Количество элементов в списке - "+
IntToStr(spisok.count_elem_sp);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::A_exitExecute(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
//вывод списка в таблицу
void __fastcall TForm1::OutExecute(TObject *Sender)
{
spisok.out_list();
}
//---------------------------------------------------------------------------
int r; //переменная для номера строки выделенной ячейки в таблице
bool flag=true; //флаг - нет выделенной ячейки в таблице
void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,
int ARow, bool &CanSelect)
{
r=ARow; //номер строки выделенной ячейки сохранен в переменной r
flag=false; //ячейка в таблице выделена
}
//---------------------------------------------------------------------------
//удаляем из списка элемент, соответствующий номеру
//строки выделенной в таблице ячейки
void __fastcall TForm1::DelExecute(TObject *Sender)
{
if(spisok.is_empty)//если список пуст
{
MessageBox(NULL,"Список пуст!","",0);
return;
}
if(flag) //если ячейка в таблице не выделена
{
MessageBox(NULL,"Выделите элемент в таблице!","Ошибка",0);
return;
}
//удаляем из списка элемент, соответствующий значению переменной r
spisok.del(r);
//если индикатор включен - список выводится в таблицу
if(CheckBox1->Checked)spisok.out_list();
flag=true;//можно снова выделять ячейку в таблице
}
//---------------------------------------------------------------------------
//удаляем из списка подсписок, соответствующий номеру
//строки выделенной в таблице ячейки
void __fastcall TForm1::Clear_downExecute(TObject *Sender)
{
if(spisok.is_empty) //если список пуст
{
MessageBox(NULL,"Список пуст!","",0);
return;
}
if(flag) //если ячейка в таблице не выделена
{
MessageBox(NULL,"Выделите элемент в таблице!","Ошибка",0);
return;
}
//удаляем из списка подсписок, соответствующий значению переменной r
spisok.clear_down(r);
//если индикатор включен - список выводится в таблицу
if(CheckBox1->Checked)spisok.out_list();
flag=true; //можно снова выделять ячейку в таблице
}
//---------------------------------------------------------------------------
//уничтожаем список
void __fastcall TForm1::ClearExecute(TObject *Sender)
{
if(spisok.is_empty) //если список пуст
{
MessageBox(NULL,"Список пуст!","",0);
return;
}
//для объекта - список вызывается функция уничтожения списка
spisok.clear();
//уничтожение списка контролируется выводом в таблицу
spisok.out_list();
}
//---------------------------------------------------------------------------
AnsiString fn=""; //строка для имени файла
//вспомогательная строка для вывода списка из таблицы в файл
char str[50];
int s;//вспомогательная переменная для вывода в файл
//количества элементов в списке
//---------------------------------------------------------------------------
//сохраняем список в файле
void __fastcall TForm1::FileSave1Execute(TObject *Sender)
{
if(fn!="") //если есть имя файла со списком
{
ofstream outfile(fn.c_str(),ios::out);//открываем файл для записи
//в переменную s заносим количество элементов в списке
s=spisok.count_elem_sp;
//выводим в файл число из переменной s побайтно
outfile.write((char*)&s,sizeof(s));
//из таблицы список выводим в файл
for(int i=1; i<=s; i++)
{
for(int j=0;j<8;j++)
{ //преобразовав элемент из таблицы к типу char*,
//копируем его в вспомогательную строку str
strcpy(str,Form1->StringGrid1->Cells[j][i].c_str());
//выводим побайтно содержимое str в файл
outfile.write((char*)&str,50);
}
}
outfile.close();//закрываем файл
}
else //если файл со списком отсутствует
//открывается диалог сохранения в файле и пользователь
//выбирает имя файла
if(SaveDialog1->Execute())
{ //выбранное имя файла сохраняется в строке fn
fn=SaveDialog1->FileName;
//создается и открывается для записи файл с выбранным именем
ofstream outfile(fn.c_str(),ios::out);
//в переменную s заносим количество элементов в списке
s=spisok.count_elem_sp;
//выводим в файл число из переменной s побайтно
outfile.write((char*)&s,sizeof(s));
//из таблицы список выводим в файл
for(int i=1; i<=s; i++)
{
for(int j=0;j<8;j++)
{ //преобразовав элемент таблицы к типу char*,
//копируем его во вспомогательную строку str
strcpy(str,Form1->StringGrid1->Cells[j][i].c_str());
//выводим побайтно содержимое str в файл
outfile.write((char*)&str,50);
}
}
outfile.close();//закрываем файл
}
}
//---------------------------------------------------------------------------
//выводим список из файла в таблицу
//по данным таблицы формируем список в оперативной памяти
void __fastcall TForm1::FileOpen1Execute(TObject *Sender)
{
spisok.clear();//уничтожаем список в оперативной памяти
//открываем файл на чтение с выбранным при сохранении именем
ifstream infile(fn.c_str(),ios::in);
if(!infile) //проверка, удалось ли открыть файл
{
MessageBox(NULL,"Файл не удается открыть!","Ошибка",0);
return;
}
//в переменную s читаем из файла количество элементов в списке
infile.read((char*)&s,sizeof(s));
//читаем файл в таблицу
for(int i=1; i<=s; i++)
{
Form1->StringGrid1->RowCount++;//добавляем строку в таблице
for(int j=0;j<8;j++)
{ //читаем в строку str из файла очередную запись в 50 байт
infile.read((char*)&str,50);
//из строки str переносим запись в элемент таблицы
Form1->StringGrid1->Cells[j][i]=(AnsiString)str;
}
}
infile.close();//закрываем файл, открытый на чтение
//из данных строк таблицы формируем элементы списка
//элементы списка добавляем в список
for(int i=1; i<=s; i++)
{
if(StringGrid1->Cells[1][i]=="Bike")
{ //формируем элемент списка - велосипед
TBike* bike=new TBike;
strcpy(bike->date,StringGrid1->Cells[3][i].c_str());
strcpy(bike->comp,StringGrid1->Cells[4][i].c_str());
bike->diam=StrToInt(StringGrid1->Cells[5][i]);
bike->weight=StrToFloat(StringGrid1->Cells[6][i]);
bike->speeds=StrToInt(StringGrid1->Cells[7][i]);
spisok.append_bike(bike);//добавляем в список
}
if(StringGrid1->Cells[1][i]=="Roll")
{ //формируем элемент списка - роликовые коньки
TRoll* roll=new TRoll;
strcpy(roll->date,StringGrid1->Cells[3][i].c_str());
strcpy(roll->comp,StringGrid1->Cells[4][i].c_str());
roll->diam=StrToInt(StringGrid1->Cells[5][i]);
spisok.append_roll(roll);//добавляем в список
}
}
spisok.out_list(); //выводим прочитанный список в таблицу
//вывод информации о прочитанном списке
StatusBar1->SimpleText="Количество подсписков - "+
IntToStr(spisok.count_dsp)+" "+
"Количество элементов в списке - "+
IntToStr(spisok.count_elem_sp);
}
//---------------------------------------------------------------------------
//сохраняем как...
void __fastcall TForm1::FileSaveAs1Execute(TObject *Sender)
{
//выбранное ранее имя файла заносится в свойство FileName
//компонента SaveDialog1 и предлагается пользователю по умолчанию
SaveDialog1->FileName=fn;
//если при открытии диалога пользователь выбрал новое имя
if(SaveDialog1->Execute())
{ //то новое имя файла сохраняется в строке fn
fn=SaveDialog1->FileName;
//создается и открывается для записи файл с новым именем
ofstream outfile(fn.c_str(),ios::out);
if(!outfile) //проверка, удалось ли создать и открыть файл
{
MessageBox(NULL,"Файл не удается создать!","Ошибка",0);
return;
}
//в переменную s заносим количество элементов в списке
s=spisok.count_elem_sp;
//выводим в файл число из переменной s побайтно
outfile.write((char*)&s,sizeof(s));
//из таблицы список выводим в файл
for(int i=1; i<=s; i++)
{
for(int j=0;j<8;j++)
{ //преобразовав элемент таблицы к типу char*,
//копируем его в вспомогательную строку str
strcpy(str,Form1->StringGrid1->Cells[j][i].c_str());
//выводим побайтно содержимое str в файл
outfile.write((char*)&str,50);
}
}
outfile.close(); //закрываем файл
}
}
//---------------------------------------------------------------------------