Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Электронный учебно-методический комплекс по учебной дисциплине «Системное программирование» для специальностей 1-40 01 01 «Программное обеспечение информационных технологий», 6-05-0612-01 «Программная инженерия»

.pdf
Скачиваний:
0
Добавлен:
28.12.2025
Размер:
3.06 Mб
Скачать

241

ВАРИАНТЫ ЗАДАНИЯ НА КОНТРОЛЬНУЮ РАБОТУ

ЗАДАНИЕ 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]