Тестирование и использование приложения
1.Запустите приложение на выполнение, нажав быстрые кнопки Сохранить все и Запуск.
2.Составьте и выполните тесты, которые проверят правильность всех сообщений об ошибках.
3.Выполните тестирование, подобное представленному на рис.6.6.
4.Убедитесь в правильности сохранения очереди в файле.
5.Данные-элементы из закрытых частей классов перенесите в открытые части классов и затем внесите соответствующие изменения в код.
6.Выполните отладку приложения и полученный результат продемонстрируйте преподавателю.
Рис.6.1 – главная форма по окончании проектирования
Рис.6.2 – дерево компонентов Рис.6.3 – дерево классов
главной формы проекта
Рис.6.4 – форма «О программе» с деревом компонентов.
Рис.6.5 – форма «О разработчике» с деревом компонентов.
Рис.6.6 – главная форма с результатами тестирования
Заголовочный файл модуля LR_6 главной формы Form1
//---------------------------------------------------------------------------
#ifndef LR_6H
#define LR_6H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Grids.hpp>
#include <ActnList.hpp>
#include <ComCtrls.hpp>
#include <ImgList.hpp>
#include <Menus.hpp>
#include <ToolWin.hpp>
#include <StdActns.hpp>
#include <Dialogs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TLabeledEdit *LabeledEdit5;
TLabel *Label1;
TStringGrid *StringGrid1;
TImageList *ImageList1;
TActionList *ActionList1;
TGroupBox *GroupBox1;
TLabeledEdit *LabeledEdit1;
TLabeledEdit *LabeledEdit2;
TLabeledEdit *LabeledEdit3;
TLabeledEdit *LabeledEdit4;
TGroupBox *GroupBox2;
TLabeledEdit *LabeledEdit6;
TLabeledEdit *LabeledEdit7;
TLabeledEdit *LabeledEdit8;
TLabeledEdit *LabeledEdit9;
TAction *A_add;
TAction *A_del;
TAction *A_clr;
TAction *A_help;
TAction *A_wrt;
TMainMenu *MainMenu1;
TMenuItem *N1;
TMenuItem *N2;
TMenuItem *N3;
TMenuItem *N4;
TMenuItem *N5;
TMenuItem *N6;
TMenuItem *N7;
TMenuItem *N8;
TMenuItem *N9;
TMenuItem *N10;
TMenuItem *N11;
TToolBar *ToolBar1;
TToolButton *ToolButton1;
TToolButton *ToolButton2;
TToolButton *ToolButton3;
TToolButton *ToolButton4;
TToolButton *ToolButton5;
TToolButton *ToolButton6;
TToolButton *ToolButton7;
TOpenDialog *OpenDialog1;
TSaveDialog *SaveDialog1;
TAction *A_fsave;
TAction *A_fopen;
void __fastcall A_addExecute(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
void __fastcall A_delExecute(TObject *Sender);
void __fastcall A_clrExecute(TObject *Sender);
void __fastcall A_helpExecute(TObject *Sender);
void __fastcall A_wrtExecute(TObject *Sender);
void __fastcall N11Click(TObject *Sender);
void __fastcall A_fsaveExecute(TObject *Sender);
void __fastcall A_fopenExecute(TObject *Sender);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Файл реализации модуля LR_6 главной формы Form1
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "LR_6.h"
#include "f_6.h"
#include<string.h>
#include "LR_6_1.h"
#include "LR_6_2.h"
#include<stdio.h>
#include<fstream.h>
#include<ctype.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
queue q;
void __fastcall TForm1::A_addExecute(TObject *Sender)
{
LabeledEdit6->Text="";
LabeledEdit7->Text="";
LabeledEdit9->Text="";
LabeledEdit8->Text="";
if(LabeledEdit1->Text=="")
{MessageBox(NULL,"Введите Фамилия И.О.!","Ошибка",0);
LabeledEdit1->SetFocus();
return;
}
if(LabeledEdit2->Text=="")
{MessageBox(NULL,"Введите Устройство!","Ошибка",0);
LabeledEdit2->SetFocus();
return;
}
if(LabeledEdit3->Text==""||!isdigit(LabeledEdit3->Text[1]))
{MessageBox(NULL,"Введите Приоритет!","Ошибка",0);
LabeledEdit3->SetFocus();
return;
}
if(LabeledEdit4->Text=="")
{MessageBox(NULL,"Введите Описание работ!","Ошибка",0);
LabeledEdit4->SetFocus();
return;
}
LabeledEdit5->Text=IntToStr(q.get_size());
Node* pd;
pd=new Node;
pd->name = new char[50];
strcpy(pd->name,LabeledEdit1->Text.c_str());
pd->model = new char[50];
strcpy(pd->model,LabeledEdit2->Text.c_str());
pd->work = new char[50];
strcpy(pd->work,LabeledEdit4->Text.c_str());
pd->priority=StrToInt(LabeledEdit3->Text.c_str());
q.insert(q.get_size(),pd);
LabeledEdit5->Text=IntToStr(q.get_size());
LabeledEdit1->Clear();
LabeledEdit2->Clear();
LabeledEdit3->Clear();
LabeledEdit4->Clear();
LabeledEdit1->SetFocus();
StringGrid1->RowCount++;
int i=q.get_size()-1;
StringGrid1->Cells[0][i+1]=
(AnsiString)(q.get_mas_dat(i).get_dat()->name);
StringGrid1->Cells[1][i+1]=
(AnsiString)(q.get_mas_dat(i).get_dat()->model);
StringGrid1->Cells[2][i+1]=
(AnsiString)(q.get_mas_dat(i).get_dat()->work);
StringGrid1->Cells[3][i+1]=
IntToStr(q.get_mas_dat(i).get_dat()->priority);
delete[]pd->name;
delete[]pd->model;
delete[]pd->work;
delete pd;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
LabeledEdit5->Text="0";
StringGrid1->FixedRows=1;
StringGrid1->RowCount=1;
StringGrid1->FixedCols=0;
StringGrid1->ColCount=4;
StringGrid1->Cells[0][0]="Фамилия И.О.";
StringGrid1->Cells[1][0]="Устройство";
StringGrid1->Cells[2][0]="Описание работ";
StringGrid1->Cells[3][0]="Приоритет";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::A_delExecute(TObject *Sender)
{
LabeledEdit6->Clear();
LabeledEdit7->Clear();
LabeledEdit9->Clear();
LabeledEdit8->Clear();
if(!(q.get_size()))
{
MessageBox(NULL,"Очередь пуста!","",0);
return;
}
data d=q.del();
LabeledEdit5->Text=IntToStr(q.get_size());
LabeledEdit6->Text=(AnsiString)d.get_dat()->name;
LabeledEdit7->Text=(AnsiString)d.get_dat()->model;
LabeledEdit9->Text=(AnsiString)d.get_dat()->work;
LabeledEdit8->Text=IntToStr(d.get_dat()->priority);
int i=0;
while(i<q.get_size())
{
StringGrid1->Cells[0][i+1]=
(AnsiString)(q.get_mas_dat(i).get_dat()->name);
StringGrid1->Cells[1][i+1]=
(AnsiString)(q.get_mas_dat(i).get_dat()->model);
StringGrid1->Cells[2][i+1]=
(AnsiString)(q.get_mas_dat(i).get_dat()->work);
StringGrid1->Cells[3][i+1]=
IntToStr(q.get_mas_dat(i).get_dat()->priority);
i++;
}
StringGrid1->RowCount--;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::A_clrExecute(TObject *Sender)
{
if(!(q.get_size()))
{
MessageBox(NULL,"Очередь пуста!","",0);
return;
}
q.queue_clear();
StringGrid1->RowCount=1;
LabeledEdit1->Clear();
LabeledEdit2->Clear();
LabeledEdit3->Clear();
LabeledEdit4->Clear();
LabeledEdit5->Text=IntToStr(q.get_size());
LabeledEdit6->Clear();
LabeledEdit7->Clear();
LabeledEdit8->Clear();
LabeledEdit1->SetFocus();
if(!(q.get_size()))
{
MessageBox(NULL,"Очередь уничтожена!","",0);
return;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::A_helpExecute(TObject *Sender)
{
Form1->Enabled=false;
Form2->Show();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::A_wrtExecute(TObject *Sender)
{
Form1->Enabled=false;
Form3->Show();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N11Click(TObject *Sender)
{
if(q.get_size()>0)
q.queue_clear();
Close();
}
//---------------------------------------------------------------------------
AnsiString fn;
//---------------------------------------------------------------------------
void __fastcall TForm1::A_fsaveExecute(TObject *Sender)
{
if(SaveDialog1->Execute())
{
fn=SaveDialog1->FileName;
ofstream outfile(fn.c_str(),ios::out);
if(!outfile)
{
MessageBox(NULL,"Файл не удается создать!","Ошибка",0);
return;
}
int s=q.get_size();
outfile.write((char*)&s,sizeof(s));
for(int i=0; i<s; i++)
{
outfile.write((char*)q.get_mas_dat(i).get_dat()->name,50);
outfile.write((char*)q.get_mas_dat(i).get_dat()->model,50);
outfile.write((char*)q.get_mas_dat(i).get_dat()->work,50);
outfile.write((char*)&(q.get_mas_dat(i).get_dat()->priority),sizeof(int));
}
outfile.close();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::A_fopenExecute(TObject *Sender)
{
if(q.get_size()>0)
q.queue_clear();
StringGrid1->RowCount=1;
LabeledEdit5->Text="";
if(OpenDialog1->Execute())
{
fn=OpenDialog1->FileName;
ifstream infile(fn.c_str(),ios::in);
if(!infile)
{
MessageBox(NULL,"Файл не удается открыть!","Ошибка",0);
return;
}
int s;
infile.read((char*)&s,sizeof(s));
for(int i=0; i<s; i++)
{
Node*pd=new Node;
pd->name=new char[50];
pd->model=new char[50];
pd->work=new char[50];
infile.read((char*)pd->name,50);
infile.read((char*)pd->model,50);
infile.read((char*)pd->work,50);
infile.read((char*)&(pd->priority),sizeof(int));
q.insert(i,pd);
StringGrid1->RowCount++;
StringGrid1->Cells[0][i+1]=
(AnsiString)(q.get_mas_dat(i).get_dat()->name);
StringGrid1->Cells[1][i+1]=
(AnsiString)(q.get_mas_dat(i).get_dat()->model);
StringGrid1->Cells[2][i+1]=
(AnsiString)(q.get_mas_dat(i).get_dat()->work);
StringGrid1->Cells[3][i+1]=
IntToStr(q.get_mas_dat(i).get_dat()->priority);
delete[]pd->name;
delete[]pd->model;
delete[]pd->work;
delete pd;
}
q.set_size(s);
LabeledEdit5->Text=IntToStr(q.get_size());
if(!q.get_size())
{
MessageBox(NULL,"Очередь пуста!","",0);
return;
}
infile.close();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if(q.get_size()>0)
q.queue_clear();
}
//---------------------------------------------------------------------------
Заголовочный файл модуля LR_6_1 формы Form2
//---------------------------------------------------------------------------
#ifndef LR_6_1H
#define LR_6_1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm2 : public TForm
{
__published: // IDE-managed Components
TMemo *Memo1;
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private: // User declarations
public: // User declarations
__fastcall TForm2(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm2 *Form2;
//---------------------------------------------------------------------------
#endif
Файл реализации модуля LR_6_1 формы Form2
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "LR_6_1.h"
#include "LR_6.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
Form1->Enabled=true;
}
//---------------------------------------------------------------------------
Заголовочный файл модуля LR_6_2 формы Form3.
//---------------------------------------------------------------------------
#ifndef LR_6_2H
#define LR_6_2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm3 : public TForm
{
__published: // IDE-managed Components
TMemo *Memo1;
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private: // User declarations
public: // User declarations
__fastcall TForm3(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm3 *Form3;
//---------------------------------------------------------------------------
#endif
Файл реализации модуля LR_6_2 формы Form3
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "LR_6_2.h"
#include "LR_6.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm3::FormClose(TObject *Sender, TCloseAction &Action)
{
Form1->Enabled=true;
}
//---------------------------------------------------------------------------
Контрольные вопросы
1.Внесите комментарии в файл LR_6.cpp.
2.Внесите комментарии в функции-элементы класса data в файле f_6.cpp.
3.Внесите комментарии в функции-элементы класса queue в файле f_6.cpp.
4.Как реализовать условие полной очереди?
5.Укажите в коде точки вызова конструктора с умолчанием класса data.
6.Где и как нужно изменить код, чтобы вывести количество вызовов конструктора с умолчанием класса data?
7.Укажите в коде точки вызова конструктора копии класса data.
8.Где и как нужно изменить код, чтобы вывести количество вызовов конструктора копии класса data?
9.Укажите в коде точки вызова конструктора класса queue.
10.Где и как нужно изменить код, чтобы вывести количество вызовов конструктора класса queue?
11.Укажите в коде точки вызова деструктора класса queue.
12.Где и как нужно изменить код, чтобы вывести количество вызовов деструктора класса queue?
13.Укажите в коде точки вызова деструктора класса data.
14.Где и как нужно изменить код, чтобы вывести количество вызовов деструктора класса data?
15.Укажите в коде точки вызова перегруженной операции присваивания класса data.
16.Где и как нужно изменить код, чтобы вывести количество вызовов перегруженной операции присваивания класса data?
17.Как создается объект класса data?
18.Как создается копия объекта класса data?
19.Как создается объект класса queue?
20.Как уничтожается объект класса data?
21.Как уничтожается объект класса queue?
22.Как создается очередь?
23.Изобразите структуру очереди в лабораторной работе.
24.Что является началом и что – концом очереди?
25.Как выбирается заявка из очереди?
26.Как уничтожается очередь?
27.Как очередь выводится в файл?
28.Как очередь вводится из файла?
29.Расскажите о способах реализации очередей.
30.Расскажите о порядке использования компонента ActionList.
31.Как связать MainMenuс ActionList?
32.Как связать ImageListс ActionList, с MainMenu, с ToolBar?
33.Как связать ToolBar с ActionList?
Задания (стеки, очереди)
1.В файле находится текст, в котором используются скобки трех типов: ( ), [ ], { }. Используя стек, проверить, соблюден ли баланс скобок в тексте.
2.Используя очередь, установить, сбалансирован ли по круглым скобкам записанный в файле текст. Требуется для каждой пары соответствующих открывающей и закрывающей скобок напечатать номера их позиций в тексте, упорядочив пары номеров по возрастанию номеров позиций: а) закрывающих скобок (например, для текста a+(45-f(x)*(b-c)) надо напечатать: 8 10; 12 16; 3 17); б) открывающих скобок (например, для текста a+(45-f(x)*(b-c)) надо напечатать: 3 17; 8 10; 12 16);
3. Используя стек, проверить, является ли содержимое текстового файла правильной записью формулы следующего вида: <формула>::=<терм> | <терм>+<формула> | <терм>-<формула>, <терм>::=<имя> | (<формула>), <имя>::=x | y | z.
4.В текстовом файле записана без ошибок формула Ф следующего вида: <Ф>::=<цифра> | M(<Ф>,<Ф >) | m(<Ф>,<Ф >), <цифра>::=0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9. (M обозначает функцию max, а m - функцию min.). Используя стек, вычислить как целое число значение данной формулы. Например: M(5,m(6,8))=6.
5.В текстовом файле записано без ошибок логическое выражение ЛВ следующего вида: <ЛВ>::=true | false | !<ЛВ> | <ЛВ>&&<ЛВ> | <ЛВ>||<ЛВ>. Используя стек, вычислить значение этого выражения с учетом приоритета операций.
6.Написать и протестировать функции включения, удаления и чтения очередного элемента стека объемом n элементов. В случае невозможности включения (переполнение стека), удаления из пустого стека выставлять флаг.
7.Для организации вычисления значения выражения удобнее вместо обычной (инфиксной) записи построить постфиксную (или польскую инверсную) запись - ПОЛИЗ. При вычислениях выражения, записанного в ПОЛИЗе, операции выполняются в том порядке, в котором они встречаются при просмотре выражения слева направо; поэтому отпадает необходимость использования скобок и многократного сканирования выражения из-за различного старшинства операций. Например, выражению 2+3*4 соответствует ПОЛИЗ 234*+, а выражению (a+(b-c)-d)*(e+f /d) - запись abc-+d-efd/+*. Используя стек, вычислить как целое число значение выражения, записанного в ПОЛИЗе.
8. Используя стек, выражение, записанное в ПОЛИЗе, перевести в инфиксную форму и распечатать (см. п.7).
9.С использованием структуры стек переписать содержимое текстового файла, разделенного на строки, в другой файл. Следует перенести в конец каждой строки все входящие в нее цифры в обратном порядке.
10.С использованием структуры очередь за один просмотр файла, содержащего целые числа, распечатать файл в следующем виде: сначала - все числа, меньшие A, затем - все числа из [A,B], потом - все остальные числа.
11.Пусть имеется ЭВМ, у которой один регистр и шесть команд:
LD A загрузить A в регистр;
ST A запомнить содержимое регистра в A;
AD A сложить содержимое регистра с A;
SB A вычесть A из содержимого регистра;
ML A умножить содержимое регистра на A;
DV A разделить содержимое регистра на A.
Напечатать последовательность машинных команд, необходимых для вычисления выражения, задаваемого в постфиксной форме. Выражение может состоять из однобуквенных операндов и знаков операций сложения, вычитания, умножения и деления. В качестве рабочих предлагается использовать переменные вида Tn.
Например, выражению ABC*+DE-/ будет соответствовать следующая последовательность команд :
LD B
ML С
AD A
ST T1
LD D
SB E
ST T2
LD T1
DV T2
ST T1
12.Для проверки того, является ли текст палиндромом, считать строку текста, помещая каждый непустой символ и в очередь, и в стек.
13.Массив может использоваться для сохранения двух стеков, один(S1), растущий (в направлении индекса) с левого конца, второй(S2), уменьшающийся с правого конца. Проверить, пуст ли S1, пуст ли S2, полон ли S1, полон ли S2; считать последовательность из целых чисел, помещая все четные в один стек, а нечетные – в другой. Вывести содержимое каждого стека.
14.Написать программу - модель очереди в супермаркете.
Покупатели появляются случайным образом в интервале времени от 1 до 4 минут. Обслуживается очередной покупатель также случайным образом в интервале времени от 1 до 4 минут. При несбалансированных скоростях появления и обслуживания очередь может бесконечно расти. Запустить модель очереди при условии 12-часового рабочего дня, используя следующий алгоритм: 1) взять случайное целое число в диапазоне от 1 до 4, означающее минуту появления первого покупателя; 2) в момент появления первого покупателя: определить время обслуживания (случайное целое число от 1 до 4 минут); начать обслуживание покупателя; спланировать время появления следующего покупателя (добавить к текущему времени случайное целое в диапазоне от 1 до 4); 3) для каждой минуты дня: если появился следующий покупатель, то поставить его в очередь, спланировать время появления следующего покупателя; если обслужен очередной покупатель, то исключить из очереди следующего покупателя, определить время его обслуживания.
Ответить на следующие вопросы: а) какое максимальное число покупателей было в очереди? б) каково максимальное время ожидания для покупателя? в) что происходит, если интервалы времени изменить с 1 - 4 минут до 1 - 3 минут?
15.С помощью стека реализовать преобразование десятичных чисел в числа с задаваемым основанием.
16.Вычислить значение инфиксного выражения, используя два стека.
17.Вычислить значение постфиксного выражения, используя один стек.
18.Используя очередь, реализовать модель танцев. По мере того, как мужчины и женщины входят в танцзал, мужчины выстраиваются в один ряд, женщины – в другой. Когда начинается танец, партнеры выбираются по одному из начала каждого ряда. Если в рядах количество людей неодинаковое, лишний человек должен ждать следующего танца.
Программа получает имена мужчин и женщин из файла (количество – случайное) и организуются очереди. Партнеры образуются удалением их из каждой очереди. Этот процесс останавливается, когда какая-либо очередь становится пустой. Если есть ожидающие люди, указать имя первого человека, который будет участвовать в следующем танце.
19.Написать программу для поразрядной сортировки данных, суть которой состоит в следующем. Пусть элементы массива содержат числа из двух цифр в диапазоне 00 – 99. Для сортировки используются 10 бункеров с номерами 0-9. Для сортировки нужны два прохода: сначала для обработки по позициям единиц, а затем – десятков. Если, например, массив содержит числа 91 46 85 15 92 35 31 22, то в первом проходе числа помещаются в бункеры в следующем порядке: в бункер 1 – 91,31, в бункер 2 – 92,22, в бункер 5 – 85,15,35, в бункер 6 – 46. Выбор из бункеров в порядке от 0 до 9 даёт результат первого прохода: 91 31 92 22 85 15 35 46. Во втором проходе распределение по бункерам таково: 1 – 15, 2 – 22, 3 – 31,35, 4 – 46, 8 – 85, 9 – 91,92. После выбора из бункеров получается последовательность: 15 22 31 35 46 85 91 92.
20.Стек может использоваться для распознавания определенных типов образов. Рассмотрим образец string1#string2, где строки не содержат # и string2 должна быть обратна string1. Например, строка “123@~a#a~@321” совпадает с образцом, а строка “a2qd#dq3a” – нет. Написать программу, которая считывает из файла заданное количество строк и указывает, совпадает или нет каждая строка с образцом.
21.Используя очередь, реализовать модель кольцевого буфера ёмкостью 1024 вещественных числа. Программа должна инициализировать буфер, добавлять/удалять элемент, определять количество свободного/занятого пространства в буфере.
22.Реализовать круговую модель очереди. При удалении элемента из круговой очереди не нужен сдвиг оставшихся элементов, - достаточно переопределить значение переменной, указывающей на начало очереди. Добавление элемента требует переопределения значения другой переменной, адресующей конец очереди. Отметим, что в круговой очереди последний элемент связан либо с первым свободным элементом, либо с началом очереди. Ещё одна переменная поддерживает запись количества элементов в очереди; равенство этой переменной максимальному значению означает, что очередь заполнена. Написать программу, реализующую модель круговой очереди.
23.Составить программу, отыскивающую проход по лабиринту. Лабиринт представляется в виде матрицы, состоящей из квадратов. Каждый квадрат либо открыт, либо закрыт. Вход в закрытый квадрат запрещен. Если квадрат открыт, то вход в него возможен со стороны, но не с угла. Каждый квадрат определяется его координатами в матрице. Программа находит проход через лабиринт, двигаясь от заданного входа. После отыскания прохода программа выводит найденный путь в виде координат квадратов. Для хранения пути использовать стек.
24.Гаражная стоянка имеет одну стояночную полосу, причем въезд и выезд находятся в одном конце полосы. Если владелец автомашины приходит забрать свой автомобиль, который не является ближайшим к выходу, то все автомашины, загораживающие проезд, удаляются, машина данного владельца выводится со стоянки, а другие машины возвращаются на стоянку в исходном порядке. Написать программу, которая моделирует процесс прибытия и отъезда машин. Прибытие или отъезд автомашины задается командной строкой, которая содержит признак прибытия или отъезда и номер машины. Программа должна выводить сообщение при прибытии или въезде любой машины. При выезде автомашины со стоянки сообщение должно содержать число раз, которое машина удалялась со стоянки для обеспечения выезда других автомобилей.
25.Задача “ханойские башни” относится к классическим задачам и состоит в том, чтобы переместить стопку дисков с одного шпиля на другой. Начальная стопка имеет n дисков, нанизанных на один шпиль так, что их размеры последовательно уменьшаются к вершине. Условия перемещения: при каждом перемещении можно брать только один диск, и больший диск никогда не должен находиться над меньшим диском. Третий шпиль даёт возможность временного размещения дисков. Написать программу, которая позволяет установить зависимость количества перемещений от величины n.
26.Очередь для моделирования Т-образного сортировочного узла на железной дороге. Программа должна разделять на два направления состав, состоящий из вагонов двух типов (на каждое направление формируется состав из вагонов одного типа). Предусмотреть возможность формирования состава из файла и с клавиатуры.
27.Стек для моделирования Т-образного сортировочного узла на железной дороге. Программа должна разделять на два направления состав, состоящий из вагонов двух типов (на каждое направление формируется состав из вагонов одного типа). Предусмотреть возможность формирования состава из файла и с клавиатуры.
28.Написать программу, реализующую стеки на основе массива и на основе списка.
29.Использовать стек для вывода по задаваемому основанию вводимых чисел с произвольным основанием.
30.Реализовать постфиксный калькулятор на основе стека.
Дата добавления: 2020-10-14; просмотров: 471;