Skip to content

SweetBloody/bmstu_c

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Лабораторные работы по курсу "Программирование на C"

Здесь собраны все лабораторные, которые я выполнял в ходе курса программирования на C. Используйте на здоровье, но с умом.

Список лабораторных работ

Номер лабы Статус
Лаба 1 "Основные конструкции языка"
Лаба 2 "Обработка одномерных статических массивов"
Лаба 3 "Обработка многомерных статических массивов"
Лаба 4 "Обработка строк"
Лаба 5 "Обработка структур и файлов"
Лаба 6 "Обработка массива структур со статическими полями"
Лаба 7 "Обработка одномерных динамических массивов"
Лаба 8 "Обработка матриц"
Лаба 9 "Обработка массива структур с динамическими полями"
Лаба 10 "Обработка списков"
Лаба 11 "Функции с переменным числом аргументов"
Лаба 12 "Библиотеки"

Задача №1

Изи задание

Задача №2

Вариант 2

Принять с клавиатуры координаты 𝑥𝑎, 𝑦𝑎, . . . , 𝑦𝑐 треугольника 𝑎𝑏𝑐 на плоскости. Найти и вывести на экран периметр 𝑃 треугольника.

Задача №3

Вариант 2

C клавиатуры вводятся величины сопротивлений трёх резисторов 𝑅1, 𝑅2, 𝑅3, соединённых параллельно. Найти и вывести на экран сопротивление 𝑅 всего соединения

Задача №4

Вариант 2

С клавиатуры задаётся время в секундах. Перевести в часы, минуты, секунды и вывести на экран.

Задача №5

Вариант 5
Составить программу, распечатывающую вводимое с клавиатуры натуральное 𝑛, полагая, что функцию printf можно вызывать только для печати цифр числа: вызов printf("%d", i) можно осуществлять лишь при 𝑖 = 0, 1, 2, ... , 9

Задача №6

Вариант 5

С клавиатуры задаются координаты точек 𝑥𝑝, 𝑦𝑝, 𝑥𝑞, 𝑦𝑞 отрезка 𝑝𝑞 и координаты точек 𝑥𝑟, 𝑦𝑟, 𝑥𝑠, 𝑦𝑠 отрезка 𝑟𝑠. Определить, не пересекаются или пересекаются два отрезка, и вывести на экран 0 или 1 соответственно.

Задача №7

Вариант 5

Приняв с клавиатуры 𝑥 и 𝜀, 0 < 𝜀 <= 1, вычислить и вывести на экран вычисленное с точностью 𝜀 приближённое значение 𝑠(𝑥) и точное значение 𝑓(𝑥) функции 𝑓, абсолютную ∆ и относительную 𝛿 погрешности:

image image

Задача №8

Вариант 3

Вводится беззнаковое целое число длиной 4 байта. Число вводится в десятичной системе счисления. Зашифровать значение числа, поменяв местами чётные и нечётные биты (т.е. местами меняются 0-ой и 1-ый биты, 2-ой и 3-ий, и т.д.). Результат шифрования вывести на экран в двоичной системе счисления.

Задача №9

Вариант 3

Приняв с клавиатуры по концевому признаку (до первого отрицательного числа) элементы непустой последовательности неотрицательных чисел 𝑥, вычислить и вывести на экран значение 𝑔.

image


В каждой задаче реализуйте программу, которая принимает у пользователя целочисленный статический массив и выполняет его обработку в соответствии с вариантом. Максимальное количество элементов, которое может ввести пользователь, равно десяти.

Задача №1

Вариант 3

Найти и вывести на экран среднее геометрическое положительных элементов массива.

Задача №2

Вариант 3

Сформировать и вывести на экран новый массив, в который скопировать элементы исходного массива, которые являются числами Армстронга.

Задача №3

Вариант 3

Вставить в исходный массив после каждого положительного элемента реверс этого же элемента. Ситуацию, когда массив после операции не изменился, ошибочной не считать.

Задача №4

Вариант 2

