oleggy-gvz / Labs_C

Лабораторные работы по языку С

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

* Проекты выполнены в среде QT Creator на языке C

Лаб. работа №1-1 «Управляющие структуры и циклы» (Lab_1-1)

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

Задание: Сформировать массив простых множителей заданного числа.

Входные данные: Целое положительное число A

Результат: Сформированный массив K, содержащий простые числа, где перемножение между собой всех значений данного массива в результате дает то же число A, указанное во входных данных

Метод решения: Последовательно делим число A на все простые числа (начиная с 2) проверяя при этом есть ли остаток от деления или нет. Если остаток от деления имеется (больше 0), то переходим к следующему простому числу, на которое снова делим число A. Если на каком-то шаге, остатка от деления не обнаружено (равен 0), значит текущее простое число является одним из искомых простых делителей числа A. Добавляем данное простое число в массив K, а результат деления (число A1), сохраняем и в дальнейшем производим все те же операции над числом A1 какие были сделаны для числа A (т.е. заменяем число A на A1). Выполняем до тех пор, пока число An не станет простым числом, т.е. на последнем шаге число An также будет добавлено в массив K.

Лаб. работа №1-2 «Итерационные процессы» (Lab_1-2)

Цель: Познакомиться итерационными процессами и циклами. Научиться использовать итерационные циклы для выполнения многократно повторяющихся действий и предусматривать соответствующий выход из данного цикла.

Освоить метод решения задач с использованием интеграционных циклов где число повторений цикла заранее не известно и зависит от вычисляемого условия в программе.

Задание: Рассчитать ln (x) = 2/1*z + 2/3*z^3+...+2/(2n-1)*z^(2n-1), где z=(x-1)/(x+1), n – кол-во элементов ряда.

Входные данные: Вещественная переменная x которая будет принимать значения от 0.1 до 1 с шагом 0.1.

Результат: Сформированная таблица, содержащий три столбца, 1-ый столбец, значение x указанного выше диапазона, 2-ой столбец значение функции ln (x) вычисленного способом представления через ряд с точностью до 4-го знака после запятой, 3-й столбец значение функции ln (x) вычисленное с помощью библиотечной функции.

Метод решения: Рассмотрим методику расчета ln(x) через ряд. Расчет будет осуществляться через накопительное суммирование всех элементов ряда до числа n. При этом сам по себе ряд является сходящимся, каждый последующий элемент меньше предыдущего, соответственно, чем больше число n, тем точнее получается итоговая величина и тем больше операций суммирования нам нужно сделать, т.к. кол-во элементов рядя у нас равно числу n. Соответственно сравнивая получившееся значение текущего элемента ряда с некой величиной определенной точности (знаков после запятой) мы можем в итоге управлять итоговой точностью получающего значения ln(x). Далее делаем перебор значений x от 0.1 до 1 с шагом 0.1 высчитываем на каждом шаге значение ln(x).

Лаб. работа №1-3 «Строки» (Lab_1-3)

Цель: Познакомиться со строками в языке Си. Научится использовать различные комбинации управляющих структур и циклов и массивов для достижения различных манипуляций со строками. Научится решать задачи с использованием библиотечных функции языка Си для работы со строками.

Задание: "Перевернуть" в строке все слова. (Например: "Жили были дед и баба" - "илиЖ илиб дед и абаб").

Входные данные: Строка содержащее предложение из нескольких строк разделенных пробелами.

Результат: Строка содержащее исходное предложение, но каждое слово, в котором инвертировано. Инвертированное слово – это такое слово, где все символы в слове переставлены задом наперед, т.е. 1-я буква в исходном слове становится последней в перевернутом, 2-ая буква - предпоследней и т.д. где последняя буква в исходном слове становится 1-ой в перевернутом. Причем регистр букв перестановке сохраняется.

