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

Массивы указателей на строки Задание 1. Текстовый редактор Задание 1.1 Динамическая память. Модульное программирование

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

Строки хранятся в виде массива указателей на char. Память под строки выделяется динамически. Задается максимальный размер массива указателей на строки и указатель на первое свободное место в массиве.

#define MAX 100

typedef char* T;

T m[MAX];

T* cur=m;

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

При правильном модульном построении программы отсутствует необходимость в декларациях в заголовочных файлах переменных раскрывающих детали реализации. Все необходимое для работы с данными содержится в функциях, представляющих интерфейс модуля. Декларации функций помещаются в заголовочный файл с расширением .h. В этом случае при замене реализации функций, находящихся в файле с расширением .срр, код остальной части программы останется неизменным. В начале файла реализации следует с помощью директивы #includeподключить заголовочный файл. Это позволяет исключить возможные ошибки, поскольку компилятор получает возможность находить несоответствие в декларации и определении одних и тех же функций.

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

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

char* copy(char* s);

void dispose (char* s);

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

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

int input();

void output();

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

#include "stdafx.h"

#include "chars.h"

char* copy(int first,int last, char* s)

{char* p=new char[last-first+1];

char*begin=p;

while(first!=last)

*p++=s[first++];

*p='\0';

return begin;

}

char* copy(char* s)

{return copy(0,strlen(s),s);}

void dispose(char* s)

{delete [] s;}

int equal(char*s1,char*s2)

{return strcmp(s1,s2)==0;}

int cmp(char*s1,char*s2)

{returnstrcmp(s1,s2);}

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

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

Заголовочный Tabl.h, содержащий декларации функции для работы со строками

#include "chars.h"

#define MAX 100

typedefchar*T;

T*begin();//возвращает указатель на начало массива

T*end() ; //возвращает указатель на первое свободное место в массивеcur

int length();

T* insert(const T& item);

Добавление:Проверяет наличие свободного места в таблице, добавляет элемент в таблицу на первое свободное место, затем сдвигает указатель на первое свободное место (cur) на следующую позицию.

T*erase(T*pos);

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

voidclear();

Очистка: Предоставляет всю выделенную память для повторного использования

int remove(const T& item);

Удаление: удаляет все элементы, совпадающие с заданным. Возвращает количество удаленных элементов

intfind(constT&item);

Поиск:Возвращает указатель на первый элемент, совпадающий с заданным.

int replace(const T&Old,const T&New);

Замена:

Заменяет все вхождения элемента Oldна элементNew. Возвращает количество замен

void sort();

Сортировка

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

#include "stdafx.h"

#include "Tabl.h"

static T m[MAX];

static T* cur=m;

T*begin(){return m;}

T*end() {return cur;}

int length(){return cur-m;}

T* insert(const T& item)

{if(length()<MAX)

*cur++=copy(item);

return cur;

}

T* erase(T* pos)

{ T* i;

dispose(*pos);

for( i=pos;i<cur;i++)

*i=*(i+1);

cur--;

return pos;}

void clear()

{T* i;

for( i=m;i<cur;i++)

dispose(*i);

cur=m;

}

int remove(const T& item)

