В этом репозитории лежат все 6 лабораторных работ, которые я делал в рамках предмета 1 семестра "Информатика и основы программирования".
Теперь про структуру проекта:
- В лабораторных реализованы
Makefile-ы, поэтому можно не беспокоиться о компиляции и просто запуститьmake. В первых 2 лабораторных они пока не реализованы, ведь там для сборки нужен только 1 файл. - В некоторых лабораторных из-за специфики заданий есть несколько опций компиляции(просто
makeможет не сработать, надо будет писать напримерmake bench). Для подробной информации об опциях можно либо просто открытьMakefileв интересующей папке, либо прочитать описание лаб ниже. - Все исполняемые файлы и некоторые другие временные файлы, например
.o, хранятся вbuild/для удобного исключения их с помощью.gitignore
- Написать программу, которая при вводе числа выводит его уникальныые цифры, порядок следования важен. Пример -
12321->123,-422323->-423 - Самое классное решение лежит в
uniq_final.c
- Вычислить
$$\sin^3(x)=\frac{3}{4}(\frac{8x^3}{3!}-\frac{80x^5}{5!}+\frac{728x^7}{7!}-...) = \frac{3}{4}\sum_{n=1}^\infty (-1)^{n+1}\frac{3^{2n}-1}{(2n + 1)!}x^{2n-1}$$ Лабораторная работа №2 «Вычисление значений числовых рядов и функций с заданной точностью»
Необходимо спроектировать и реализовать на языке C две программы, позволяющие вычислять значения некоторой заданной функции. Программа №1 должна обеспечивать возможность вычисления значения функции при определённых значениях параметров, указанных пользователем. При этом, пользователь должен иметь возможность указать количество членов ряда, которое необходимо использовать при вычислениях. Ключевым компонентом программы №1 должна быть некоторая функция, на вход которой передаются значения параметров и количество членов ряда, необходимое для проведения вычислений. Возвращаемым значением для указанной функции должно быть вычисленное значение. Программа No 2 должна обеспечивать возможность вычисления значения функции при определённых значениях параметров, указанных пользователем. При этом, пользователь должен иметь возможность указать точность, с которой должно быть вычислено значение функции. Ключевым компонентом программы No 2 должна быть некоторая функция, на вход которой передаются значения параметров и точность, с которой необходимо вычислить результат. В качестве результата функция должна возвращать вычисленное значение и количество членов ряда, которое потребовалось вычислить для обеспечения заданной точности (данное значение необходимо вернуть через параметр). Примечания:
- Логически законченные части алгоритмов решения задачи должны быть оформлены в виде отдельных функций с параметрами. Использование глобальных переменных не допускается.
- Исходные коды программ должны быть логичным образом разбиты на несколько файлов.
- Программы должны осуществлять проверку корректности вводимых данных и, в случае ошибок, выдавать соответствующие сообщения, после чего продолжать работу.
- Программа должна корректным образом работать с памятью, для проверки необходимоиспользовать соответствующие программные средства, например:
valgrind(при тестировании и отладке программы ее необходимо запускать командой видаvalgrind ./lab2, а при анализе производительности —./lab2).
- Исполняемый файл создается в
lab2/build/для того, чтобы не засорять основную папку и для удобного игнорирования файлов в.gitignore
- Вариант №9
Индивидуальное задание
В исходной последовательности целых чисел найти те, цифры в записи которых расположены
строго по убыванию при чтении слева направо. Сформировать из данных чисел новую последовательность, удалив их из исходной.
Правила изменения размера выделенной под массив области памяти
Размер выделенной под массив области памяти задаётся пользователем вручную через соответствующие пунты меню. Любые операции по изменению размера выделенной области памяти выполняются только по явному запросу со стороны пользователя.
Лабораторная работа №3 «Работа с массивами данных»
Необходимо спроектировать и реализовать на языке C программу, осуществляющую по запросам пользователя ввод, обработку и вывод последовательности данных, которая представляется в виде массива.
Программа должна реализовывать следующую функциональность:
- Инициализация массива (заполнение массива в цикле).
- Вставка нового элемента в массив по индексу.
- Удаление элемента массива по индексу.
- Обработка данных (в соответствии с индивидуальным заданием).
- Вывод текущего состояния массива.
- Примечания:
- Взаимодействие программы с пользователем должно быть выстроено с помощью диалогового меню. Штатный способ завершения работы программы — через соответствующий пункт диалогового меню.
- Программа должна осуществлять проверку корректности вводимых данных и,в случае ошибок, выдавать соответствующие сообщения, после чего продолжать работу.
- Обрабатываемые последовательности должны быть представлены в виде массива элементов, которые имеют соответствующий тип данных.
- Память под массивы обрабатываемых данных должна выделяться и освобождаться динамически, с использованием функций
calloc(),malloc(),realloc()иfree()из состава стандартной библиотеки. - Использование VLA (массивов переменной длины) не допускается.
- Приудаленииэлементамассивасуказанныминдексом,элементымассивасбольшиминдексом должны «сдвигаться влево».
- При вставке в массив нового элемента по индексу, значение которого превышает максимально допустимое (оно соответствует длине массива), необходимо осуществлять вставку в конец массива.
- Логически законченные части алгоритма решения задачи должны быть оформлены в виде отдельных функций с параметрами. Использование глобальных переменных не допускается.
- Исходные коды программы должны быть логичным образом разбиты на несколько файлов (необходимо использовать как
*.c-файлы, так и*.h-файлы). - Согласно условиям индвидуального задания,может требоваться наличие нескольких исходных последовательностей. В таком случае, пользователь должен иметь возможность интерактивного взаимодействия с каждой из них.
- Программа должна корректным образом работать с памятью,для проверки необходимо использовать соответствующие программные средства, например:
valgrind(при тестировании и отладке программы необходимо запускать её командой видаvalgrind ./lab3).
В этой лабораторной реализован Makefile с единственной опцией. Использование: make
- Вариант №30 Задание Продублировать все гласные буквы в строке.
Лабораторная работа № 4 «Работа со строками»
Из входного потока вводится произвольное количество строк произвольной длины. Каждая строка в общем случае содержит одно или более слов, разделенных пробелами и/или знаками табуляции.
Завершение ввода определяется концом файла. Для каждой входной строки формируется новая выходная строка, в которую помещается результат. В полученной строке слова разделяются только одним пробелом, пробелов в её начале и в конце быть не должно. Введённая и сформированная строки
выводятся на экран в двойных кавычках.
В ходе выполнения лабораторной работы должны быть разработаны:
- Программа, использующая функцию
readline()из состава библиотеки GNU readline для ввода строк и функции стандартной библиотеки для их обработки (<string.h>). - Программа, идентичная п. 1, за исключением того, что все библиотечные функции заменены
на собственную реализацию данных функций, представленную в отдельных файлах (например:
mystring.h,mystring.c). Отчётность по выполнению лабораторной работы должна включать: - Блок-схему алгоритма работы основной программы.
- Блок-схемы алгоритмов работы функций по обработке строк.
- Исходные коды всех программ.
- Тестовые наборы для программ п. 1 и п. 2.
- Сравнительный анализ времени, потраченного на решение задачи программами п. 1 и п. 2 (на конкретных примерах).
- Примечания:
- Каждая строка представлена на физическом уровне вектором.
- Использование массивов переменной длины (VLA — variable length arrays) не допускается.
- Ввод строк должен быть организован с помощью функции
scanf()со спецификациями для ввода строк. Использование функций семействаgets(),getchar(), а также спецификаций%си%mвscanf()не допускается. - Целочисленные и строковые константы, используемые в формулировках индивидуальных заданий, должны быть заданы в исходном коде с помощью директив препроцессора #define.
- Программа должна корректным образом завершаться при обнаружении EOF — конца файла (в
UNIX-подобных ОС инициируется нажатием клавишCtrl + D, в Windows —Ctrl + Z). - Логически законченные части алгоритма решения задачи должны быть оформлены в виде отдельных функций с параметрами. 1
- Исходные коды программ должны быть логичным образом разбиты на несколько файлов (необходимо использовать как *.c-файлы, так и *.h-файлы).
- Использование глобальных переменных не допускается.
- Программы должна корректным образом работать с памятью. Для проверки необходимо использовать соответствующие программные средства, например,
valgrind(при тестировании и отладке программ п. 1 и п. 2 необходимо запускать их командой видаvalgrind ./lab4, а при анализе производительности —./lab4).
В этой лабораторной есть Makefile со следующими опциями:
make 1: компиляция варианта программы с использованием стандартной библиотекиstring.hmake 2: компиляция программы с самописными реализациями функцийstring.h
Также есть другие опции
В ходе выполнения лабораторной работы должны быть разработаны:
- Программа, осуществляющая чтение массива из текстового файла, его сортировку и запись результата в другой текстовый файл.
- Программа, осуществляющая таймирование сортировки массива.
Программы 1 и 2 должны реализовывать поддержку работы с тремя алгоритмами сортировок: двумя из индивидуального задания и с реализацией алгоритма быстрой сортировки из состава стандартной библиотеки — функцией qsort().
Программа 1 должна через аргументы командной строки получать следующие параметры:
- Алгоритм сортировки (через опцию).
- Поле, по которому осуществляется сортировка (через опцию).
- Направление сортировки (через опцию).
- Имя входного файла (через обязательный позиционный аргумент).
- Имя выходного файла (через обязательный позиционный аргумент).
Программа 2 должна через аргументы командной строки получать следующие параметры:
- Алгоритм сортировки (через опцию).
- Поле, по которому осуществляется сортировка (через опцию).
- Направление сортировки (через опцию).
- Количество элементов в генерируемых массивах (через обязательный позиционный аргумент).
- Количество генерируемых массивов(через обязательный позиционный аргумент).
Примечания:
- Программы должны осуществлять обработку аргументов командной строки с помощью функции getopt() из состава стандартной библиотеки.
- Программа должна осуществлять проверку корректности данных, получаемых от пользователя через аргументы командной строки. В случае ошибок — выдавать соответствующие сообщения в поток вывода ошибок и завершаться с соответствующим кодом ошибки.
- Программа должна осуществлять проверку корректности данных, считываемых из текстового файла. В случае ошибок формата файла — выдавать соответствующие сообщения в поток вывода ошибок и завершаться с соответствующим кодом ошибки. В случае некорректных данных для конкретных записей — выдавать соответствующие сообщения в поток ошибок, после чего продолжать работу, игнорируя данные записи.
- Для работы с данными, формат которых описан в индивидуальном задании, должен быть разработан собственный составной тип данных — структура.
- Для работы с данными, формат которых описан в индивидуальном задании, должен быть разработан простой формат хранения данных в текстовом файле.
- Работа с текстовыми файлами должна осуществляться при помощи функций стандартной библиотеки fopen(), fclose(), fprintf(), fscanf().
- Логически законченные части алгоритма решения задачи должны быть оформлены в виде отдельных функций с параметрами. Использование глобальных переменных не допускается.
- Исходные коды программы должны быть логичным образом разбиты на несколько файлов.
- Программа должна корректным образом работать с памятью, для проверки необходимо использовать соответствующие программные средства, например: valgrind (при тестировании и отладке программы ее необходимо запускать командой вида valgrind ./lab5, а при анализе производительности — ./lab5).
Отчётность по выполнению лабораторной работы должна включать:
- Блок-схемы алгоритмов сортировки массива.
- Исходные коды программ.
- Тестовые наборы для программ.
- Результаты таймирования, содержащие таблицы, графики зависимости времени выполнения сортировок от количества сортируемых элементов и аргументированные выводы об оценке сложности рассмотренных алгоритмов сортировки и её совпадении с теоретическими ожиданиями Вариант №165
Структура данных Абонент:
- ФИО (строка произвольной длины);
- номер телефона (строка длиной до 16 символов, которая может включать в себя цифры, пробелы и знак «+» в начале);
- время последнего звонка (целочисленное значение, соответствующее временной метке в формате UNIX time).
Алгоритмы сортировки
- Чётно-нечётная сортировка (Odd-even sort).
- Сортировка Шелла (Shell sort).
Необходимо спроектировать и разработать на языке C программу, осуществляющую обработку строковых данных, на физическом уровне представленных в виде списков.
Из входного потока вводится произвольное количество строк произвольной длины. Каждая строка в общем случае содержит одно или более слов, разделенных пробелами и/или знаками табуляции. Завершение ввода определяется концом файла. Каждая выходная строка формируется путем модификации исходной строки в соответствии с требованиями, предъявляемыми индивидуальным заданием. В полученной строке слова разделяются только одним пробелом. Исходная и полученная строки выводятся в кавычках на экран.
Примечания:
- Каждая строка представлена списком. Элементы списка имеют по два поля, первое из которых содержит символ, а второе — указатель на следующий элемент списка или NULL. При необходимости возможно использование двусвязного списка.
- Выходная строка должна формироваться путем модификации исходной строки (т.е. путем модификации исходного списка, без создания нового).
- Перестановка элементов списка должна осуществляться с помощью манипуляций указателями или путем обмена значениями, лежащими в первом поле элементов списка. Выбор того или иного способа должен быть обоснован.
- Ввод строк должен быть организован с помощью функции getchar(), каждый считываемый из входного потока символ должен сразу добавляться в формируемый список.
- Логически законченные части алгоритма решения задачи должны быть оформлены в виде отдельных функций с параметрами. Использование глобальных переменных не допускается.
- Программа должна корректным образом работать с памятью, для проверки необходимо использовать соответствующие программные средства, например: valgrind (при тестировании и отладке программы её необходимо запускать командой вида valgrind ./lab6).
Отчёт о выполнении лабораторной работы должен включать:
- Блок-схемы основных алгоритмов работы программы.
- Исходные коды программы.
- Тестовые наборы для программы.
Вариант №15
Задание
Осуществить циклический сдвиг на N символов влево в каждом слове строки.