Skip to content

b1sted-labs/c-labs

Repository files navigation

Лабораторные работы по C99

Цикл лабораторных работ по дисциплине "Программирование", в рамках которой предлагалось изучить С99, реализуя от простых подсчетов площадей геометрических фигур до калькулятора, работающего на указателях функций.

Лицензия Платформа Зависимости

Технологический стекСтруктура репозиторияУсловия работСборка и запускТестирование и обработка ошибокЛицензия


Технологический стек

Категория Инструмент Примечание
Язык C Стандарт C99
Компилятор GCC Сборка с флагами -Wall, -g и -lm (для math.h)
Сборка GNU Make Автоматизация компиляции через Makefile
Отладка GDB Поиск ошибок и пошаговое выполнение
Скрипты Bash Интерактивные меню (Lab 12) и служебные сценарии
ОС Linux Целевая платформа

Структура репозитория

├── introLabs   # Вводные задания: базовый синтаксис, математические вычисления, одномерные массивы и декомпозиция на функции
├── firstLab    # Линейные алгоритмы: ввод/вывод (printf/scanf) и математические формулы (math.h)
├── secondLab   # Условные переходы: реализация кусочно-заданных функций (if/else)
├── thirdLab    # Простые циклы: табулирование функций с фиксированным шагом (for)
├── fourthLab   # Рекуррентные вычисления: накопление сумм и произведений рядов, оптимизация циклов
├── fifthLab    # Вложенные циклы: сложные суммы и обработка зависимых переменных
├── sixthLab    # Декомпозиция: создание пользовательских функций и передача параметров
├── seventhLab  # Одномерные массивы: индексация, трансформация последовательностей
├── eighthLab   # Двумерные массивы: матричные операции, обработка строк и столбцов
├── ninthLab    # Строки: работа с char*, токенизация (strtok) и манипуляции словами
├── tenthLab    # Структуры данных: массивы записей (struct), фильтрация и форматированный вывод
├── eleventhLab # Работа с файлами: построчная обработка чисел и модификация текстовых данных
└── twelfthLab  # Указатели на функции: таблица диспетчеризации (калькулятор) и Bash-скрипт

Условия работ

Лабораторная работа №0: Вводные задания

Эта работа состоит из нескольких частей (0.0 – 0.4), нацеленных на освоение базовых концепций языка C: от простых вычислений до работы с массивами и функциями.

Задание 0.0: Основы вычислений и циклы

Задача: Реализовать вычисление площади трапеции, постепенно усложняя программу.

Формула:

$$S = \frac{(a+b)}{2} \cdot h$$

Этапы выполнения:

  1. Написать программу для разового вычисления площади по введенным с клавиатуры параметрам.
  2. Модифицировать алгоритм для последовательной обработки трех наборов входных данных.
  3. Оптимизировать вычислительный процесс, используя цикл for для повторения операций.

Задание 0.1: Реализация разветвляющихся алгоритмов

Задача: Вычислить значение кусочно-заданной функции $y = f(x)$ для одного значения $x$, введенного пользователем.

Функция:

$$ y = \begin{cases} \frac{\log_{10}(\frac{|x|}{100} - 0.01) + 2x}{2x - 2}, & \text{при } x \le 0 \\ \frac{\log_{10}(\frac{|x|}{100} - 0.01) + 2x}{x - 1}, & \text{при } x > 0 \end{cases} $$

Особенности: Требуется подключение математической библиотеки (-lm при компиляции в Linux/Unix).


Задание 0.2: Табулирование функции

Задача: Протабулировать функцию из задания 0.1 на заданном отрезке.

Исходные данные:

  • Диапазон аргумента $x$: от -2 до 2.
  • Количество точек: 15.

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


Задание 0.3: Работа с одномерными массивами

Задача: В одномерном массиве, размер которого задается с клавиатуры (не более 15 элементов), вычислить заданную характеристику.

Вариант: Вычислить и вывести количество отрицательных элементов, модуль которых больше 10.


Задание 0.4: Декомпозиция и работа с функциями

Задача: Написать программу для обработки трех массивов разной длины, разбив логику на отдельные функции (подпрограммы).

Действия:

  1. Ввести три массива (размером 5, 4 и 6 элементов соответственно).
  2. Для каждого массива создать новую версию, в которой знаки всех элементов изменены на противоположные.
  3. В измененных массивах подсчитать и вывести общее количество положительных элементов.
  4. Операции ввода, вывода, изменения знаков и подсчета должны быть реализованы в виде отдельных функций.

Лабораторная работа №1: Линейные вычислительные процессы

