Цикл лабораторных работ по дисциплине "Программирование", в рамках которой предлагалось изучить С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.4), нацеленных на освоение базовых концепций языка C: от простых вычислений до работы с массивами и функциями.
Задача: Реализовать вычисление площади трапеции, постепенно усложняя программу.
Формула:
Этапы выполнения:
- Написать программу для разового вычисления площади по введенным с клавиатуры параметрам.
- Модифицировать алгоритм для последовательной обработки трех наборов входных данных.
- Оптимизировать вычислительный процесс, используя цикл
forдля повторения операций.
Задача: Вычислить значение кусочно-заданной функции
Функция:
Особенности: Требуется подключение математической библиотеки (-lm при компиляции в Linux/Unix).
Задача: Протабулировать функцию из задания 0.1 на заданном отрезке.
Исходные данные:
-
Диапазон аргумента
$x$ : от -2 до 2. - Количество точек: 15.
Особенности: Следует учесть, что область определения функции может не покрывать весь заданный диапазон, что приведет к невозможности вычислить значение в некоторых точках.
Задача: В одномерном массиве, размер которого задается с клавиатуры (не более 15 элементов), вычислить заданную характеристику.
Вариант: Вычислить и вывести количество отрицательных элементов, модуль которых больше 10.
Задача: Написать программу для обработки трех массивов разной длины, разбив логику на отдельные функции (подпрограммы).
Действия:
- Ввести три массива (размером 5, 4 и 6 элементов соответственно).
- Для каждого массива создать новую версию, в которой знаки всех элементов изменены на противоположные.
- В измененных массивах подсчитать и вывести общее количество положительных элементов.
- Операции ввода, вывода, изменения знаков и подсчета должны быть реализованы в виде отдельных функций.
Задача: Вычислить значения функций
Выражения:
Исходные данные:
Задача: Вычислить значение функции
Условия и формулы:
Рабочий набор данных:
Задача: Вычислить
Функция:
Исходные данные:
Написано правильно и круто?
Задача: Вычислить значение функции, содержащей сумму и произведение, используя рекуррентные соотношения для оптимизации вычислений.
Функция:
Исходные данные:
Задача: Написать программу для вычисления значения величины y, заданной следующим образом:
Задача: Вычислить значение выражения, содержащего вложенные суммы.
Выражение:
Исходные данные:
Задача: Вычислить значение
Выражение:
Особенности: Обратите внимание на разные пределы суммирования: в первой и третьей суммах
Задача: Даны три числовые последовательности (массива)
где
Задача: В матрице размером
Ограничения:
Задача: Ввести текст из
Ограничения:
- Количество строк
$n \le 20$ . - Длина строки не более 128 символов.
- В каждой строке гарантированно есть минимум два слова.
Особенности: Использовать стандартные функции библиотеки string.h.
Задача: Разработать программу для работы с массивом структур, содержащим сведения о запасах товаров.
Действие: Вывести на экран информацию о тех товарах, текущий запас которых меньше установленного норматива.
Поля структуры:
- Наименование товара: строка (длина до 50 символов).
- Норматив на величину запаса: целое число (диапазон от 1 до 5000).
- Единица измерения: строка (длина до 20 символов, например: "тонна", "литр", "упаковка").
- Текущее значение запаса: целое число (диапазон от 0 до 5000).
Ограничения: Количество элементов в массиве структур
Особенности: Ввод данных должен предусматривать контроль корректности значений (валидацию), чтобы пользователь не мог ввести числа вне допустимых диапазонов.
Задача: Дан текстовый файл, в каждой строке которого записано произвольное количество чисел (в формате с плавающей точкой f).
Обработка: Сформировать новый файл, дописав в конец каждой строки исходного файла значение её максимального элемента.
Задача: Реализовать консольный калькулятор (операции +, -, *, /) в двух вариантах и написать управляющий Bash-скрипт.
Варианты реализации:
- Классический: Выбор операции осуществляется через конструкцию
switch-case. - Через указатели: Выбор операции осуществляется через массив структур, содержащих символ операции и указатель на соответствующую функцию (таблица диспетчеризации).
Особенности: Разработка Bash-скрипта с интерактивным меню для запуска программ.
Репозиторий: Перейти к проекту
Задача: Для заданной электрической цепи по известному входному сигналу определить выходной сигнал для
Ход работы:
- Математический расчет сигналов в wxMaxima.
- Построение графиков зависимостей
$U(t)$ (wxMaxima / LibreOffice Calc). - Программная реализация на C с записью результатов в файлы.
- Автоматизация процесса скриптом на Bash.
- Оформление пояснительной записки по ГОСТ 19.402-78.
Входной сигнал:
Параметры входа:
Передаточная характеристика:
Параметры цепи:
Расчетный параметр:
Длительность переднего фронта импульса сигнала для
Сборка:
makeПример запуска (л/р №1):
cd firstLab
make
./bin/linear_calcВ ходе разработки программ особое внимание уделялось устойчивости к некорректным данным и граничным условиям:
-
Валидация пользовательского ввода:
- Проверка возвращаемого значения
scanfдля защиты от ввода символов вместо чисел (защита от «зацикливания» ввода). - Контроль диапазонов значений для структур данных (л/р №10, л/р №0.3).
- Проверка возвращаемого значения
-
Математические ограничения (ОДЗ):
- Обработка деления на ноль, извлечения корня из отрицательного числа и логарифмирования неположительных аргументов (л/р №1, №2).
- Проверка попадания аргумента в допустимые диапазоны кусочно-заданных функций.
-
Граничные условия массивов и строк:
- Соблюдение лимитов статических массивов (например,
$N \le 100$ ). - Безопасная работа со строками фиксированной длины во избежание переполнения буфера (л/р №9).
- Соблюдение лимитов статических массивов (например,
-
Файловые операции (л/р №11):
- Проверка успешного открытия файла (
fopenвозвращаетNULL). - Корректная обработка пустых файлов или файлов с неполными данными.
- Проверка успешного открытия файла (
Проект распространяется под лицензией PolyForm Noncommercial 1.0.0.
Эта лицензия позволяет свободно использовать материалы для личного обучения и некоммерческих проектов, но запрещает любое коммерческое использование.
- Разрешено: использовать, копировать, изменять и распространять код для некоммерческих целей.
- Запрещено: продажа материалов, использование в платных курсах или любое другое коммерческое использование.
- Условие: при распространении необходимо сохранять уведомления о лицензии.
Полный текст лицензии: LICENSE.