{T* i,*j=m; int n=0;

for( i=m;i<cur;i++)

if(!equal(*i,item)

*j++=*i;

else {dispose(*i); n++;}

cur=j;

return n;

}

int find( const T& item)

{T* i;

for(i=m;i<cur;i++)

if(equal(*i,item)) return i-m;

return -1;

}

int replace(const T&Old,const T&New)

{T* i;int count=0;

for(i=m;i<cur;i++)

if(equal(*i,Old))

{ dispose(*i);

*i=copy(New);

count++;}

return count;

}

void sort(){}

В файле основной программы производится тестирование функций работы со строками. Для этого организуется меню, каждый пункт которого служит для вызова соответствующей функции.

Файл Main.cpp

#include "stdafx.h"

#include "Tabl.h"

using namespace std;

const int size=256;

char buf[size];

char buf2[size];

bool input(T item)

{ return cin.getline(item,size,'\n');}

void output(T item)

{ cout<<item<<endl;}

int input()

{

int count;

for(count =0; count <MAX && input (buf); count ++)

insert(buf);

return count;

}

void output()

{T* i;

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

output(*i);

}

int _tmain(int argc, _TCHAR* argv[])

{char c,endline;

do

{ cout<<"for get case input namber and press enter"<<endl;

cout<<" 0 - exit"<<endl;

cout<<" 1 - input elements"<<endl;

cout<<" 2 - output elements"<<endl;

cout<<" 3 - find "<<endl;

cout<<" 4 - erase"<<endl;

cout<<" 5 - remove"<<endl;

cout<<" 6 - replace"<<endl;

cout<<" 7 - sort"<<endl;

cin.get(c);

cin.get(endline);

switch(c){

case '1':

{ cout<<"input elements : "<<endl;

input();cin.clear();

break;}

case '2':

{ cout<<" elements : "<<endl; output();break;}

case '3':

{ cout<<" input element for find"<<endl;

input(buf);

int i=find(buf);

if(i>=0) cout<<"position = "<<i<<endl;

else cout<<"no found"<<endl;

break;}

case '4':

{ cout<<" input position for erase"<<endl;

int pos; cin>>pos;cin.get(endline);

erase(begin()+pos);break;}

case '5':

{cout<<" input element for remove"<<endl;

input(buf);

int i=remove(buf);

if(i==0) cout<<"no found"<<endl;

break;}

case '6':

{ cout<<" input OLD element for replace"<<endl;

input(buf);

cout<<" input NEW element for replace"<<endl;

input(buf2);

int i=replace(buf,buf2);

if(i==0) cout<<"no found"<<endl;break;}

case '7':

{ sort(); break;}

}

}while(c!='0');

return 0;

}

Задание на разработку модуля функций работы со строками

Заголовки функций содержат дополнительные параметры по сравнению с базовым вариантом, приведенным выше.

first- индекс (указатель) начала диапазона элементов массива, для которого необходимо выполнить функцию.

last- индекс (указатель) конца диапазона элементов массива, для которого необходимо выполнить функцию. Элемент с индексом last в диапазон не включается.

first_item - индекс (указатель) начала диапазона, last_item индекс (указатель) конца диапазона внешнего массива, из которого извлекаются элементы, участвующие в операциях

Вариант 1

int insert(int pos,const T&);

int remove( int first,int last ,const T&);

int find ( int first, int last,const T& item);

int erase( int first, int last );

int replace ( int first,int last,const T&Old,const T&New);

void sort ( int first, int last);

Вариант 2

int insert(int first_item,int last_item );

int remove( int first,int last ,const T&);

int find ( int first, int last,const T& item);

void clear(int first,int last);

int replace ( int first,int last,const T&Old,const T&New);

void sort ( int first, int last);

Вариант 3

int insert(int pos,int first_item,int last_item );

int remove( int first,int last ,int first_item,int last_item);

int find ( int first,int last ,int first_item,int last_item);

int erase( int first, int last );

int replace ( int first,int last,const T&Old,const T&New);

void sort ( int first, int last);

Вариант 4

T* insert(T* pos, const T&);

int remove( T* first,T* last ,const T&);

T* find ( T* first, T* last,const T& item);

T* erase( T* first, T* last );

int replace ( T* first,T* last,const T&Old,const T&New);

void sort ( T* first, T* last);

Вариант 5

T* insert(T* first_item,T* last_item );

int remove( T* first,T* last ,const T&);

T* find ( T* first, T* last,const T& item);

void clear(T* first,T* last);

int replace ( T* first,T* last,const T&Old,const T&New);

void sort ( T* first, T* last);

Вариант 6

T* insert(T* pos,T* first_item,T* last_item );

int remove( T* first,T* last ,T* first_item,T* last_item);

T* find ( T* first,T* last ,T* first_item,T* last_item);

T* erase( T* first, T* last );

int replace ( T* first,T* last,const T&Old,const T&New);

void sort ( int first, int last);