5.1.1. Напишите функцию-член для класса mod_int:
void add(int i) ; //добавление i к v по модулю 60
5.1.2. Используйте тип ch_stack, из темы «Создание динамического стека», и включите в него конструктор по умолчанию для размещения ch_stack из 100 элементов. Напишите программу, которая обменивает содержимым два стека ch_stack; используйте массив стеков ch_stack для выполнения этой работы. Обмениваемые стеки будут двумя первыми стеками ch_stack в массиве. Один из способов может состоять в использовании четырёх ch_stack — st[0], st[1], st[2] и st[3]. Поместите содержимое st[1] в st[2], st[0] в st[3], st[3] в st[1], a st[2] в st[0]. Реализовав функции печати, которые выводили бы все элементы ch_stack, убедитесь, что после обмена содержимым порядок элементов в стеках не изменился. Можно ли решить задачу с помощью только трёх ch_stack?
5.1.3. Добавьте к типу ch_stack конструктор со следующим прототипом:
ch_stack::ch_stack(const char* с);
//инициализация символьным массивом
5.2.1. Используйте тип my_string, из темы «Пример: динамически размещаемые строки», и напишите следующие функции- члены:
//strcmp: отрицательна, если s<s1, равна 0,если s==s1,
// положительна, если s>s1, здесь s — неявный аргумент int my_string::strcmp(const my_string& s1)
//strrev обращает my_string void my_string::strrev();
//перегруженная print для печати первых n символов void my_string::print(int n);
5.2.2. Используя тип vect из темы «Класс vect», напишите следующие функции:
//складывает значения всех элементов и возвращает их сумму int vect::sumelem();
//печатает все элементы void vect::print();
//складывает два вектора в третий v(неявный_аргумент)=vl+v2 void vect::add(const vect& vl,const vect& v2);
//складывает два вектора и возвращает v(неявный_аргумент)+vl vect vect::add(const vect& vl);
5.2.3. Определите класс multi_v как:
class multi_v
{ public:
multi_v(int i):a(i),b(i),c(i),size(i) {} void assign(int ind,int i,int j,int k);
void retrieve(int ind,int& i,int& j,int& k) const; void print(int ind) const;
int ub const { return(size-1); } private:
vect a,b,c; int size;
};
Напишите и проверьте код для функций-членов assign(), retrieve() и print(). Функция assign() должна присваивать i, j и k элементам а[ind], b[ind] и с[ind], соответственно. Функция retrieve() выполняет обратное по отношению к функции assign(). Функция print() должна печатать три значения а[ind], b[ind] и с[ind].
5.2.4. Используйте тип slist, приведённый в теме «Пример: односвязный список», для написания следующих функций-членов:
//конструктор slist с инициализатором — массивом символов slist::slist(const char* с);
//length возвращает длину slist int slist::length();
//возвращает число элементов со значением с int slist::count_c(char с);
Напишите функцию-член append(), которая будет добавлять список в конец неявно заданного аргумента-списка, а затем очищать добавленный slist, обнуляя голову:
void slist::append(slist& e);
Напишите функцию-член copy(), которая будет копировать список:
//неявный аргумент принимает копию е void slist::copy(const slist& e);
He забудьте уничтожить неявный список перед тем, как делать копию. Вам нужна специальная проверка, чтобы избежать копирования списка в самого себя.
5.2.5. Создайте тип для безопасного трёхмерного массива под названием v_3_d.
//Реализация безопасного трехмерного массива class v_3_d
{ public:
int ub1(),ub2(),ub3(); v_3_d(int l1,int l2,int l3);
~v_3_d();
int& element(int i,int j,int k) const; void print() const;
private; int*** p;
int si,s2,s3;
};
Инициализуйте и выведите трёхмерный массив.
5.2.6. Определить класс C++, который будет похож на множество (set) в Pascal. Приведённое ниже представление является 32-разрядным машинным словом:
//Реализация АТД для типа set const unsigned long int masks[32]=
{
0x80000000, 0x40000000, 0x20000000, 0x10000000,
0x8000000, 0x4000000, 0x2000000, 0x1000000,
0x800000, 0x400000, 0x200000, 0x100000,
0x80000, 0x40000, 0x20000, 0x10000,
0x8000, 0x4000, 0x2000, 0x1000,
0x800, 0x400, 0x200, 0x100,
0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1
};
class set
{ public:
set(unsigned long int i) { t=i; } set() { t=0x0; }
void u_add(int i) { t|=masks[i]; } void u_sub(int i) { t&=~masks[i]; } bool in(int i) const
{ return bool((t&masks[i))!=0); } void pr_mems() const;
set set_union(const set& v) const
{ return (set(t|v.t)); } private:
unsigned long int t;
};
Напишите код pr_mems для вывода всех элементов множества. Напишите код для функции-члена
intersection, возвращающей пересечение множеств.
5.2.7. Дополните пакет обработки полиномов, написав код для процедур
void polynomial::release() и void polynomialprint(), которого нет в тексте (см. раздел 6.9, «Многочлен как связный список», на стр. 174).
Напишите код для процедуры сложения многочленов
void polynomialplus().
5.2.8. Усовершенствуйте форму класса my_string с подсчётом ссылок, вставив в соответствующие функции-члены проверку утверждения, что ref_cnt неотрицателен. Зачем это может понадобиться (см. тему «Строки, использующие семантику ссылок»?
5.2.9. Измените класс matrix, чтобы получить конструктор, выполняющий транспонирование (см. тему
«Двумерные массивы». Он должен содержать перечислимый тип в качестве второго аргумента, который показывает, какая трансформация должна выполняться с массивом.
enum transform {transpose,negative,upper}; matrix::matrix(const matrix& a,transform t)
{
//транспонирование base[i][j]=a.base[j][i]
//смена знака base[ij[j]=-a.base[i][j]
//верхнетреугольная матрица base[i][j]=a.base[i][j]
// i<=j, иначе 0
}
Прикрепленные файлы: |
|
|---|---|
|
Администрация сайта не рекомендует использовать бесплатные работы для сдачи преподавателю. Эти работы могут не пройти проверку на уникальность. Узнайте стоимость уникальной работы, заполните форму ниже: Узнать стоимость |
|
Скачать файлы: |
|
|
|
