Электронный учебно-методический комплекс по учебной дисциплине «Системное программирование» для специальностей 1-40 01 01 «Программное обеспечение информационных технологий», 6-05-0612-01 «Программная инженерия»
.pdf241
ВАРИАНТЫ ЗАДАНИЯ НА КОНТРОЛЬНУЮ РАБОТУ
ЗАДАНИЕ 1 ОБЗОР ЯЗЫКА ПРОГРАММИРОВАНИЯ С
Вариант №1
Дан двумерный целочисленный массив А(2, 10). Известно, что среди его элементов два и только два равны между собой. Напечатать их индексы. Для удовлетворительного решения этой задачи надо не брать для сравнения одну и ту же пару элементов (A[i][j], A[p][q]) дважды и не запутаться в случаях, когда i = p и j = q.
Вариант №2
Составить программу вывода всех трехзначных десятичных чисел, сумма цифр которых равна данному целому числу M.
Программа должна содержать двойной цикл по i и по j, а k вычисляется по заданной сумме M:
k = M – i – j;
Тогда
N = i + 10*j + 100*k;
Вариант №3
Вмассиве A(N) каждый элемент равен 0, 1 или 2. Переставить элементы массива так, чтобы сначала располагались все нули, затем все двойки и, наконец, все единицы (дополнительного массива не заводить).
Вариант №4 Напечатать все простые числа, не превосходящие заданное число M. Для ускорения вычислений полезно завести таблицу для уже найденных простых чисел и проверять делимость очередного числа на числа из этой таблицы. Четные числа, естественно, не рассматривать.
Вариант №5
Внаписанном выражении ((((1?2)?3)?4)?5)?6 вместо каждого знака «?» вставить знак одной из четырех арифметических операций +, –, ?, / так, чтобы результат вычислений равнялся 35 (при делении дробная часть в частном отбрасывается). Достаточно найти одно решение.
Вариант №6
Дан одномерный массив. Все его элементы, не равные нулю, переписать (сохраняя их порядок) в начало массива, а нулевые элементы – в конец массива (новый массив не заводить).
Вариант №7
242
Натуральное число называется совершенным, если оно равно сумме всех своих собственных делителей, включая 1. Напечатать все совершенные числа, меньшие, чем заданное M.
Вариант №8
Заданы три числа D, M, Y, которые обозначают число, месяц и год. Найти номер N этого дня с начала года (високосные года – это те, у которых номер делится на 400, и те, у которых номер делится на 4, но не делится на 100).
Вариант №9
Последовательность определяется следующим образом:
–начальный элемент – произвольное натуральное число, кратное 3;
–за любым элементом последовательности следует число, равное сумме кубов всех цифр данного элемента.
Теорема: Любая такая последовательность становится постоянной, равной 153. Докажите теорему программно.
Вариант №10
Дан одномерный массив положительных вещественных чисел. Преобразовать этот массив следующим образом: сначала обнуляется минимальный элемент, затем максимальный из оставшихся, далее минимальный из оставшихся и т.д. до тех пор, пока не останется единственный элемент. Вывести на экран значение и индекс оставшегося элемента.
Вариант №11
Задан двумерный массив вещественных чисел размерностью (M+1)x(N+1). В строку m+1 записать суммы элементов по столбцам, в столбец n+1 записать суммы элементов по строкам, а в элемент Am+1,n+1 записать сумму всех элементов массива. Результат вывести на экран.
Вариант №12
Задана матрица (двумерный массив) вещественных чисел размерностью MxN. Транспонировать матрицу, не используя вспомогательного массива. Результат вывести на экран.
ЗАДАНИЕ 2 ФУНКЦИИ В ЯЗЫКЕ С
Вариант №1
Дан двумерный целочисленный массив А(2, N). Известно, что среди его элементов два и только два равны между собой. Напечатать их индексы.
Для удовлетворительного решения этой задачи надо не брать для сравнения одну и ту же пару элементов (A[i][j], A[p][q]) дважды и не запутаться в случаях, когда i = p и j = q.
243
Решение задачи оформит в виде функции, которая получает в качестве параметров двумерный массив, размер N и указатель на массив, в который необходимо поместить найденные индексы.
Вариант №2
Составить программу вывода всех трехзначных десятичных чисел, сумма цифр которых равна данному целому числу M.
Программа должна содержать двойной цикл по i и по j, а k вычисляется по заданной сумме M:
k = M – i – j;
Тогда
N = i + 10*j + 100*k;
Решение задачи оформит в виде функции, которая получает в качестве параметра число M.
Вариант №3
Вмассиве A(N) каждый элемент равен 0, 1 или 2. Переставить элементы массива так, чтобы сначала располагались все нули, затем все двойки и, наконец, все единицы (дополнительного массива не заводить).
Решение задачи оформит в виде функции, которая получает в качестве параметров указатель на массив и количество элементов массива.
Вариант №4
Напечатать все простые числа, не превосходящие заданное число M. Для ускорения вычислений полезно завести таблицу для уже найденных простых чисел и проверять делимость очередного числа на числа из этой таблицы. Четные числа, естественно, не рассматривать. Таблица понадобится менее чем на Решение задачи оформит в виде функции, которая получает в качестве параметров число M, указатель на массив, в который будут помещаться найденные простые числа.
Вариант №5
Внаписанном выражении ((((1?2)?3)?4)?5)?6 вместо каждого знака «?» вставить знак одной из четырех арифметических операций +, –, ?, / так, чтобы результат вычислений равнялся 35 (при делении дробная часть в частном отбрасывается). Достаточно найти одно решение.
Решение задачи оформит в виде функции, которая получает в качестве параметров указатель на массив с числами выражения, количество чисел в выражении и значение выражения.
Вариант №6
Дан одномерный массив. Все его элементы, не равные нулю, переписать (сохраняя их порядок) в начало массива, а нулевые элементы – в конец массива (новый массив не заводить).
244
Решение задачи оформит в виде функции, которая получает в качестве параметров указатель на массив и количество элементов массива.
Вариант №7
Натуральное число называется совершенным, если оно равно сумме всех своих собственных делителей, включая 1. Напечатать все совершенные числа, меньшие, чем заданное M.
Решение задачи оформит в виде функции, которая получает в качестве параметра число. Функция возвращает 1 если число совершенно и 0 в противном случае.
Вариант №8
Заданы три числа D, M, Y, которые обозначают число, месяц и год. Найти номер N этого дня с начала года (високосные года учитывать).
Решение задачи оформит в виде функции, которая получает в качестве параметров значения D, M, Y. Функция возвращает количество дней.
ЗАДАНИЕ 3 АДРЕСНАЯ АРИФМЕТИКА И УПРАВЛЕНИЕ ПАМЯТЬЮ
Во всех вариантах необходимо написать три функции, которые будут вызываться из функции main().
Первая функция получает размерность массива, создает динамический массив и возвращает указатель на начало созданного массива.
Вторая – получает адрес массива и его размерность и решает одну из ниже перечисленных задач.
Третья функция получает адрес массива и его размерность и освобождает память, занятую массивом.
Размерность вводится с клавиатуры в функции main() и передается в первую функцию. Значения элементов вводятся с клавиатуры в первой функции.
В заданиях с нечетным номером использовать функции управления памятью библиотеки языка С (#include ). В заданиях с четным номером использовать функции управления памятью Win32 API (#include ).
Варианты заданий Вариант №1
Массив размерностью MxN. Необходимо найти наибольший и наименьший элементы.
Вариант №2
Массив размерностью MxN. Необходимо каждый элемент строки разделить на сумму элементов строки.
Вариант №3
Массив размерностью MxN. Необходимо каждый элемент строки разделить на наибольший элемент строки.
Вариант №4
245
Массив размерностью M. Необходимо рассчитать среднее арифметическое по формуле и выборочную дисперсию по формуле, где n = M.
Вариант №5
Массив размерностью MxN. Необходимо дополнить его (M+1)-й строкой и (N+1)-м столбцом, в которых записать суммы элементов соответствующих строк
истолбцов. В элементе aM+1,N+1 должна храниться сумма всех элементов массива.
Вариант №6
Массив размерностью MxN. Необходимо в каждой строке найти элемент с наименьшим значением, а затем среди этих чисел найти наибольшее. На экран вывести индексы этого элемента.
Вариант №7
Массив размерностью MxM. Необходимо, не используя дополнительного массива, транспонировать данную матрицу.
Вариант №8
Массив размерностью MxN. Необходимо найти номер строки и номер столбца, в которых находится наименьший элемент.
Вариант №9
Массив размерностью MxM. Необходимо, не используя дополнительного массива, получить обратную матрицу.
Вариант №10
Массив из M строк по N символов каждая. Необходимо вывести только те строки, которые являются палиндромами, т.е. читаются одинаково слева направо
исправа налево. При проверке строки необходимо определять ее длину с помощью функции strlen() (#include )
ЗАДАНИЕ 4 ОБРАБОТКА СТРУКТУРИРОВАННЫХ ДАННЫХ
Для всех вариантов необходимо выполнить следующее:
определить типы и функции в соответствии с вариантом задания;
в функции main() реализовать демонстрацию работы созданных функций;
Вариант №1
Определите структуру Date для хранения даты:
struct Date
{
unsigned y; //год unsigned m; //месяц unsigned d; //день
246
};
Определите следующие функции:
void GetDate(Date* d); // ввод даты с клавиатуры в формате «дд.мм.гггг»; void PutDate(Date d); // вывод даты в формате «дд.мм.гггг»;
void AddDate(Date* d1, Date d2); // сложение двух дат (результат помещается в d1);
int DiffDate(Date d1, Date d2); // вычисляет разницу в днях между двумя датами. Високосными годами можно пренебречь. Для определения количества дней в месяце можно определить следующий массив:
int M[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
Вариант №2
Определите структуру Time для хранения времени:
struct Time
{
unsigned h; //часы unsigned m; //минуты unsigned s; //секунды
};
Определите следующие функции:
void GetTime(Time* t); // ввод времени с клавиатуры в формате «чч:мм:сс»; void PutTime(Time t); // вывод времени в формате «чч:мм:сс»;
void AddTime(Time* t1, Time t2); // сложение двух времен (результат помещается в t1);
int DiffTime(Time t1, Time t2); // вычисляет разницу в секундах между двумя временами.
Вариант №3
Имеется узел бинарного дерева:
struct Node |
|
{ |
|
char name[20]; |
//имя узла |
Node * left; |
//левая ветвь |
Node * right; |
//правая ветвь |
}; |
|
|
247 |
Определите следующие функции:
Node* AddNode(Node* node, char* name); // добавление нового узла в дерево
(если у узла отсутствует левая ветвь, то узел добавляется слева, иначе, если отсутствует правая ветвь, то узел добавляется справа, иначе узел не добавляется). Функция должна возвращать указатель на добавленный узел или 0;
void DelLeftNode(Node* node); void DelRightNode(Node* node); // удаление левых и правых поддеревьев;
void PrintTree(Node* node); // рекурсивная функция вывода бинарного дерева на экран.
Вариант №4
Имеется элемент односвязного списка:
struct List |
|
{ |
|
char * data; |
//указатель на данные |
List * next; //указатель на следующий элемент |
|
} |
|
* head; |
//указатель на начало списка |
Определите следующие функции:
void Add(List** list, int i); // добавление нового элемента в список после i-го элемента;
void PrintList(List* list); // вывод содержимого списка на экран; void Delete(List** list, int i); // удалить i-й элемент из списка.
Вариант №5
Имеется элемент стека (дисциплина обслуживания LIFO):
struct Stack |
|
|
{ |
|
|
char * data; |
//указатель на данные |
|
Stack * prev; |
//указатель на предыдущий элемент |
|
} |
|
|
* top; |
//указатель на вершину стека |
|
Определите следующие функции:
void Push(Stack** stack, char* data); // поместить данные в стек;
248
char* Pop(Stack** stack); // извлечь данные из стека (при этом элемент удаляется из стека);
PrintStack(Stack* stack); // вывод на экран содержимого стека.
Вариант №6
Бинарное дерево называется сбалансированным тогда и только тогда, когда высоты двух его поддеревьев отличаются не более чем на единицу. Используя описание узла дерева из задания 3 определите рекурсивную функцию
int TreeHeight(Node* node);
которая вычисляет высоту дерева. Высота дерева, состоящего из единственного узла равна 0. Если узел имеет ветви, то высота такого дерева вычисляется рекуррентно следующим образом:
высота = 1 + max(высота_левого_поддерева, высота_правого_поддерева)
Определите функцию
int IsBalancedTree(Node* node);
которая возвращает 1 если дерево сбалансировано и 0 в противном случае.
Вариант №7
Имеется элемент очереди (дисциплина обслуживания FIFO):
struct Queue |
|
|
{ |
|
|
char * data; |
//указатель на данные |
|
Queue * next; |
//указатель на следующий элемент очереди |
|
} * begin; |
//указатель на начало очереди |
|
Определите следующие функции:
void Put(Queue** queue, char* data); // поместить данные в конец очереди;
char* Get(Queue** queue); // извлечь данные из начала очереди (при этом элемент удаляется из очереди);
void PrintQueue(Queue* queue); // вывод на экран содержимого очереди.
Вариант №8
Определите структуру Complex для хранения комплексных чисел:
struct Complex
{
double re; //вещественная часть double im; //мнимая часть
};
249
Определите следующие функции:
Complex Add(Complex c1, Complex c2); Complex Sub(Complex c1, Complex c2); Complex Mul(Complex c1, Complex c2);
Complex Div(Complex c1, Complex c2); // сложение, вычитание, умножение и деление комплексных чисел. Все функции должны возвращать новое комплексное число, содержащее результат операции;
void PrintComplex(Complex c); // вывод значения комплексного числа на экран в алгебраической или показательной формах.
Вариант №9
Определите структуру TreeNode – узел дерева:
struct TreeNode |
|
{ |
|
char name[20]; |
//имя узла |
TreeNode * nodes; //список дочерних узлов
TreeNode * next; //следующий узел на том же уровне
}
* root; //корневой узел (первый узел на нулевом уровне)
Определите следующие функции:
TreeNode* AddNode(TreeNode* node, char* name); // добавление нового дочернего узла. Функция должна возвращать указатель на новый узел;
TreeNode* FindNode(TreeNode* node, char* name); // поиск узла по его имени; void DelTree(TreeNode* node); // удаление всех дочерних узлов дерева;
void PrintTree(TreeNode* node); // вывод дерева (имен узлов) на экран.
Вариант №10
Определите структуру Pair – пара «имя = значение» и структуру Pairs – массив пар:
struct Pair
{
char * name; //имя int value; //значение
};
250