Задача: Вычислить значения функций $y$ и $z$ для заданных значений $x, a, b$.

Выражения:

$$y = \frac{1 + \ln(x + 5.3)}{x + 5.3}$$

$$z = \frac{\sqrt{y + 15 \sin{a}}}{\sqrt{y + 15 \sin{a}} + 2b}$$

Исходные данные: $x = 2, \quad a = 2, \quad b = 3$


Лабораторная работа №2: Разветвляющиеся вычислительные процессы

Задача: Вычислить значение функции $y = f(x)$ в зависимости от условия попадания $x$ в определенный диапазон.

Условия и формулы:

$$ y = \begin{cases} \frac{\cos(x) + 14}{\sin(x) + 15}, & \text{при } x \le 4 \\ \sqrt[3]{x + \ln(|x - 8|)}, & \text{при } 4 < x < 12 \\ \sqrt{x - 13}, & \text{при } 12 \le x < 38 \\ 5x, & \text{при } x \ge 38 \end{cases} $$

Рабочий набор данных: $x = 40$


Лабораторная работа №3: Циклические процессы (Табулирование)

Задача: Вычислить $N$ значений функции $y = f(x)$ для ряда равноотстоящих значений аргумента $x$, начиная от $x_{нач}$ до $x_{кон}$.

Функция:

$$y = \frac{\sin(ax) + \sin^2(a)}{4 + \sin^2(x)}$$

Исходные данные: $N = 15, \quad a = 2, \quad x_{нач} = 1.5, \quad x_{кон} = 2.9$


Написано правильно и круто?

Лабораторная работа №4: Рекуррентные формулы

Задача: Вычислить значение функции, содержащей сумму и произведение, используя рекуррентные соотношения для оптимизации вычислений.

Функция:

$$y = 2.4 \sin{x} + \prod_{i=6}^{n} \left( \frac{x}{x+1} + \frac{i^2}{1+i^2} \right)$$

Исходные данные: $n = 30, \quad x = 9$

Дополнительное задание

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

$$y = \frac{3 \cdot \sum_{i=2}^{n}i^2 + \prod_{i=2}^{n} \frac{i}{i + 2}}{\prod_{i=2}^{n}i^2 + 2 \cdot \sum_{i=2}^{n} \frac{i}{i + 2}}$$


Лабораторная работа №5: Вложенные циклы

Задача: Вычислить значение выражения, содержащего вложенные суммы.

Выражение:

$$y = \sum_{i=1}^{n}\frac{0.5x + \sum_{j=1}^{m}(2j+1)^2}{x + \sum_{k=1}^{m}(i+2k)^3}$$

Исходные данные: $x = 2, \quad n = 14, \quad m = 20$


Лабораторная работа №6: Организация функций

Задача: Вычислить значение $y$, оформив вычисление похожих сумм в виде пользовательской функции.

Выражение:

$$y = \frac{a \cdot \sum_{k=3}^{n}(2k+1)^2}{1 + 2 \cdot \sum_{k=1}^{m}(3k+a)^2 + 3 \cdot \sum_{k=3}^{n}(k+3)^2}$$

Особенности: Обратите внимание на разные пределы суммирования: в первой и третьей суммах $k$ от 3 до $n$, во второй — от 1 до $m$.


Лабораторная работа №7: Обработка одномерных массивов

Задача: Даны три числовые последовательности (массива) $a, b, c$. Сформировать две новые последовательности $x$ и $y$ по правилу:

$$x_i = a_i + b_{n-i+1}$$

$$y_i = b_i + c_{n-i+1}$$

где $i = 1, 2, \dots, n$.


Лабораторная работа №8: Обработка двумерных массивов

Задача: В матрице размером $N \times M$ вычислить для каждой строки отклонение её элементов от среднего значения этой строки.

Ограничения: $N \le 10, \quad M \le 10$.


Лабораторная работа №9: Работа со строками

Задача: Ввести текст из $n$ строк. В каждой строке поменять местами первое и второе слово.

Ограничения:

  • Количество строк $n \le 20$.
  • Длина строки не более 128 символов.
  • В каждой строке гарантированно есть минимум два слова.

Особенности: Использовать стандартные функции библиотеки string.h.


Лабораторная работа №10: Работа со структурами

Задача: Разработать программу для работы с массивом структур, содержащим сведения о запасах товаров.

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

Поля структуры:

  1. Наименование товара: строка (длина до 50 символов).
  2. Норматив на величину запаса: целое число (диапазон от 1 до 5000).
  3. Единица измерения: строка (длина до 20 символов, например: "тонна", "литр", "упаковка").
  4. Текущее значение запаса: целое число (диапазон от 0 до 5000).

