ИССЛЕДОВАНИЕ РАЗВЕТВЛЁННЫХ ЦЕПЕЙ КОМПЕНСАЦИОННЫМ МЕТОДОМ. Указатели на структуры и функции
Скачать 145.35 Kb.
|
МИНОБРНАУКИ РОССИИ Санкт-Петербургский государственный электротехнический университет «ЛЭТИ» им. В.И. Ульянова (Ленина) Кафедра Вычислительной техники отчет по лабораторной работе № 0 по дисциплине «Программирование» Тема: «Указатели на структуры и функции»
Санкт-Петербург 2022 Цель работы. Целью работы является изучение указателей на структуры в ЯП Си, а конкретно, использование указателей для создания динамических массивов структур, так как на практике чаще приходится работать с динамическим выделением памяти, нежели статическим выделением памяти. Задание (вариант 14) Выбор записей, в которых значение любого символьного поля (выбор из меню) содержит указанную подстроку без учета регистра, сортировка результата по возрастанию значений любого из элементов поля с числовым массивом (выбор признака сортировки — из меню). Постановка задачи и описание решения Необходимо написать программу, которая способна работать с динамическими структурами и обрабатывать их. Задача: составить структуру произвольной тематики, в которой есть два поля с динамическим массивом символов (строкой), переменные целочисленного и с плавающей точкой типов (по две каждого), поле, содержащее целочисленный массив. Написать программу, обеспечивающую начальное формирование массива структур при чтении из файла (текст с разделителями — CSV) с последующим возможным дополнением элементов массива при вводе с клавиатуры. Отобрать структуры, в которых содержится строковая переменная с заданной подстрокой (без учёта регистра), сформировать из отобранных структур массив структур и отсортировать его по выбранному элементу целочисленного массива. Полученный отобранный и отсортированный массив структур вывести на экран в удобном к восприятию пользователем виде. Об алгоритме решения. Алгоритм считывания информации из файла (считывание строки и разбивка её по переменным структуры) похож на предыдущую ЛР, но имеет изменения: была написана отдельная функция для записи строковых переменных (особенность Си), функция для преобразования имени файла сведена к объявлению конца имени нуль-терминатором (slovo_str). Разбивка строки на переменные структуры аналогична (для переменных с плавающей точной была использована функция “atof”, преобразующая строку в число, важная особенность: запись числа в CSV или с клавиатуры ведётся через точку. Выделение памяти под структуру из файла выполнено с помощью функции malloc (количество строк в файле было найдено с помощью написанной функции number_of_str). Далее, после успешного выделения, через цикл for производится первичная запись массива структур. После записи, пользователю выводится первичная информация в виде таблицы. О добавлении структур. Для этого пользователь должен ввести количество структур, которое он хочет добавить. После этого производится перевыделение памяти под новое количество структур (под g), реализованное с помощью функции realloc. После удачного выделения памяти, пользователь заполняет пустые поля с клавиатуры, после чего ему представляется окончательный вариант таблицы данных. О выборе строчной переменной (признака отбора). В выведенной для пользователя таблицы, каждый столбец, в шапке, имеет буквенный индекс (для строчных переменных это a, b, c, e). Пользователь выбирает переменную, по которой будет вестись отбор. Далее он вводит подстроку, от наличия которой в переменной зависит дальнейшая судьбы всей структуры. Независимость от регистра реализована следующим образом: при поиске вхождения подстроки в строку (функция strstr, библиотека string.h) обе переменные (строка и подстрока) переводятся в верхний регистр (функция toupper библиотеки ctype.h), далее происходит сравнение (написана функция: vhod_strok), по которому определяется верность всей структуры. Если такая подстрока была найдена, то в соответствующем массиве (usl) ставится 1 в соответсвие номеру данной структуры. По собранному массиву, в новый массив структур вводятся структуры из старого, удовлетворяющие условию отбора. Пользователь выбирает номер вагона, по тех. номеру которго будет производиться сортировка структур (номера от 1 до 8). Сортировка производится методом «пузырька», аналогично предыдущей ЛР. Если такого вагона в составе нет, то этот состав считается приоритетным и ставится выше остальных. После сортировки выводится итоговый массив структур. Описание функций и их переменных «number_of_sep» (тип int, находит количество символов-разделителей в строке).
Функция принимает на вход отдельную строку обрабатываемого текста. Считает и возвращает количество символов-разделителей (в данном случае «;») в данной текстовой строке. Работает по переборному алгоритму. «coordinates_of_sep» (тип void, заполняет массив координат символов-разделителей).
Функция принимает на вход отдельную строку обрабатываемого текста и пустой целочисленный массив, который требуется заполнить. Переборным алгоритмом находит в ней каждый разделитель и добавляет его индекс в массив координат разделителей. Также добавляет в массив крайнюю правую (равную длине всей строки, из-за особенностей программирования). slovo_str (тип char*, извлекает слово из строки).
Функция считывает произвольное слово из строки файла путём копирования в отдельную переменную slovo с целью дальнейшего присвоению структуре. sort_of_struc (тип void, сортирует структуры в порядке возрастания по определённому элементу целочисленного массива поля структуры ).
Функция выполняет сортировку структур по элементу целочисленного массива в поле структуры методом пузырька. number_of_strings (тип int, возвращает количество строк в исходном файле).
Функция открывает файл и переборными методом находит количество символов перевода строки («\n»), которое соответствует количеству строк. chislo_int (тип int, извлекает целое число из строки файла ).
Функция выполняет считывание числа из строки в строковом формате и преобразует строковый формат в целочисленный. «coordinates_of_sep» (тип void, заполняет массив координат символов-разделителей).
Функция приводит обе строковые переменные к стандартному виду (к одинаковому регистру) и проверяет наличие подстроки в строке: в положительном случае на возврат идёт 1, в противном – 0. nums_vag (тип int*, извлекает из файла и возвращает целочисленный массив).
Функция извлекает номера вагонов в виде строки из первичной, обращает из в целые числа (использование функции chislo_int) и формирует выходной массив. main (описание переменных)
Описание структуры. struct Trains { char *name;--название поезда char *city;--город эксплуатации char *factory;--завод-производитель char *type;--тип вагонов поезда int yop;--год производства int nol;--номер линии эксплуатации int nvag;--количество вагонов в поезде int *numa;--номера вагонов поезда double damage;--изношенность % double shum;--шимность % } Схема алгоритма Контрольные примеры Входные данные (файл) Без дополнений, отбор по городу (b), выбор подстроки «MoS», сортировка по первому вагону. На выходе две строки в следующем порядке: Tabakov, Sokolniki. Входные данные аналогичны (1), с дополнением в виде: отбор по типу вагона (е) по подстроке «717», сортировка по второму вагону. На выходе должны получить строки в следующем порядке: Opolchenetc, Tabakov, Pushka, Akvarel/ Входные данные: без дополнений, отбор по городу (b), подстрока «sUm». на выходе: NO trains. Текст программы Примеры выполнения программы 3) Выводы. В ходе работы были получены навыки работы с указателями на структуры в ЯП Си, поставленная задача выполнена, цель работы выполнена. |