Метод решения: Исходное предложение (строку) разбиваем на массив слов (подстрок), где пробел будет определять начало или конец каждого слова (подстроки). Далее имея массив слов (подстрок) перебираем по порядку каждую слово и инвертируем его по алгоритму, описанному выше. После в конечную строку добавляем каждое инвертированное слово в том же порядке, как и в исходной строке.

Лаб. работа №1-4 «Сортировки» (Lab_1-4)

Цель: Познакомиться со алгоритмами сортировок в языке Си. Научится использовать различные комбинации сортировок для получения различных конечных данных.

Задание: Шейкер-сортировка. Процесс движения в прямом и обратном направлении реализовать в виде одного цикла, используя параметр - направление движения (+1/-1) и меняя местами нижнюю и верхнюю границы просмотра.

Входные данные: Шейкер-сортировка. Процесс движения в прямом и обратном направлении реализовать в виде одного цикла, используя параметр - направление движения (+1/-1) и меняя местами нижнюю и верхнюю границы просмотра.

Результат: Отсортированный массив элементов по возрастанию: от меньших к большим.

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

Лаб. работа №2-1 «Сортировка и поиск с указателями» (Lab_2-1)

Цель: Познакомиться с работой с указателями в языке Си. Научится использовать различные приемы работы с указателями для реализации различных алгоритмов поиска и сортировки.

Задание: Функция производит двоичный поиск места размещения нового элемента в упорядоченном массиве и возвращает указатель на место включения нового элемента. С помощью функции реализовать сортировку вставками.

Входные данные: Массив символов (строка), содержащий случайный набор символов.

Результат: Массив символов (строка), отсортированный по коду символа – от меньшего к большему.

Метод решения:

Для бинарного поиска: На каждом шаге алгоритма выбирается символ со средним индексом в уже отсортированной строке и сравнивается с 'k'. Если 'k' меньше или равен значению из середины, то такой же алгоритм осуществляется в первой половине элементов, иначе — во второй. Процесс повторяется тех пор, пока интервал для поиска не сузится до одного символа, и правая граница которого и будет искомым местом для вставки символа 'k'.

Для сортировки вставками: На каждом шаге алгоритма выбирается по порядку один из символов сортируемой строки и помещается на нужную позицию в уже отсортированной строке (такая строка начинается с одного символа) до тех пор, пока набор входных данных не будет исчерпан.

Лаб. работа №2-2 «БД на структурах» (Lab_2-2)

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

Задание:

Определить структурированный тип «Авиабилет»:

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

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

  • ввод элементов (полей) структуры с клавиатуры;
  • вывод элементов (полей) структуры на экран;
  • «очистка» структурированных переменных;
  • удаление заданного элемента;
  • изменение (редактирование) заданного элемента.
  • сортировка массива структур в порядке возрастания заданного поля (при сортировке можно использовать тот факт, что в Си++ разрешается присваивание структурированных переменных);
  • поиск свободной структурированной переменной;
  • поиск в массиве структур минимального значения заданного поля;
  • поиск в массиве структур элемента с заданным значением поля или с наиболее близким к нему по значению.

Входные данные: Массив структур, содержащий случайный набор данных полей структуры.

Результат: Массив структур, отсортированный по заданному полю структуры – от меньшего к большему.

Метод решения: Сортировка вставками: На каждом шаге алгоритма выбирается по порядку один из символов сортируемой строки и помещается на нужную позицию в уже отсортированной строке (такая строка начинается с одного символа) до тех пор, пока набор входных данных не будет исчерпан.

Лаб. работа №2-3 «Работа с памятью через указатели» (Lab_2-3)

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

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

Область памяти представляет собой строку. Если в ней встречается выражение "%nnnd", где nnn – целое, то сразу же за ним следует массив из nnn целых чисел (во внутреннем представлении, то есть типа int). За выражением "%d" - одно целое число, за "%nnnf" - массив из nnn вещественных чисел, за "%f" - одно вещественное число.