В четвёртой задаче необходимо организовать ввод массива по концевому признаку. В качестве концевого признака выступает любая ошибка, которая возникает при очередном вводе значения с помощью функции scanf. Например, при вводе последовательности 1 2 3 a должен быть сформирован массив из трёх элементов со значениями
𝐴[0] = 1, 𝐴[1] = 2, 𝐴[2] = 3
В случае, если массив уже заполнен, а концевой признак ещё не наступил, ввод элементов в массив прекращается. Такое «переполнение» не считается ошибкой: программа должна обработать полученный массив из 10 элементов, но функция main в такой ситуации должна вернуть специальный код ошибки, равный 100.

Упорядочить массив по возрастанию с помощью сортировки выбором (англ. Selection Sort) и вывести на экран.

Задача №5

Вариант 1

При решении пятой задачи в методических целях запрещено использовать выражения вида a[i] и вообще квадратные скобки. Вместо указанного выражения используется выражение *pa, где pa — указатель на элемент массива с индексом 𝑖 (именно на i-ый элемент, а не выражение вида *(pa + i)). Также нельзя передавать как аргумент размер массива в элементах.
Вместо этого предлагается использовать пару указателей: на первый (нулевой) элемент массива и на элемент массива, расположенный за последним. Ситуация, когда эти указатели совпадают, означает пустоту обрабатываемого массива.

Вычислить и вывести на экран значение
𝑋[0] · 𝑌 [0] + 𝑋[1] · 𝑌 [1] + ··· + 𝑋[𝑘] · 𝑌 [𝑘],
где 𝑛 — размер массива, 𝑋 — отрицательные элементы массива в порядке следования, 𝑌 — положительные элементы массива в обратном порядке, 𝑘 = min(𝑝, 𝑞), 𝑝 — количество положительных элементов, 𝑞 — количество отрицательных элементов.

Задача №6

Делается на основе 5 задачи.

На основе пятой задачи проведите сравнение производительности разных способов работы с элементами массива:

  1. использование операции индексации a[i];
  2. формальная замена операции индексации на выражение *(a + i);
  3. использование указателей для работы с массивом. Для этого:
  4. реализуйте функцию, которая выполняет указанное в пятой задаче преобразование массива, используя операцию индексации и количество элементов массива (пусть эта функция называется process_1);
  5. на основе функции process_1 получить функцию process_2, выполнив замену a[i] на *(a + i);
  6. реализуйте программу для проведения измерений (её алгоритм приведён ниже);
  7. проведите замеры времени.

Задача №7

Делается на основе 4 задачи.

Прочитайте дополнительные материалы по профилированию (ЛР2_gprof.pdf). Проведите профилирование программы, написанной для решения четвёртой задачи.
Скорее всего, массив из 10 элементов будет обработан очень быстро и результаты профилирования ничего не покажут. Поэтому размер массива нужно увеличить хотя бы до 1000 элементов. Чтобы не вводить такое количество элементов вручную, предлагается использовать перенаправление ввода и вывода. Для этого нужно создать текстовый файл, в котором на первой строке указать размер массива, а на следующих строках — элементы этого массива. Создать такой файл можно, например, с помощью программы на Python.
После чего запуск программы нужно выполнять следующим образом
app.exe < my_data.txt
Проанализируйте полученные данные профилирования. Часть этих данных приведите в отчёте.


В каждой задаче реализуйте программу, которая принимает у пользователя целочисленную матрицу и выполняет её обработку в соответствии с вариантом. Максимальное количество строк и столбцов матрицы равно десяти.

Задача №1

Вариант 3

По матрице получить и вывести на экран одномерный массив, присвоив его 𝑘-тому элементу значение 1, если выполняется указанное условие, и значение 0 в иных случаях:
элементы 𝑘-ой строки образуют монотонную последовательность.

Если в строке всего один элемент, то последовательности образовать нельзя, как следствие, нельзя образовать и монотонную последовательность.

Задача №2

Вариант 3

