Т.В. Руденко - Сборник задач и упражнений по языку Си, страница 7
Описание файла
PDF-файл из архива "Т.В. Руденко - Сборник задач и упражнений по языку Си", который расположен в категории "". Всё это находится в предмете "операционные системы" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 7 страницы из PDF
Пусть точка на плоскости описана следующим образом:struct point { int x; int y;}Описать функцию, которая по трем точкам, являющимися вершинаминекоторого прямоугольника, определяет его четвертую вершину;6.14. Описать в виде структурыa) точку на плоскости;b) цветную точку на плоскости;c) комплексное число;d) рациональное число.Разработать совокупность операций для данных этого типа; реализоватькаждую из них в виде функции.6.15. Пусть «целочисленная» окружность на плоскости описана следующим образом:struct point { int x; int y;};31struct 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) есть ли в словаре различные слова, имеющие одинаковые синонимы.326.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 и всем объектам, с нейсвязанным:33char 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];6.3Структуры со сылками на себяЗамечание: в задачах 6.27 – 6.40 речь идет об однонаправленных списках без заглавного звена (если не сказано особо в постановке задачи);struct lnode { type data;/∗ поле данных ∗/struct lnode ∗next; /∗указатель на следующее звено списка ∗/}Здесь struct lnode определяет структуру звена списка.
Термин “элемент” будем использовать и для звена, и для поля данных в звене, если это неприводит к неоднозначности. Тип данных type уточняется в каждой задаче.346.27. Описать функцию, котораяa) находит сумму всех элементов списка;b) находит максимальный элемент в заданном непустом списке;c) проверяет, упорядочены ли по возрастанию элементы списка.d) находит сумму минимального и максимального элементов всписке ;Тип данных – int .6.28. Описать функцию, котораяa) меняет местами первый и последний элементы списка;b) удаляет из списка первое вхождение элемента с заданным значением (если оно есть);1) список с заглавным звеном;2) список без заглавного звена;c) удаляет из списка все вхождения элемента с заданным значением(если они есть);1) список с заглавным звеном;2) список без заглавного звена;d) после каждого звена с заданным значением вставляет еще однозвено с таким же значением.Тип данных - double∗, анализируются вещественные числа.6.29.
Описать функцию, которая определяет, есть ли в заданном спискехотя бы два одинаковых элемента. Тип данных – int.6.30. Описать функцию, которая печатает в обратном порядке значенияэлементов списка. Тип данных - double.6.31. Описать функцию, которая заменяет в списке все вхождения данного слова на удвоенное.
Тип данных - char∗.6.32. Описать функцию, которая строит список L2 - копию списка L1.struct lnode { struct data ∗p;struct lnode ∗next; };struct data { double f; char ∗s[2];};ки.6.33. Описать функцию, которая переворачивает список, изменяя ссылstruct lnode { struct data ∗p;struct lnode ∗next; };struct data { double f; char ∗s[2];};6.34. Описать функцию, которая проверяет, входит ли список L1 в список L2. Тип данных - char∗, анализируются строки, указатели на которые хранятся в звеньях списка.6.35. Описать функцию, которая выполняет слияние двух упорядоченных по возрастанию списков L1 и L2, строя третий список L3:35a) список L3 состоит из звеньев списков L1и L2;b) список L3 строится из копий звеньев списков L1 и L2; списки L1 иL2 не изменяются.Тип данных - int∗.6.36.
Описать функцию, которая после последнего вхождения элементаE (структуры типа data) в список L1 вставляет список L2, изменяя ссылки.struct lnode { struct data ∗ dtpr; struct lnode ∗next; };struct data { int i; char ∗s; };6.37. Описать функцию, которая в упорядоченный по возрастанию список вставляет элемент, сохраняя упорядоченность. Тип данных - char∗.6.38.
Описать функцию, которая формирует список L3, включая в негоэлементы списка L1, которые не входят в список L2.a) список L3 состоит из звеньев списка L1;b) список L3 строится из копий звеньев списка L1; список L1 не изменяется.Тип данных - int∗.6.39. Описать функцию, которая формирует список L3, включая в негов одном экземпляре элементы, входящие в список L1 и в список L2. Список L3формируется из копий звеньев списков L1 и L2; списки L1 и L2 не изменяются.Тип данных - char∗.6.40.
Описать функцию, которая формирует список L3, включая в негоэлементы, которые входят в один из списков (L1 или L2), но при этом не входятв другой. Список L3 формируется из копий звеньев списков L1 и L2; списки L1и L2 не изменяются.Тип данных - char∗.Замечание: в задачах 6.41 – 6.44 требуется разработать и реализоватьнесколько абстрактных типов данных (АТД). Абстрактный тип данных – этотип, определяемый программистом, для которого он описывает структуру значений этого типа и множество операций с такими данными. Детали реализацииАТД по возможности максимально скрыты от пользователя, и оперировать с такими данными можно только с помощью предоставленных операций (аналогично тому, как пользователь работает с предопределенными в языке типами данных).