Ограничения: Количество элементов в массиве структур $n \le 100$.

Особенности: Ввод данных должен предусматривать контроль корректности значений (валидацию), чтобы пользователь не мог ввести числа вне допустимых диапазонов.


Лабораторная работа №11: Работа с файлами

Задача: Дан текстовый файл, в каждой строке которого записано произвольное количество чисел (в формате с плавающей точкой f).

Обработка: Сформировать новый файл, дописав в конец каждой строки исходного файла значение её максимального элемента.


Лабораторная работа №12: Указатели на функции

Задача: Реализовать консольный калькулятор (операции +, -, *, /) в двух вариантах и написать управляющий Bash-скрипт.

Варианты реализации:

  1. Классический: Выбор операции осуществляется через конструкцию switch-case.
  2. Через указатели: Выбор операции осуществляется через массив структур, содержащих символ операции и указатель на соответствующую функцию (таблица диспетчеризации).

Особенности: Разработка Bash-скрипта с интерактивным меню для запуска программ.


Курсовая работа: Моделирование электрической цепи

Репозиторий: Перейти к проекту

Задача: Для заданной электрической цепи по известному входному сигналу определить выходной сигнал для $N$ равноотстоящих моментов времени и вычислить его характеристики с погрешностью не более 1%.

Ход работы:

  1. Математический расчет сигналов в wxMaxima.
  2. Построение графиков зависимостей $U(t)$ (wxMaxima / LibreOffice Calc).
  3. Программная реализация на C с записью результатов в файлы.
  4. Автоматизация процесса скриптом на Bash.
  5. Оформление пояснительной записки по ГОСТ 19.402-78.

Входной сигнал:

$$ U_{\text{вх}}(t) = \begin{cases} 0, & \text{при } t \leq t_1 \\ a(t - t_1), & \text{при } t_1 < t \leq t_2 \\ a(t_2 - t_1) - b(t - t_2), & \text{при } t_2 < t \leq t_3 \\ a(t_2 - t_1) - b(t_3 - t_2) - c(t - t_3), & \text{при } t > t_3 \end{cases} $$

Параметры входа:

$a = 20, \quad b = 0.5, \quad c = 17$ $t_{\text{нач}} = 5, \quad t_1 = 10, \quad t_2 = 15, \quad t_3 = 45, \quad t_{\text{кон}} = 50$

Передаточная характеристика:

$$ U_{\text{вых}} = \begin{cases} aU_{\text{вх}} + b, & \text{при } U_{\text{вх}} \leq U_{\text{вх}1} \\ aU_{\text{вх}1} + b, & \text{при } U_{\text{вх}} > U_{\text{вх}1} \end{cases} $$

Параметры цепи: $a = 2, \quad b = -5, \quad U_{\text{вх}1} = 20$

Расчетный параметр: Длительность переднего фронта импульса сигнала для $U_{\text{вых}}$.

Сборка и запуск

Сборка:

make

Пример запуска (л/р №1):

cd firstLab
make
./bin/linear_calc

Тестирование и обработка ошибок

В ходе разработки программ особое внимание уделялось устойчивости к некорректным данным и граничным условиям:

  1. Валидация пользовательского ввода:

    • Проверка возвращаемого значения scanf для защиты от ввода символов вместо чисел (защита от «зацикливания» ввода).
    • Контроль диапазонов значений для структур данных (л/р №10, л/р №0.3).
  2. Математические ограничения (ОДЗ):

    • Обработка деления на ноль, извлечения корня из отрицательного числа и логарифмирования неположительных аргументов (л/р №1, №2).
    • Проверка попадания аргумента в допустимые диапазоны кусочно-заданных функций.
  3. Граничные условия массивов и строк:

    • Соблюдение лимитов статических массивов (например, $N \le 100$).
    • Безопасная работа со строками фиксированной длины во избежание переполнения буфера (л/р №9).
  4. Файловые операции (л/р №11):

    • Проверка успешного открытия файла (fopen возвращает NULL).
    • Корректная обработка пустых файлов или файлов с неполными данными.

Лицензия

Проект распространяется под лицензией PolyForm Noncommercial 1.0.0.

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

  • Разрешено: использовать, копировать, изменять и распространять код для некоммерческих целей.
  • Запрещено: продажа материалов, использование в платных курсах или любое другое коммерческое использование.
  • Условие: при распространении необходимо сохранять уведомления о лицензии.

Полный текст лицензии: LICENSE.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors