Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задание С++ 07_10_08_.doc
Скачиваний:
25
Добавлен:
11.03.2016
Размер:
1.15 Mб
Скачать

Задание 1.2 Реализация таблицы на основе динамического массива

Определение статического массива

Tm[MAX];

заменить на определение указателя

T*m=0;

Динамическое выделение памяти под элементы организовать в функции

Voidresize(intn), которая выделяет память под имеющиеся элементы в массиве и дополнительно память подnэлементов, копирует в новую память имеющиеся элементы, освобождает ранее выделенную память.

Функция resizeиспользуется в функции insert следующим образом

T* insert(const T& item)

{if(length()>MAX) resize(MAX);

//…

}

Задание 1.3 Специальные функции работы со строками

Напишите, используя динамическое выделение памяти, реализации следующих функций:

  1. Char*concate(char*s1,char*s2); Соединяет(сцепляет) две строки

  2. Char* concate(char* s1, char* s2, char* s3); Соединяет(сцепляет) три строки

  3. Char*concate(char*mas[]); Соединяет(сцепляет) массив строк

  4. Char**split(char*s) Разбивает строку на массив подстрок

  5. Char**split(char*s,char*splits); Разбивает строку на массив подстрок, используя массив символов - разделителей

  6. Char*join(char*mas[],charsplit); Соединяет(сцепляет) массив строк, вставляя между ними символ разделитель

Задание 1.3 Разработка приложенияWindowsForms

Отладку и тестирование реализаций функций можно проводить в консольном варианте приложения. Для этого создается проект на основе шаблона WIN32ConsoleProject. Окончательный вариант разрабатывается как приложениеWindowsForms. Интерфейс программы имеет следующий вид:

Исполнение каждой операции начинается после нажатия соответствующей командной кнопки на форме. Ввод данных для формирования строк производится с помощью текстовых полей textBox.

Для конвертирования типа данных String* в тип данныхchar*можно использовать функции

int copyto(char* buf,String* S,int count);

int copyto(char** str,String* S);

Реализация функции использует функцию программного интерфейса windows WideCharToMultiByte

#include <windows.h>

#using <mscorlib.dll>

int copyto(char* buf,System::String* S,int count)

{int i, state=0;

for(i=0;i<S->Length;i++){

if(count<=i)break;

wchar_t t=S->Chars[i];

state=WideCharToMultiByte(CP_ACP, 0, &t, 1, &buf[i], 1, NULL, NULL);

}

buf[i]='\0';

return state;}

int copyto(char** str,System::String* S)

{ delete [](*str);

*str=new char [S->Length+1];

return copyto(*str,S, S->Length);

}

Код занесения данных из текстового поля textBox1 в таблицу будет выглядит следующим образом:

private: System::Void but2_Click(System::Object * sender, System::EventArgs * e)

{char buf [256];

if(textBox1->Text->Length!=0)

{copyto(buf, textBox1->Text,255);

insert(buf));}

listoutput();

}

Просмотр всех строк производится с помощью списка listBox. Для этого можно написать следующую функцию

void listoutput()

{listBox1->Items->Clear();

T* i;

for(i=begin();i!=end();i++)

{ String* s=new String(*i);

listBox1->Items->Add(s);

}

Пример разработки программы находится в приложении 1.

Структуры Задание 2 Реализация текстового редактора с использованием структур данных Задание 2.1 Представления набора строк в виде структур данных

Реализовать способ хранения набора строк в виде структуры данных. Продемонстрировать возможность работы с несколькими наборами строк одновременно.

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

Другим недостатком использованного способа представления набора строк является невозможность выделения дополнительной памяти в случае заполнения таблицы. Более универсальным является использование динамической памяти для хранения указателей на начало строк. В этом случае таблица вместо статического массива должна содержать указатель на начало участка динамической памяти.

Для того, чтобы иметь возможность работы с несколькими объектами одновременно, представим все данные, связанные со способом хранения строк, в виде одной структуры с полями разных типов. А функциям позволим обрабатывать несколько наборов строк, передав в качестве аргумента указатель на структуру с данными.

Таким образом, файлы, содержащие описание данных и функций для работы со строками, должны выглядеть следующим образом:

Заголовочный chars.

char* init (char* s,int size=256);

char* copy(char* s);

void dispose (char* s);

int equal(char*s1,char*s2);

int cmp(char*s1,char*s2);

typedef FILE* File;

int input(File f, char *t);

int input(char *t);

void output(File f, char *t);

void output(char *t);

заголовочный файл item.h.

#include "chars.h"

typedef char* T;

Заголовочный файл Tabl.h

#include "item.h"

struct Tabl{

T* m;

T* cur;

int size;

T buf;

};

Tabl* init(Tabl*i,int sz=10);

Tabl* resize(Tabl*t,int n);

// которая выделяет память под имеющиеся элементы в массиве

//и дополнительно память под n элементов,

//копирует в новую память имеющиеся элементы,

//освобождает ранее выделенную память.

//Функция resize используется в функции insert следующим образом

//T* insert(Tabl* t,const T& item)

//{if(length(t)>t->size) resize(t,t->size);

void dispose (Tabl*);

//освобождает выделенную память под элементы

//и под сам массив указателей

T* begin(Tabl*);

T* end(Tabl*) ;

int length(Tabl*);

T* insert(Tabl**,const T& item);

T* erase(Tabl*,T* pos);

void clear(Tabl*);

int find(Tabl* t,const T& item);

int remove(Tabl* t,const T& item);

int replace(Tabl* t,const T&Old,const T&New);

void sort(Tabl* t);

int input(File f,Tabl *t);

int input(Tabl *t);

void output(File f,Tabl *t);

void output(Tabl *t);

void foutput(Tabl *t, char* FileName);

int finput (Tabl *t, char* FileName);

Файл реализации Tabl.cpp

#include "Tabl.h”

T*begin(Tabl*t){return t->m;}

T*end(Tabl*t) {return t->cur;}

int length(Tabl*t){return t->cur-t->m;}

Tabl* init(Tabl* t, int sz)

{t=new Tabl;

t->buf=0; t->buf=init(t->buf);

t->cur=t->m=new T[t->size=sz];

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

t->m[i]=0;

return t;}

Tabl* resize(Tabl*t,int n)

{Tabl* tmp=init(t,t->size+n);

T* i;

for( i= begin(t); i!=end(t); i++)

*tmp->cur++=*i;

dispose(t->buf);

delete [] t->m;

delete t;

return tmp;

}

void clear(Tabl*t)

{T* i;

for( i= begin(t); i!=end(t); i++)

dispose(*i);

t->cur=t->m;

}

void dispose (Tabl* t)

{clear(t);

dispose(t->buf);

delete [] t->m;

delete t ;}

T* insert(Tabl**t,const T& item)

{T tmp= copy(item);

if(length(*t)>=(*t)->size)

*t=resize(*t,(*t)->size);

*(*t)->cur++=tmp;

return (*t)->cur;

}

Ввод данных в таблицу осуществляется с использованием вспомогательного буфера, уназатель на который определен структуре Tabl. Это позволит единообразно организовать ввод для различных типов данных, определяемых при помощи средства typedef.

Память под буфер выделяется динамически в функции

char* init(char* s,int size=256)

{return new char[size];}

Она вызовается при инициализации таблицы

Tabl* init(Tabl* t, int sz)

{t=new Tabl;

t->buf=0; t->buf=init(t->buf);

//…

}

int eof(){return feof(stdin); }

int input(Tabl *t)

{while(!eof( ) )

if(input (t->buf))

insert(&t,t->buf);

return length(t);

}

int input(File f,Tabl *t)

{

while(!eof( f ) )

if(input (f,t->buf))

insert(&t,t->buf);

return length(t);

}

void output(File f,Tabl *t)

{T* i;

for(i=begin(t);i!=end(t);i++)

output(f,*i);

}

void ExeptionFopen(char* str)

{printf("\n File %s\t open error\n",str);}

void foutput(Tabl *t,char* FileName)

{T* i;File f;

if ((f=fopen(FileName,"w"))==0)

{ ExeptionFopen(FileName); return ;}

output(f,t);

fclose(f);

}

int finput(Tabl*t,char* FileName)

{int count; File f;

if( (f =fopen(FileName,"r"))==0)

{ ExeptionFopen(FileName); return 0;}

count=input(f,t);

fclose(f);

return count;

}

Приложение WindowsForms

Для работы с таблицей в файле формы необходимо определить указатель Tabl* t=0; и добавить в обработчик события загрузки формы следующий код

private: System::Void Form1_Load(System::Object * sender, System::EventArgs * e)

{ t= init(t);

//…

}

Реализация функции ExeptionFopen

void ExeptionFopen(char* str)

{String* s=new String(str);

s=String::Concate(S"\nFile",s,S"\t open error\n");

MessageBos::Show(S"ExeptionFopen",s);