Удалить из матрицы все столбцы, содержащие по крайней мере одно число, в записи которого встречается заданная цифра. Цифра вводится в виде числа после ввода матрицы.

Задача №3

Вариант 3

Упорядочить строки матрицы:
по убыванию их наименьших элементов.

Задача №4

Вариант 3

Для квадратной матрицы:
Поменять местами элементы, расположенные в показанной на в примере области.
Первый столбец меняется с последним, второй — с предпоследним и т. д. Элементы, расположенные на главной и побочных диагоналях, включены в обмен.
image

Задача №5

Вариант 1

Элементы матрицы, сумма цифр которых больше 10, в порядке обхода матрицы по строкам поместить в одномерный массив, циклически сдвинуть элементы этого массива влево на три позиции, и вернуть элементы из массива в матрицу в том же порядке, в котором они помещались в массив. Если в матрице нет чисел, сумма цифр которых больше 10, считать ситуацию ошибочной.

Задача №6

Вариант 3

Приняв с клавиатуры число строк и столбцов матрицы, заполнить квадратную целочисленную матрицу по спирали против часовой стрелки. Матрицу вывести на экран.
Пример:
image

Задача №1

Решение этой задачи размещается в папке lab_04_01. В функции main следует сравнить поведение реализованных функций и функций из стандартной библиотеки. Требуется самостоятельно реализовать аналоги следующих строковых функций: 0. strpbrk;

  1. strspn;
  2. strcspn;
  3. strchr;
  4. strrchr.

Сигнатура аналога должна совпадать с сигнатурой оригинала с точностью до имени, к именам аналогов следует прибавить префикс «my_», например, свой аналог функции strpbrk следует объявлять my_strpbrk.

Задача №2

Вариант 3

Требуется написать программу, которая запрашивает у пользователя нужное по заданию количество строк, разбивает оные на слова и выполняет обработку слов. Разбиение строки на слова реализуется самостоятельно — использовать для выделения слов библиотечные функции, например, scanf, sscanf или strtok, запрещено.
В результате разбора каждой строки должен быть сформирован массив слов, после чего выполняется обработка всех полученных массивов.
Результаты выводятся обязательно после фразы «Result:␣». Слова и числа разделяются одним пробелом.
В случае если решение задачи не может быть получено, на экран ничего не выводится, возвращается ненулевой код возврата.

Ввести две строки. Напечатать слова, которые встречаются в двух строках только один раз, т. е. один раз либо в первой, либо во второй. Сначала выводятся слова из первой строки в том порядке, в котором они встретились в этой строке, затем — слова из второй строки.

Задача №3

Вариант 1

Для решения этой задачи нужно использовать функции стандартной библиотеки.
Требуется написать программу, которая запрашивает у пользователя строку и разбивает оную на слова. В результате разбора строки должен быть сформирован массив слов.
Из слов, отличных от последнего, составляется новая строка. Слова в результирующую строку помещаются в обратном порядке с одним пробелом в качестве разделителя. После последнего слова пробел не добавляется.
Прежде, чем очередное слово помещается в результирующую строку, оно подвергается преобразованию в соответствии с вариантом.
Если результирующая строка не пустая, она выводится на экран следующим образом printf("Result:␣%s\n", new_str);

Оставить в слове только первые вхождения каждой буквы.

Задача №4

Вариант 3

Для записи телефонного номера используется следующее представление
[+код_страны](код_оператора)-DDD-DD-DD, где код_страны состоит из произвольного количества десятичных цифр; код_оператора состоит из трех десятичных цифр; буква D означает любую из десятичных цифр.
На вход программе подается произвольная строка. Строка может начинаться и заканчиваться произвольным количеством пробельных символов. Программа должна вывести только сообщение «YES», если в строке содержится правильный телефонный номер в указанном формате, и только «NO» — в противном случае.


Задача №1

Вариант 1