Входные данные: Область памяти, представленная в виде строки, в которой записаны массивы целых и дробных чисел с их размерностью. Т.е. в памяти располагается строка %nc", где n – целое число в виде байта, которое характеризует количество введённых цифр одного типа. Далее идет символ c – который может быть либо 'd' либо 'f'. Символ 'd' означает целое число типа int, 'f' – вещественное число типа float. После символа c идет во внутреннем представлении подряд числа с типом (указанным в c) и в заданном количестве (кол-во указано в n).

Результат: Выводит на консоль последовательно массив целых либо дробных чисел. Массивы наполняются из области памяти в которой в определенном формате представлены данные массивы.

Метод решения:

Функция последовательно выводит на консоль массивы чисел, целых либо дробных. Массив чисел наполняется посредством раскодирования данных из области памяти. В начале из области памяти считываем 1 символ, если он равен %, далее проверяем идет ли после него символы 'd' (целое) или 'f' (дробное), если да, то считаем, что массив состоит из 1 элемента. Если таких символов не обнаружено, то считываем байт со значением – кол-вом чисел, сохраненных в памяти (размерность массива). После него считываем символ типа данных массива – 'd' (целое) или 'f' (дробное).

для целого для вещественного
p_d = (int*)p;
d = p_d++;
p = (char
)p_d;
p_f = (float*)p;
f = p_f++;
p = (char
)p_f;

где,
p – исходное представление памяти в виде строки;
p_d – временный указатель на область памяти p представленной в типе int;
p_f – временный указатель на область памяти p представленной в типе float;
d – переменная с целым числом (текущим элементом массива) которое будет записываться в память;
f – переменная с целым числом (текущим элементом массива) которое будет записываться в память;
После него с помощью операций последовательно считываем из памяти каждое число.

Лаб. работа №2-4 «Функции с переменным числом параметров» (Lab_2-4)

Цель: Научится работать с функциями с переменным числом параметров. Научится извлекать параметры из списка с применением преобразования типа указателя.

Задание: Разработать функцию с переменным числом параметров. Для извлечения параметров из списка использовать операцию преобразования типа указателя. Последовательность указателей на вещественные переменные, ограниченная NULL. Функция возвращает динамический массив указателей на эти переменные.

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

Результат: Функция возвращает динамический массив указателей на значения типа double, где последний элемент массива ссылается на нулевой указатель.

Метод решения: Сначала функция подсчитывает количество переданных элементов до последнего нулевого. После, зная кол-во переменных создаем динамический массив указателей типа double и после того перебирая каждый элемент динамического массива присеваем ему текущий указатель. Последний указатель в массиве будет нулевым – NULL.

Лаб. работа №2-5 «Собственная реализация функций malloc и free» (Lab_2-5)

Цель: Научится работать с памятью на низком уровне. Научится выделять место в памяти заданного размера под переменные и осуществлять освобождение памяти.

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

Входные данные: Целое значение sz, характеризующее размер в байтах области памяти, для которой осуществляется выделение.

Результат: Адрес на первый байт области памяти размером sz байт, которая была выделена из кучи. Если памяти недостаточно, чтобы удовлетворить запрос, возвращается нулевой указатель.

Метод решения: Осуществляется поиск, в таблице свободных адресов, записи у которой размер блока памяти равен или больше sz байт. Изначально в таблице свободных адресов присутствует только одна запись – весь объем непрерывной области памяти. Далее при нахождении такого блока, его начальный адрес и размер величиной sz добавляются таблицу занятых областей. Если в данной таблице уже есть записи (ранее уже были выделены области для др. задач) новая запись добавляется с учетом сортировки по адресам, т.к. все записи в таблице занятых блоков упорядочены в порядке возрастания адресов. После добавления блока в таблицу занятых блоков, размер блока в свободной области уменьшается на величину sz а адрес блока смещается вперед на ту же величину sz.

About

Лабораторные работы по языку С


Languages

Language:C 98.9%Language:QMake 1.1%