Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2023, 17:01   #1
GRIMM9
Новичок
Джуниор
 
Регистрация: 23.04.2023
Сообщений: 2
По умолчанию Задача на языке Си

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

Комментарий преподавателя - "В оперативную память должна загружаться только информация о конкретном маршруте, а не весь массив структур"

P.S.Писал код к предыдущему заданию, где сам пользователь вводит всю информацию в массив структур, может пригодится.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
 
#define N 8
 
struct MARSH
{
    char startOfRoute[30];
    char finalOfRoute[30];
    unsigned int routeNumber;
};
 
void findRoute(unsigned int, struct MARSH*, int*, bool*);
void sortRoutes(struct MARSH*);
 
int main()
{
    int index;
    bool exist;
    unsigned int routeChoice;
    struct MARSH listOfRoutes[N];
    for (int i = 0; i < N; i++)
    {
        printf("\nВведите начальный пункт маршрута: ");
        fgets(listOfRoutes[i].startOfRoute, 31, stdin);
        fflush(stdin);
        printf("Введите конечный пункт маршрута: ");
        fgets(listOfRoutes[i].finalOfRoute, 31, stdin);
        fflush(stdin);
        printf("Введите номер маршрута: ");
        scanf("%u", &listOfRoutes[i].routeNumber); 
        fflush(stdin);
    }
    sortRoutes(listOfRoutes);
    printf("\nВведите номер маршрута, информация о котором вам нужна: ");
    scanf("%u", &routeChoice);
    findRoute(routeChoice, listOfRoutes, &index, &exist);
    if (!exist)
    {
        printf("\nНет такого номера маршрута.\n");
    }
    else
    {
        printf("\nНачальный пункт маршрута: %s", listOfRoutes[index].startOfRoute);
        printf("Конечный пункт маршрута: %s\n", listOfRoutes[index].finalOfRoute);
    }
    return 0;
}
 
void sortRoutes(struct MARSH* listOfRoutes)
{
    struct MARSH temp;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            if(listOfRoutes[j].routeNumber>listOfRoutes[i].routeNumber)
            {
                temp = listOfRoutes[j];
                listOfRoutes[j]=listOfRoutes[i];
                listOfRoutes[i]=temp;
            }
        }
        
    }
    
}
 
void findRoute(unsigned int routeChoice, struct MARSH* listOfRoutes, int *index, bool *exist)
{
    for (int i = 0; i < N; i++)
    {
        if(routeChoice == listOfRoutes[i].routeNumber)
        {
            *exist = true;
            *index = i;
        }
    } 
}
Пример массива структур

8 // кол-во записей в массиве структур
Москва Самара 1 // начало конец номер
Волгоград Красноярск 2
Пермь Челябинск 3
Воронеж Нижний Новгород 4
Краснодар Казань 5
Омск Екатеринбург 6
Ростов-на-Дону Новосибирск 7
Уфа Москва 8

Не понимаю как это сделать, буду благодарен любым подсказкам.

Последний раз редактировалось GRIMM9; 23.04.2023 в 17:05.
GRIMM9 вне форума Ответить с цитированием
Старый 23.04.2023, 21:25   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

1) Вы уже сделали ввод данных из консоли в массив. Теперь достаточно открыть текстовый файл и заменить stdin на его хэндл.
2) Ввод данных в массив надо переделать на ввод данных из текстового файла (см. пункт 1) и вывод их сразу в бинарный. Для этого не нужно массива, а достаточно одной записи.
3) Поиск данных в массиве тоже надо переделать на чтение данных из бинарного файла в одну единственную запись с остановкой при чтении искомого номера маршрута.
macomics вне форума Ответить с цитированием
Старый 23.04.2023, 23:41   #3
GRIMM9
Новичок
Джуниор
 
Регистрация: 23.04.2023
Сообщений: 2
По умолчанию

macomics,
Цитата:
Сообщение от macomics Посмотреть сообщение
2) Ввод данных в массив надо переделать на ввод данных из текстового файла (см. пункт 1) и вывод их сразу в бинарный. Для этого не нужно массива, а достаточно одной записи.
Я сделал программу, всё работает, но я делаю это как раз через массив. Я сделал массив из структур, записал в этот массив все записи из structures.txt, закрыл файл, открыл бинарный файл и записал туда всё, затем освободил память, которую выделял динамически, и закрыл бинарный файл. Это сильно плохо? Лучше переделать как сказали вы, используя только одну запись?
Я понимаю зачем это делать, если записей будет много - памяти может не хватить, да и так получается компактнее в плане используемой памяти, но на этом этапе написания программы не думал об этом, а исправлять сейчас код не хочется.
GRIMM9 вне форума Ответить с цитированием
Старый 23.04.2023, 23:46   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от GRIMM9 Посмотреть сообщение
Я сделал программу, всё работает, но я делаю это как раз через массив. Я сделал массив из структур, записал в этот массив все записи из structures.txt, закрыл файл, открыл бинарный файл и записал туда всё, затем освободил память, которую выделял динамически, и закрыл бинарный файл. Это сильно плохо? Лучше переделать как сказали вы, используя только одну запись?
Я понимаю зачем это делать, если записей будет много - памяти может не хватить, да и так получается компактнее в плане используемой памяти, но на этом этапе написания программы не думал об этом, а исправлять сейчас код не хо
Это стоит переделать т.к. вам уже было сказано:
Цитата:
Сообщение от GRIMM9 Посмотреть сообщение
"В оперативную память должна загружаться только информация о конкретном маршруте, а не весь массив структур"
macomics вне форума Ответить с цитированием
Старый 24.04.2023, 08:12   #5
jillitil
Форумчанин
 
Аватар для jillitil
 
Регистрация: 17.10.2018
Сообщений: 184
По умолчанию

Что-то в таком роде?
Изображения
Тип файла: jpg screenshot.9.jpg (37.6 Кб, 2 просмотров)
Вложения
Тип файла: 7z lab.7z (36.4 Кб, 1 просмотров)
jillitil вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на языке Си Naga Помощь студентам 1 15.01.2013 15:28
Задача на языке С или С++ anna20 Помощь студентам 2 10.03.2012 23:47
задача на языке си lider219 Помощь студентам 4 20.09.2010 19:54
Задача на языке С++ varlonec Помощь студентам 11 16.12.2009 15:47