Главная страница
Навигация по странице:

  • Постановка задачи и описание решения

  • Выделение памяти под структуру

  • О выборе строчной переменной (признака отбора).

  • Описание функций и их переменных « number _ of _ sep » (тип int , находит количество символов-разделителей в строке).

  • Описание структуры .

  • Схема алгоритма Контрольные примеры

  • Текст программы Примеры выполнения программы

  • ИССЛЕДОВАНИЕ РАЗВЕТВЛЁННЫХ ЦЕПЕЙ КОМПЕНСАЦИОННЫМ МЕТОДОМ. Указатели на структуры и функции


    Скачать 145.35 Kb.
    НазваниеУказатели на структуры и функции
    АнкорИССЛЕДОВАНИЕ РАЗВЕТВЛЁННЫХ ЦЕПЕЙ КОМПЕНСАЦИОННЫМ МЕТОДОМ
    Дата09.03.2022
    Размер145.35 Kb.
    Формат файлаdocx
    Имя файлаmelnik-lab07.docx
    ТипОтчет
    #387971


    МИНОБРНАУКИ РОССИИ

    Санкт-Петербургский государственный

    электротехнический университет

    «ЛЭТИ» им. В.И. Ульянова (Ленина)

    Кафедра Вычислительной техники

    отчет

    по лабораторной работе 0

    по дисциплине «Программирование»

    Тема: «Указатели на структуры и функции»

    Студент гр. 1308




    Мельник Д. А.

    Преподаватель




    Морозов С. М.


    Санкт-Петербург

    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). Сортировка производится методом «пузырька», аналогично предыдущей ЛР. Если такого вагона в составе нет, то этот состав считается приоритетным и ставится выше остальных.

    После сортировки выводится итоговый массив структур.

    Описание функций и их переменных

    1. «number_of_sep» (тип int, находит количество символов-разделителей в строке).



    Имя переменной

    Входная/ локальная

    Тип

    Назначение

    1

    C

    входная

    char*

    Строка текста, подаваемая на вход в функцию

    2

    m

    локальная

    int

    Количество символов-разделителей в строке (счётчик), идёт на return.

    3

    i

    локальная

    int

    Счётчик для перебора символов строки текста

    Функция принимает на вход отдельную строку обрабатываемого текста. Считает и возвращает количество символов-разделителей (в данном случае «;») в данной текстовой строке. Работает по переборному алгоритму.

    1. «coordinates_of_sep» (тип void, заполняет массив координат символов-разделителей).



    Имя переменной

    Входная/ локальная

    Тип

    Назначение

    1

    P

    входная

    char*

    Строка текста, подаваемая на вход в функцию

    2

    sep

    входная

    int*

    Целочисленный массив, коор-т разд-й

    3

    i

    локальная

    int

    Счётчик для перебора символов строки

    4

    m

    локальная

    int

    Счётчик, для индексации чисел в момент записи их в массив sep

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

    1. slovo_str (тип char*, извлекает слово из строки).



    Имя переменной

    локальная/глобальная

    Тип

    Назначение

    1

    slovo

    локальная

    char*

    Переменная для записи слова, идёт на return

    2

    x1

    глобальная

    int

    координата начала считывания

    3

    x2

    глобальная

    int

    координата конца считывания

    4

    С

    глобальная

    char*

    Входная строка, полученная из файла

    5

    i

    локальная

    int

    Переменная для работы цикла for, индекс для элементов строки

    6

    m

    локальная

    int

    Переменная для индексирования элементов строки-слова (slovo)

    Функция считывает произвольное слово из строки файла путём копирования в отдельную переменную slovo с целью дальнейшего присвоению структуре.

    1. sort_of_struc (тип void, сортирует структуры в порядке возрастания по определённому элементу целочисленного массива поля структуры ).



    Имя переменной

    локальная/глобальная

    Тип

    Назначение

    1

    i

    локальная

    int

    Переменная для работы цикла for, при этом индекс при сортировке

    2

    j

    локальная

    int

    Переменная для работы цикла for, при этом индекс при сортировке

    3

    u

    глобальная

    int

    номер вагона в целочисленном массиве, ко которому идёт сортировка

    4

    t0[]

    глобальная

    struct Trains

    массив структур студентов для сортировки

    5

    ns

    глобальная

    int

    количество структур к сортировке

    6

    str[]

    глобальная

    struct Trains

    Буфер для перемещения структур

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

    1. number_of_strings (тип int, возвращает количество строк в исходном файле).



    Имя переменной

    локальная/глобальная

    Тип

    Назначение

    1

    n

    локальная

    int

    переменная-счётчик количества строк

    2

    FN

    глобальная

    char*

    переменная-имя файла

    3

    f

    глобальная

    FILE

    переменная-файл

    Функция открывает файл и переборными методом находит количество символов перевода строки («\n»), которое соответствует количеству строк.

    1. chislo_int (тип int, извлекает целое число из строки файла ).



    Имя переменной

    локальная/глобальная

    Тип

    Назначение

    1

    ch

    локальная

    char*

    переменная строка, представляющая число

    2

    m

    локальная

    int

    переменная-индекс при копировании числа в строку

    3

    x1

    глобальная

    int

    индекс начала копировния

    4

    x2

    глобальная

    int

    индекс конца копирования

    5

    C

    глобальная

    char*

    исходная строка, из которой происходит копирование

    6

    i

    локальная

    int

    переменная счётчик для цикла

    7

    d

    локальная

    int

    число, полученное из строки (через atoi) идёт на return.

    Функция выполняет считывание числа из строки в строковом формате и преобразует строковый формат в целочисленный.

    1. «coordinates_of_sep» (тип void, заполняет массив координат символов-разделителей).



    Имя переменной

    Входная/ локальная

    Тип

    Назначение

    1

    strA

    входная

    char*

    Переменная-строка, в которой поиск

    2

    strB

    входная

    char*

    Переменная-подстрока

    3

    i

    локальная

    int

    переменная-счётчик для цикла

    4

    a

    локальная

    int

    переменная-флаг о совпадении, идёт на return

    Функция приводит обе строковые переменные к стандартному виду (к одинаковому регистру) и проверяет наличие подстроки в строке: в положительном случае на возврат идёт 1, в противном – 0.

    1. nums_vag (тип int*, извлекает из файла и возвращает целочисленный массив).



    Имя переменной

    локальная/глобальная

    Тип

    Назначение

    1

    cos

    глобальная

    int*

    массив координат символов разделителей

    2

    q

    глобальная

    int

    количество вагонов в составе

    3

    x1

    глобальная

    int

    индекс начала копировния

    4

    x2

    глобальная

    int

    индекс конца копирования

    5

    C

    глобальная

    char*

    исходная строка, из которой происходит копирование

    6

    m

    глобальная

    int

    переменная-конец строки-> конец считывания

    7

    j

    локальная

    int

    переменная счётчик для цикла

    8

    nv

    локальная

    int*

    Массив номеров вагонов, идёт на return.

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

    main (описание переменных)



    Имя переменной

    Тип

    Назначение

    1

    key

    char

    Переменная-флаг, сигнализирующая о продолжении работы программы и выделенности памяти.

    2

    j

    int

    переменная-счётчик в циклах

    3

    FN

    char*

    имя файла

    4

    n

    int

    количество строк в изначальном файле, затем структур

    5

    i

    int

    Переменная для работы цикла for, при этом индекс при сортировке

    6

    m

    int

    количество разделителей в строке

    7

    c

    int

    количество добавляемых структур

    8

    r

    int

    переменная-индекс для дополнения массива структур

    9

    cos

    int*

    Массив координат разделителей в строке

    10

    g

    int

    количество структур после дополнения

    11

    h

    int

    переменная-счётчик в цикле

    12

    svh

    int

    количество отобранных структур

    13

    usl

    int*

    массив с флагами пригодности структур

    14

    y

    int

    переменная для формирования флага

    15

    p

    int

    переменная-номер вагона, по которому сортировка

    16

    f1

    FILE

    файл для чтения

    17

    C[]

    char

    строка, считываемая из файла

    18

    e

    char

    переменная-флаг о признаке сортировки

    19

    sear[]

    char

    подстрока-признак отбора



    Описание структуры.

    struct Trains

    {

    char *name;--название поезда

    char *city;--город эксплуатации

    char *factory;--завод-производитель

    char *type;--тип вагонов поезда

    int yop;--год производства

    int nol;--номер линии эксплуатации

    int nvag;--количество вагонов в поезде

    int *numa;--номера вагонов поезда

    double damage;--изношенность %

    double shum;--шимность %

    }


    Схема алгоритма

    Контрольные примеры

    1. Входные данные (файл)



    Без дополнений, отбор по городу (b), выбор подстроки «MoS», сортировка по первому вагону. На выходе две строки в следующем порядке: Tabakov, Sokolniki.


    1. Входные данные аналогичны (1), с дополнением в виде:




    отбор по типу вагона (е) по подстроке «717», сортировка по второму вагону. На выходе должны получить строки в следующем порядке: Opolchenetc, Tabakov, Pushka, Akvarel/

    1. Входные данные:



    без дополнений, отбор по городу (b), подстрока «sUm».

    на выходе: NO trains.

    Текст программы


    Примеры выполнения программы









    3)



    Выводы.

    В ходе работы были получены навыки работы с указателями на структуры в ЯП Си, поставленная задача выполнена, цель работы выполнена.



    написать администратору сайта