Пользователь вводит целые числа. Признаком окончания ввода считать любой инвалидный ввод.
Прототип функции, которая реализует решение задачи, должен выглядеть следующим образом:
int process(FILE *f [, прочие выходные параметры])
Функция process возвращает 0 в случае успешного решения задачи и отрицательный код ошибки в противном случае (например, -1 – входных данных нет и т.д.). Для каждого кода ошибки задается мнемоническое имя с помощью директивы define.
При решении любого варианта задачи 1 два цикла ввода и массивы не использовать.

Найти первый и второй максимумы последовательности (возможно совпадающие).

Задача №2

Вариант 4

Написать программу, которая считывает из текстового файла вещественные числа и выполняет над ними некоторые вычисления согласно варианту. При решении задачи массивы не использовать. Имя файла берётся из аргументов командной строки. Решение любой из этих задач выполняется минимум за два просмотра файла.

Найти среднее значение чисел, расположенных между минимальным и максимальным числами («между» - не по значению, а по расположению); предполагается, что минимум и максимум один.

Задача №3

В этой задаче нет вариантов, номера варианта в названии папки нет. Требуется написать программу, совершающую действие над двоичным файлом целых чисел int в ответ на вызов с ключом:

  1. создавать файл и заполнять его случайными числами (аргументы в произвольной форме, например, app.exe c number file; создание не проверяется :));
  2. выводить числа из файла на экран (app.exe p file);
  3. упорядочивать числа в файле (app.exe s file). Прежде чем приступать к реализации сортировки файла, необходимо реализовать функцию get_number_by_pos, которая по заданной позиции позволяет прочитать число в указанной позиции, и функцию put_number_by_pos, которая позволяет записать число на указанную позицию с затиранием. Функцию упорядочивания необходимо реализовать с использованием этих функций.
    В начале файла, содержащего исходный код программы, должен располагаться многострочный комментарий, в котором необходимо указать детали реализации этой задачи: как минимум, выбранные целочисленный тип, алгоритм сортировки, «направление» упорядочивания.

Задача №4

Вариант 1 (txt-файл)

Вариант, полнота его реализации и тип обрабатываемых файлов, текстовый или двоичный, определяются преподавателем.
При работе с текстовым файлом данные сначала загружаются в массив, затем обрабатываются, выводятся на экран и, при необходимости, сохраняются в файл. При работе с двоичным файлом данные обрабатываются без использования массива. В текстовом файле на каждой строке располагается значение одного поля структурного типа. Поля структурного типа описываются в том порядке, в котором перечислены в задании. Структурный тип используется без упаковки. При вводе информации для формирования переменной структурного типа значения полей вводится в том порядке, в котором указана в задании. При выводе информации из переменной структурного типа на экран или в текстовый файл поля выводятся в том порядке, в котором указано в задании. Каждое поле располагается на отдельной строке.
В случае если ваше приложение запущено с неправильными или незнакомыми параметрами командной строки, приложение должно возвращать код ошибки 53.

О каждом студенте известны:
(a) фамилия, не более 25 символов;
(b) имя, не более 10 символов;
(c) оценки по четырём предметам, сохраняемые в виде массива целых беззнаковых в 32 бита.

Требуется написать программу, совершающую действие в ответ на вызов с ключом:

(b) Вывод информации о студентах, фамилии которых начинаются с заданной подстроки, в другой файл.
Запуск программы для обработки текстового файла:
./app.exe ft FILE_SRC FILE_DST SUBSTR

(c) Удаление из файла студентов, чей средний балл меньше среднего балла по всему файлу. Результат записывается в тот же файл.
Запуск программы для обработки текстового файла:
./app.exe dt FILE


Вариант 1

В текстовом файле хранится информация о кинофильмах, которая включает в себя название кинофильма, фамилию режиссёра и год выхода на экран. В названии кинофильма не более двадцати пяти символов. В фамилии кинорежиссёра не более двадцати пяти символов. Год выхода задаётся целым числом. Количество кинофильмов в самом файле не указано. Требуется написать программу, которая, будучи вызванной из командной строки:
app.exe FILE FIELD [KEY]
где FILE — имя файла, FIELD — анализируемое поле, KEY — значение ключа;

  1. Считывает информацию о кинофильмах в массив. Информация после чтения полей каждой структуры помещается в массив таким образом, чтобы он сразу же был упорядочен по указанному полю.
  2. Если значение ключа не указано, выводит упорядоченный массив.
  3. Если значение ключа указано, выполняет двоичный поиск1 по полю и значению ключа. Если кинофильм с искомым значением ключа найден, программа выводит информацию о нём на экран, иначе программа выводит сообщение «Not found».

