Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задачи по ООП для 234 группы (окончание).doc
Скачиваний:
0
Добавлен:
24.01.2020
Размер:
300.54 Кб
Скачать

3.5. Задачи для самостоятельного решения

Если маленькие хитрости не позволяют достичь желаемого, прибегните к большим хитростям.

Маленькая хитрость

При работе со ссылочными типами требуется знать:

  • определение указателя; понятие статической и динамической переменной;

  • операции над указателями;

  • семантику операций new и delete.

3.1. Дано описание: int *p,*q; . Пусть переменные p и q имеют следующие значения:

Ответьте на следующие вопросы.

  1. Что является значением переменной p: ссылка на объект (переменную) целого типа или сам этот объект? Что обозначает переменная *p: ссылку на объект целого типа, сам этот объект или целое 5? Каковы типы переменных p и *p?

  2. Что будет выдано на печать в результате выполнения следую­щих операторов:

*p = *q;

if (p==q) p = NULL;

else

if (*p==*q)

q = p;

if (p==q) *q = 4;

c out<<*p; ?

3.2. Дано описание:

struct D

{

int a;

int *b;

int *c;

} *r;

Чему будет равно значение переменной r после выполнения операторов:

if ((*r).b!=NULL) (*r).c = (*r).b;

*(*r).b = *(*r).c-4; (*r).a = (*r).b==(*r).c; ?

3.3. Дано описание переменных: int *p,*q; char *r;. Какие из следующих операторов неправильны и почему?

а) p = q; б) q = r; в) p = NULL; г) r =NULL; д) q = *p; е) *p = NULL; .

3.4. Дано описание переменных: int *p,*q; char *r;. Какие из следующих операторов неправильны и почему?

а) *r = *p;

б) *q = (int)*r;

в) if (r!=NULL)

*r = *NULL;

г) if (q>NULL)

*q = *p;

д) if (q==p)

cout<<q;

e) if (q!=r)

cin>>r;

3.5. Имеется программа:

#include<iostream.h>

void main ()

{

int *x,y;

/* a */ x = new int;

/* b */ *x = 1; y = - *x;

/* c */ delete x;

/* d */ cout<<y;

}

Ответьте на следующие вопросы.

  1. Какие из переменных существуют в каждой из точек a,b,c,d и каковы их значения в эти моменты?

  2. Почему объекты (переменные), создаваемые операцией new и уничтожаемые операцией delete, называют динамическими? Почему им не дают имена?

  3. Можно ли переменной x присвоить ссылку на переменную y? Можно ли с помощью операции delete уничтожить переменные x и y?

3.6. Дано описание:

typedef struct b

{

char f1;

char *f2;

}B;

B *p;

char *q;

Нарисовать структуру значений переменных p и q после выполне­ния следующих операторов:

q = new char;

(*q) = '7';

p = new B;

(*p).f1 = (char) (((int)(*q))+1); (*p).f2 = q;

3.7. Дано описание:

struct elem

{

int data;

struct elem *link;

} *p,*q;

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

a) p = new elem; (*p).data = 4; (*p).link = NULL;

б) p = new elem; (*p).data = 7; (*p).link = p;

в) q = new elem; (*q).data = 2; (*q).link = NULL; p = new elem;

(*p).data = 1; (*p).link = q;

г) p = new elem; (*p).data = 5; (*p).link = new elem;

(*(*p).link).data = (*p).data; (*(*p).link).link = (*p).link;

3.8. Почему недопустимы следующие описания и как их исправить?

а) typedef struct str

{

int a;

pointer p;

} STR;

typedef STR *pointer;

б) typedef STR *pointer;

typedef struct str

{

int a;

pointer p;

} STR;

3.9. Описать переменную p (и, если надо, вспомогательные переменные) и выписать операторы, присваивающие ей указанные значения:

a)

б)

3.10. Описать переменную p (и, если надо, вспомогательные пере­менные) и выписать операторы, присваивающие ей указанные значения:

а)

б)

3.11. Дано описание типа:

struct zveno

{

int elem;

struct zveno *sled;

}*p;

Выписать операторы, которые преобразуют значение переменной p:

к значению, показанному на следующих рисунках (звенья, ставшие ненужными, уничтожить):

а)

б)

*

в

p

)

3.12. Допустимы ли в языке C++ конструкции (*p)[2], *q+2 и **r? Ответ обосновать.

3.13. Дано описание типа:

typedef int *Ssylka;

typedef Ssylka Vector[100];

Считая, что все элементы вектора x отличны от NULL, составить функцию max(x) для нахождения наибольшего из чисел, на которые ссылаются элементы вектора x.

3.14. Дано описание типа:

typedef int *Ssylka;

typedef Ssylka Vector[100];

Считая, что все элементы вектора x отличны от NULL, составить функцию negl(x), значением которой является первый из элементов вектора x, ссылающихся на отрицательные числа или NULL, если та­ких элементов нет.

3.15. Дано описание типа:

typedef int *Ssylka;

typedef Ssylka Vector[100];

Считая, что все элементы вектора x отличны от NULL, составить функцию same(x), которая проверяет, есть ли в векторе x хотя бы две одинаковые ссылки.

16. Дано описание типа:

typedef int *Ssylka;

typedef Ssylka Vector[100];

Считая, что все элементы вектора x отличны от NULL, составить функцию unique(x), которая в векторе x все элементы, ссылающиеся на равные числа, заменяет на значение первого элемента.

3.17*. Одно из возможных представлений "длинного" текста - это разделение его на участки (строки) равной длины и создание масси­ва ссылок на эти строки:

#define d 80 //Длина строки.

#define n 90 //Максимальное число строк.

typedef char stroka[d];

typedef stroka *ssylka;

typedef ssylka text[n];

Если в тексте менее n строк, то последние элементы массива равны NULL; в начале массива ссылок NULL не должно быть. Если в операции над текстом указан номер отсутствующей строки, то есть эле­мент массива с этим номером равен NULL, то такая операция не вы­полняется.

Используя данное представление текста, описать:

а) функцию числострок(T) для подсчета числа строк в тексте T;

б) функцию элем(T,i,j,c), возвращающую 1, если в тексте T есть строка с номером i, и 0 в противном случае. Если такая строка есть, необходимо присвоить j-ю литеру этой строки параметру c;

в) функцию перестановка(T,i,j), меняющую местами i-ю и j-ю строки текста T;

г) функцию замена(T,i,j), заменяющую i-ю строку текста T на копию j-й строки;

д**) функцию добавить(T,i,j), добавляющую после i-й строки текста T копию j-й строки;

е) функцию удалить(T,i), удаляющую i-ю строку из текста T;

ж) функцию поиск(T,c,i,j), определяющую, входит ли литера c в текст T, и возвращающую 1, если - "да", и 0, если - "нет". Если такая литера есть, то присвоить параметрам i и j "координаты" первого вхождения этой литеры: i - номер строки, а j - номер по­зиции в этой строке;

з) функцию вывод(T), печатающую построчно текст T;

и**) функцию ввод(T), считывающую из входного файла последова­тельность литер до первой точки и формирующую из них текст T (последнюю строку, если надо, дополнить пробелами).