Если маленькие хитрости не позволяют достичь желаемого, прибегните к большим хитростям.
Маленькая хитрость
При работе со ссылочными типами требуется знать:
определение указателя; понятие статической и динамической переменной;
операции над указателями;
семантику операций new и delete.
3.1. Дано описание: int *p,*q; . Пусть переменные p и q имеют следующие значения:
Ответьте на следующие вопросы.
A. Что является значением переменной p: ссылка на объект (переменную) целого типа или сам этот объект? Что обозначает переменная *p: ссылку на объект целого типа, сам этот объект или целое 5? Каковы типы переменных p и *p?
B. Что будет выдано на печать в результате выполнения следующих операторов:
*p = *q;
if (p==q) p = NULL;
else
if (*p==*q)
q = p;
if (p==q) *q = 4;
cout<<*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;
}
Ответьте на следующие вопросы.
A. Какие из переменных существуют в каждой из точек a,b,c,d и каковы их значения в эти моменты?
B. Почему объекты (переменные), создаваемые операцией new и уничтожаемые операцией delete, называют динамическими? Почему им не дают имена?
C. Можно ли переменной 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;
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 (последнюю строку, если надо, дополнить пробелами).