Возможные значения FIELD:

  1. «title» — название кинофильма;
  2. «name» — фамилия режиссёра;
  3. «year» — год выхода.

Примеры валидного вызова программы:

  1. app.exe films.txt title
  2. app.exe films.txt title CasinoRoyale
  3. app.exe films title "Tinker Tailor Soldier Spy"
  4. app.exe films.txt name "Marceau (Maupu)"
  5. app.exe movies.txt name "John Howard Carpenter"

Вариант: Сортировка 1, Фильтр 2

Написать программу, которая упорядочивает данные в целочисленном массиве по возрастанию. Данные в массив считываются из текстового файла. Память под массив выделяется динамически. Количество элементов в файле не указано и определяется при первом проходе по текстовому файлу, во время второго прохода числа считываются в массив.
Требуется написать программу, которая, будучи вызванной из командной строки:
app.exe IN_FILE OUT_FILE [f]
где IN_FILE — имя файла с входными данными, OUT_FILE — имя файла с выходными данными, f — запрос фильтрации перед сортировкой;

  1. Считает количество элементов, записанных в файле.
  2. Выделяет память под соответствующее количество элементов.
  3. Читает файл ещё раз, заполняя динамический массив.
  4. Если указан параметр f, вызывает функцию-фильтр.
  5. Сортирует массив с новыми элементами с помощью назначенного преподавателем алгоритма сортировки.
  6. Записывает элементы отсортированного массива в текстовый файл.

Функция-фильтр работает следующим образом:

  1. определяет количество элементов массива, которые удовлетворяют заданному условию;
  2. выделяет память под соответствующее количество элементов;
  3. копирует элементы, удовлетворяющие условию, из старого массива в новый.

Функция-фильтр имеет следующие название и прототип:
int key(const int *pb_src, const int *pe_src, int **pb_dst, int **pe_dst);
На вход функции-фильтру могут поступать некорректные данные.

Функция сортировки реализуется универсальной, т. е. имеет одинаковый прототип с функцией qsort из стандартной библиотеки и называется mysort.
Кроме того, необходимо сравнить время работы реализованного алгоритма сортировки и qsort. Постарайтесь найти примеры, когда ваша реализация лучше. Результаты представьте в виде графиков (рисунки в формате PNG или любом аналогичном векторном, оси подписаны). Графики разместить в Wiki на отдельной странице. Графики можно строить любыми средствами (например, в Excel, gnuplot).

Сортировка:
Сортировка выбором: находится максимальный элемент массива и переносится в его конец; затем этот метод применяется ко всем элементам массива, кроме последнего (т.к. он уже находится на своем месте), и т.д.

Фильтр:
В массиве остаются элементы от нулевого до m-го, где m - индекс первого отрицательного элемента этого массива либо число n (размер исходного массива), если такого элемента в массиве нет. Т.е. отфильтрованный массив содержит элементы, расположенные перед первым отрицательным элементом, или весь исходный массив, если отрицательные элементы отсутствуют.


Вариант: 2 комплект, простой файл, 11 вариант, 2 способ выделения памяти

Написать программу для работы с матрицами, которая реализует сложение матриц, умножение матриц и указанную ниже операцию.
Память под матрицы выделяется динамически.
Исходные матрицы читаются из файла, Результирующая матрица или число записываются в файл. Один файл содержит одну матрицу.
Тестирование выполняется с помощью сравнения полученного результата с ожидаемым. При этом нужно помнить, что сравнивать вещественные числа на равенство можно только с заданной точностью.
Имена файлов и выполняемая операция указывается через параметры командной строки. Формат запуска приложения должен быть следующим:
app.exe action mtr_1.txt [mtr_2.txt] res.txt
Возможные значения action:

  1. a — сложение;
  2. m — умножение;
  3. o — операция по варианту (для неё mtr_2.txt не указывается).

