
- •1.Фундаментальные типы данных. Структуры
- •Демонстрационный пример
- •1.2. Задачи для самостоятельного решения
- •Фундаментальные типы данных. Объединения
- •2.1. Демонстрационный пример
- •А.Пуанкаре Приведем пример использования объединения: составить программу, выполняющую требуемые операции для заданной фигуры.
- •2.2. Задачи для самостоятельного решения
- •3.Ссылочные типы
- •3.1. Указатели и адреса
- •3.2. Адресная арифметика
- •3.3. Операции new и delete
- •3.4. Демонстрационные примеры Чтение и переработка являются ключевыми в программировании. Б.Керниган, ф.Плоджер
- •3.5. Задачи для самостоятельного решения
- •3.4. Дано описание переменных: int *p,*q; char *r;. Какие из следующих операторов неправильны и почему?
- •4. Линейные однонаправленные списки
- •4.1. Задачи для самостоятельного решения
- •Г.Остер. Задачник
- •Построение
- •Модификация
- •Предикаты
- •Подсчет
- •5. Ортогональные списочные структуры ("гирлянды" и "висюльки")
- •5.1. Фрагмент теории
- •5.2. Задачи для самостоятельного решения
- •6. Кольцевые списки на базе однонаправленных списков
- •6.1. Фрагмент теории
- •6.2.Задачи для самостоятельного решения
3.5. Задачи для самостоятельного решения
Если маленькие хитрости не позволяют достичь желаемого, прибегните к большим хитростям.
Маленькая хитрость
При работе со ссылочными типами требуется знать:
определение указателя; понятие статической и динамической переменной;
операции над указателями;
семантику операций new и delete.
3.1. Дано описание: int *p,*q; . Пусть переменные p и q имеют следующие значения:
Ответьте на следующие вопросы.
Что является значением переменной p: ссылка на объект (переменную) целого типа или сам этот объект? Что обозначает переменная *p: ссылку на объект целого типа, сам этот объект или целое 5? Каковы типы переменных p и *p?
Что будет выдано на печать в результате выполнения следующих операторов:
*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;
}
Ответьте на следующие вопросы.
Какие из переменных существуют в каждой из точек a,b,c,d и каковы их значения в эти моменты?
Почему объекты (переменные), создаваемые операцией new и уничтожаемые операцией delete, называют динамическими? Почему им не дают имена?
Можно ли переменной 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 (последнюю строку, если надо, дополнить пробелами).