Структуры и функции. Указатели на структуры. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Структуры и функции. Указатели на структуры.



 

6.9. Верны ли следующие утверждения:

a) к структурам одного типа применима операция присваивания;

b) к структурам одного типа, не содержащим вложенных структур, применима операция сравнения (выполняется почленное сравнение);

c) параметром функции может быть указатель на структуру, но не сама структура;

d) параметры функции – структуры передаются по значению;

e) результатом работы функции может быть структура;

f) результатом работы функции может быть указатель на структуру;

g) функция sizeof(struct any) выдает результат, равный сумме длин всех полей этой структуры;

h) к структурам применима операция взятия адреса;

 

6.10. Перечислить все операции, применимые к структурам.

 

6.11. Пусть точка на плоскости описана следующим образом:

struct point { int x; int y;}

Верно ли решена задача: «описать функцию, которая присваивает значение структуре типа struct point»

a) void assign_to_point (struct point p, int a, int b)

{ p.x = a; p.y = b; }

b) void assign_to_point (struct point *p, int a, int b)

{ (*p).x = a; (*p).y = b; }

c) void assign_to_point (struct point *p, int a, int b)

{ *p.x = a; *p.y = b; }

d) void assign_to_point (struct point *p, int a, int b)

{ p -> x = a; p -> y = b; }

 

6.12. Пусть точка на плоскости описана следующим образом:

struct point { int x; int y;}

Верно ли решена задача: «описать функцию, которая создает точку из двух целых чисел»

a) struct point create_point (int a, int b)

{ struct point p;

p.x = a; p.y = b; return p;

}

b) struct point *create_point (int a, int b)

{ struct point p;

p.x = a; p.y = b; return &p;

}

c) struct point *create_point (int a, int b)

{ struct point *pp;

pp -> x = a; pp -> y = b; return pp;

}

d) struct point *create_point (int a, int b)

{ struct point *pp;

pp = (struct point *) malloc(sizeof(struct point));

pp -> x = a; pp -> y = b; return pp;

}

 

6.13. Пусть точка на плоскости описана следующим образом:

struct point { int x; int y;}

Описать функцию, которая по трем точкам, являющимися вершинами некоторого прямоугольника, определяет его четвертую вершину;

 

6.14. Описать в виде структуры

a) точку на плоскости;

b) цветную точку на плоскости;

c) комплексное число;

d) рациональное число.

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

 

6.15. Пусть «целочисленная» окружность на плоскости описана следующим образом:

struct point { int x; int y;};

struct circle { int radius; struct point center;};

Пусть есть массив struct circle plane [50], содержащий информацию об окружностях на плоскости. Описать функцию, определяющую

a) есть ли среди этих окружностей хотя бы две концентрические окружности;

b) есть ли среди этих окружностей хотя бы две вложенные (не обязательно концентрические) окружности;

c) есть ли среди этих окружностей три попарно пересекающихся окружности;

d) есть ли среди этих окружностей хотя бы одна «уединенная», т.е. не имеющая общих точек ни с какой другой окружностью массива plane.

 

6.16. Пусть результаты анализа некоторого текста, состоящего из английских слов, содержатся в следующем частотном словаре dictionary:

#define MAXSIZE 1000

#define LENGHT 20 /* максимальная длина слова */

struct elem { char * word; struct info *data;};

struct info { int count; /* количество повторений слова в данном тексте */

char *alias; /* синоним данного слова */

};

struct { struct elem *tabl [ MAXSIZE];

int number; /* количество слов в словаре */

}

dictionary;

Каждое слово (word) встречается в словаре только один раз; синонимы (alias) могут быть одинаковыми у разных слов.

Описать функцию, определяющую

a) встречается ли данное слово в этом словаре: результат – указатель на соответствующий элемент либо NULL:

1) слова неупорядочены по алфавиту;

2) слова упорядочены по алфавиту;

b) какое слово чаще других встречается в анализируемом тексте; если таких слов несколько, то взять первое по алфавиту; результат работы функции – указатель на соответствующий элемент:

1) слова неупорядочены по алфавиту;

2) слова упорядочены по алфавиту;

c) на каждую ли букву латинского алфавита в этом словаре найдется хотя бы одно слово:

1) слова неупорядочены по алфавиту;

2) слова упорядочены по алфавиту;

d) на какие буквы (букву) латинского алфавита в этом словаре больше всего слов; результат работы функции – указатель на строку, составленную из этих букв, перечисленных в алфавитном порядке:

1) слова неупорядочены по алфавиту;

2) слова упорядочены по алфавиту;

e) есть ли в словаре различные слова, имеющие одинаковые синонимы.

 

6.17. Пусть результаты анализа некоторого текста содержатся в частотном словаре (см. предыдущую задачу).

Описать функцию

a) struсt elem *add_word (char * word, char *alias), вставляющую новое слово и информацию о нем в словарь dictionary (предполагается, что такого слова в словаре еще нет, оно первый раз встретилось в тексте);

1) слова неупорядочены по алфавиту;

2) слова упорядочены по алфавиту;

Результат работы функции – указатель на вставленный элемент.

b) struсt elem *update_word (char * word, char *alias), изменяющую значение синонима для данного слова (предполагается, что такое слово в словаре обязательно есть);

1) слова неупорядочены по алфавиту;

2) слова упорядочены по алфавиту;

Результат работы функции – указатель на элемент словаря, где изменено значение синонима.

c) struct elem *delete_word (char *word), удаляющую данное слово из словаря; результат работы функции – указатель на структуру, содержащую информацию об удаленном слове либо NULL, если такого слова нет в словаре;

1) слова неупорядочены по алфавиту;

2) слова упорядочены по алфавиту;

 

6.18. Программа. Определить число вхождений каждого служебного слова в данную программу на Си. Тщательно продумать способ представления информации о служебных словах.

 

6.19. Допустимо ли в Си? Если "да" - опишите семантику этих действий, объясните, что будет напечатано; если "нет" - объясните почему.

#include <stdio.h>

struct data { char *s; int i; struct data *dp; };

main()

{ static struct data a[ ] = { { "abcd", 1, a+1 },

{ "efgh", 2, a+2 },

{ "ijkl",3, a }

};

struct data *p = a; int i;

printf("a[0].s=%s p -> s=%s a[2].dp -> s=%s\n",

a[0].s, p -> s, a[2].dp -> s);

for (i = 0; i < 2; i++) printf("--a[i].i=%d ++a[i].s[3]=%c\n",

--a[i].i, ++a[i].s[3]);

printf("++(p->s)=%s\n", ++(p->s));

printf("a[(++p) -> i].s=%s\n", a[(++p) -> i].s);

printf("a[--(p -> dp -> i)].s=%s\n", a[--(p -> dp -> i)].s);

}

6.20. Пусть

struct s { int k; float *f; char *p[2];};

struct s *ps;

Верно ли присвоено значение переменной ps и всем объектам, с ней связанным:

char str[5] = “abcd”;

ps = (struct s *) malloc(sizeof(struct s));

(*ps).k = 5;

ps -> f = (float *) malloc(sizeof(float)); *(ps -> f) = 3.1415;

(*ps).p[0] = (char*) malloc(5*sizeof(char));

(*ps).p[1] = (char*) malloc(10*sizeof(char));

(*ps).p[0] = str;

(*ps).p[1] = “abcdefghi”;

 

6.21. Присвоить значение переменной q и всем объектам, с ней связанным: struct data { double **p; char *s; int *a[2]; };

struct data *q;

6.22. Присвоить значение переменной a и всем объектам, с ней связанным: struct b { double *q; int * (*p)[2]; };

struct b **a[1];

6.23. Присвоить значение переменной x и всем объектам, с ней связанным: struct r { double *a[3]; char **s;

union { int i; float f; } u;

}

struct r x[2];

6.24. Присвоить значение переменной x и всем объектам, с ней связанным: struct a { char ***s;

char (*p)[2];

};

typedef struct a * data;

data x[2];

6.25. Присвоить значение переменной pt и всем объектам, с ней связанным: struct t { int **pi;

double (*k)(double,int*);

char *p[2];

};

struct t *pt;

6.26. Присвоить значение переменной a и всем объектам, с ней связанным: struct data { int *i; int (*f)(int); char **s; };

struct data a[2];

 



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 407; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.221.53.5 (0.012 с.)