Если операция по варианту «решение СЛАУ», то столбец свободных членов дописывается к матрице коэффициентов, и матрица размером 𝑛 × (𝑛 + 1) помещается в файл mtr_1.txt. Столбец решений сохраняется в файле res.txt в виде матрицы.
Если операция по варианту «вычисление определителя», то файл res.txt содержит число — значение определителя.

Cпособ выделения памяти:
Объединённый подход, способ 1: при этом способе хранения данные хранятся единым блоком построчно. В памяти размещается, помимо данных, массив указателей на строки.

Формат файла:
Простой формат: количество строк и столбцов матрицы указывается в первой строке файла, остальные строки содержат сами элементы.

2 3
0 1 2
3 4 5

Операция по варианту: Решение СЛАУ методом Гаусса с выбором ведущего элемента по активной подматрице.


Вариант 1

В текстовом файле хранится информация о кинофильмах, которая включает в себя название кинофильма, фамилию режиссёра и год выхода на экран. Год выхода задаётся целым числом. Количество кинофильмов в самом файле не указано. Требуется написать программу, которая, будучи вызванной из командной строки:
app.exe FILE FIELD [KEY]
где FILE — имя файла, FIELD — анализируемое поле, KEY — значение ключа;

  1. Считывает информацию о кинофильмах в массив. Информация после чтения полей каждой структуры помещается в массив таким образом, чтобы он сразу же был упорядочен по указанному полю.
  2. Если значение ключа не указано, выводит упорядоченный массив.
  3. Если значение ключа указано, выполняет двоичный поиск1 по полю и значению ключа. Если кинофильм с искомым значением ключа найден, программа выводит информацию о нём на экран, иначе программа выводит сообщение «Not found».

Возможные значения FIELD:

  1. «title» — название кинофильма;
  2. «name» — фамилия режиссёра;
  3. «year» — год выхода.

Примеры валидного вызова программы:

  1. app.exe films.txt title
  2. app.exe films.txt title CasinoRoyale
  3. app.exe films title "Tinker Tailor Soldier Spy"
  4. app.exe films.txt name "Marceau (Maupu)"
  5. app.exe movies.txt name "John Howard Carpenter"

Задача №1

Вариант 1

Реализовать линейный односвязный список с непрямым владением:

  1. Информационная часть узла представлена указателем на void.
typedef struct node node_t;
struct node
{
void *data;
node_t *next;
};
  1. Список формируется на основе данных, которые читаются из текстового файла. В качестве данных может, например, выступать информация о студенте: фамилия и год рождения. Область данных выбирается самостоятельно и отличается от указанного примера.
  2. Элементы списка данными не владеют, т. е. хранят лишь указатель на них. При удалении элемента из списка данные из хранилища не удаляются.
  3. Для решения некоторых задач требуется функция сравнения элементов. Сравнение элементов реализуется как отдельная функция. Функции, нуждающиеся в сравнении элементов, получают в качестве параметра указатель на компаратор.
  4. Имена файлов, выполняемая операция и т. п. указываются через параметры командной строки, результаты работы записываются в файл.
  5. В качестве одного из необходимых результатов работы должно быть приведено условие осмысленной задачи в выбранной предметной области, которая может быть решена с использованием разработанных вами функций (см. индивидуальное задание) и для решения которой достаточно того объёма данных, которые считываются из исходного файла. Также должна быть написана программа, решающая поставленную задачу.

Задачи на работу с одним элементом списка:

  1. Напишите функцию поиска элемента в списке (нужна функция сравнения элементов). (Относительная сложность: 1.)
node_t* find(node_t *head, const void *data,
int (*comparator)(const void*, const void *));
  1. Напишите функцию pop_end, которая возвращает указатель на данные из элемента, который расположен в «хвосте» списка. При этом из списка сам элемент удаляется. (Относительная сложность: 1.)
void* pop_back(node_t **head);

Задачи на работу с целым списком:
Напишите функцию append, которая получает два списка а и b, добавляет список b в конец a. Список b при этом оказывается пустым. (Относительная сложность: 1.)

void append(node_t **head_a, node_t **head_b);

Сортировка:

node_t* sort(node_t *head, int (*comparator)(const void *, const void *));
// возвращается «новая» голова
  1. Сортировка вставками
    Напишите функцию sorted_insert, которая получает упорядоченный список, и элемент, который нужно вставить в этот список, чтобы не нарушить его упорядоченности.
void sorted_insert(node_t **head, node_t *element,
int (*comparator)(const void *, const void *));

Напишите функцию sort, которая получает список и упорядочивает его по возрастанию, используя функцию sorted_insert. (Относительная сложность: 3.)

Задача №2

Вариант 3

В виде списка представлены степени разложения целого положительного числа 𝑛 на простые множители.

Пример:
image

Требуется:
(a) Реализовать подпрограмму умножения двух таких чисел. (b) Реализовать подпрограмму возведения числа в квадрат. (c) Реализовать подпрограмму деления без остатка.

Правила взаимодействия:
(a) При старте программы пользователь вводит одно из четырёх слов: out, mul, sqr, div. При вводе out далее идёт одно целое число, которое нужно вывести на экран в виде списка. В остальных случаях за словом вводится одно или два числа, над которыми требуется выполнить операцию, реализованную в виде соответствующей подпрограммы. Если в результате получается нуль, считать ситуацию ошибочной.

(b) Выводить число, сохранённое в виде списка, на экран в виде степеней множителей в одну строку через пробел от младшего к старшему. После вывода в той же строке печатать букву L. Помните, что при реализации списка в первую очередь стоит задуматься над тем, что можно интерпретировать, как пустой список.


Вариант %s и %o

Реализовать собственную версию функции snprintf, обрабатывающую указанные спецификаторы типа. Функция должна называться my_snprintf. При реализации этой функции запрещается использовать любые стандартные функции для обработки строк.
Реализуемые спецификаторы (%c, %d, %i, %x, %o, %s) и модификаторы (l и h) распределяются преподавателем.
Исходный код лабораторной работы располагается в ветке lab_11. В этой ветке создается папка lab_11, в которой располагается исходный код программы. Реализованные спецификаторы сохраняются в файле format.txt в виде строки «d hx s» (кавычки не указываются). Для проверки правильности решения задачи реализуются только модульные тесты, в которых нужно сравнить поведение (спецификацию) своей функции и соответствующей стандартной.


Задача №1

Реализовать лабораторную работу №7 с использованием библиотек разного типа. В библиотеку вынести функции ввода/вывода и обработки. Для динамических библиотек использовать два вида компоновки.
Реализацию функции-фильтра придётся изменить таким образом, чтобы выделение памяти выполняла вызывающая сторона.
В модульных тестах также нужно использовать библиотеки.

Задача №2

Вариант 2

Реализовать заданные преподавателем функции в виде динамической библиотеки. Язык реализации библиотеки — Си.
Библиотеку использовать в скрипте на Python. Скрипт на Python должен предоставлять графический интерфейс для взаимодействия. Для организации взаимодействия между библиотекой на Си и Python использовать модуль ctypes.
Выделение памяти на вызывающей стороне реализовать двумя способами:

  1. выполнить оценку максимально возможного размера массива и выделить память с запасом;
  2. сначала вызвать функцию библиотеки, чтобы узнать требуемый размер массива, затем выделить память и повторно вызвать функцию.

Написание модуля расширения для библиотеки необязательно.

  1. Реализовать функцию заполнения массива числами Фибоначчи.
  2. Реализовать функцию, которая из одного массива помещает во второй массив первое вхождение каждого элемента первого массива.

About

💻 C programming | BMSTU | IU7 | 2-3 sem

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published