Не знаю с чего начать:(

Товарищи программисты подскажите с чегко начать писать данную программу:
Справочное бюро вокзала. расписание движение поездов включает следующую информацию: НЦомер поезда, станцию назначения, время отправление, дни отправления, время прибытия на станцию назначения. при создании автомстизированного справочного бюро была добавленна информация о наличии мест каждой категории(СВ, купе, плацкарт, общий). Вся информация хранится в файлеПрограмма должна обеспечить: 1)поиск для всех поездов, отправляющихся в указанный город. 2)поиск всех поездов отправляющихся в указанный город в определённый день 3)Выдау информации о наличии мест по номеру поезда 4)поиск поездов, прибывших в пункт назначения в указанный временном интервале.
Может кто нибудь сможет написать последовательность решения этой задачи....Покрайней мере знаю одно что задача на работу с файлами... файлы уже создал......а что дальше..?????подскажите зелёному в этом деле
4 ответа

начни с алгоритма.. составь блок схему =)


начни с алгоритма.. составь блок схему =)
Это то понятно...но вот с какого именно.....сначало надо описать подпрограммы поиска в файлах? а потом уже основную задачу или наобород.....:??


1) Начать нужно с объявления соответствующей структуры "поезд". 2) Ввод информации. В учебных задачах достаточен динамический массив из "поездов" размерностью 10. Обеспечивается возможность закончить ввод и раньше (скажем, введенная пустая строка для номера поезда обрабатывается как конец ввода). 3) Вывод на консоль. 4) Запись в файл. Должна вестись в режиме "append", что дает возможность накопить множество "поездов". 5) Решение подзадач 1-2-3-4 при обработке всех записей из файла.Рекомендую посмотреть пример со структурой: Работа с массивом структур Здесь решены все основные проблемы ввода/вывода.


/////////////////////////////////////////////////////////////////////////////////////////
//Справочное бюро вокзала. расписание движение поездов включает следующую информацию: 
//Номер поезда, 
//станцию назначения, 
//время отправление, 
//дни отправления, 
//время прибытия на станцию назначения. 
//при создании автомстизированного справочного бюро была добавленна информация 
//о наличии мест каждой категории(СВ, купе, плацкарт, общий).
//Вся информация хранится в файле
//
//Программа должна обеспечить:
//1)поиск для всех поездов, отправляющихся в указанный город.
//2)поиск всех поездов отправляющихся в указанный город в определённый день
//3)Выдау информации о наличии мест по номеру поезда
//4)поиск поездов, прибывших в пункт назначения в указанный временном интервале.
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <locale>
#include <map>
#include <set>
#include <string>
#include <windows.h>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string  T_str;
typedef T_str        T_station;
/////////////////////////////////////////////////////////////////////////////////////////
struct  T_time
{
    int  h_;
    int  m_; 
    //-----------------------------------------------------------------------------------
    operator int() const
    {
        return  h_ * 60 + m_;
    }
};
/////////////////////////////////////////////////////////////////////////////////////////
enum  T_start_day
{
    NO_DAYS,
    PN,
    VT,
    SR,
    CHT,
    PT,
    SB,
    VS    
};
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::set<T_start_day>  T_start_days;
/////////////////////////////////////////////////////////////////////////////////////////
struct  T_train_data
{
    T_station     station_finish_;
    T_time        time_start_;
    T_start_days  start_days_;
    T_time        time_finish_;
    int           places_SV_count_;
    int           places_kupe_count_;
    int           places_plazkart_count_;
    int           places_common_count_;
};
/////////////////////////////////////////////////////////////////////////////////////////
typedef int                                  T_train_ind;
typedef std::map<T_train_ind, T_train_data>  T_trains_map;
typedef std::set<T_train_ind>                T_train_indexes_set;
/////////////////////////////////////////////////////////////////////////////////////////
T_str  from_DOS(T_str  DOS_string)
{    
    char buf[1000000];   
    OemToCharA(DOS_string.c_str(), buf);
    return buf;
}
/////////////////////////////////////////////////////////////////////////////////////////
std::ostream&  operator<<
    (
        std::ostream&  os,  
        const T_time&  time
    )
{
    os << std::setw(2)
       << std::setfill('0')
       << time.h_
       << ':'
       << std::setw(2)
       << std::setfill('0')
       << time.m_;
    return os;
}
/////////////////////////////////////////////////////////////////////////////////////////
void  input_time(T_time&  time)
{
    const int HOUR_MAX_COUNT  = 23;
    const int MIN_MAX_COUNT   = 59;
    do 
    {
        std::cout << '\t'
                  << '\t'
                  << "часы   : ";
        
        std::cin >> time.h_;    
    }while(   time.h_ < 0
           || HOUR_MAX_COUNT < time.h_);
 
    do 
    {
        std::cout << '\t'
                  << '\t'
                  << "минуты : ";
        
        std::cin >> time.m_;    
    }while(   time.m_ < 0
           || MIN_MAX_COUNT < time.m_);
}
/////////////////////////////////////////////////////////////////////////////////////////
T_trains_map::value_type  input_train()
{    
    std::cout << std::endl
              << "Введите номер поезда: ";
    T_train_ind  train_ind = 0;
    std::cin >> train_ind;
    std::cout << "Введите данные поезда № "
              << train_ind
              << ":"
              << std::endl;
 
    T_train_data  train_data;
    std::cout << '\t'
              << "станция назначения: ";
    T_station  DOS_station_finish;
    std::cin >> DOS_station_finish;
    train_data.station_finish_ = from_DOS(DOS_station_finish);
 
    std::cout << '\t'
              << "время отправления:"
              << std::endl;
    input_time(train_data.time_start_);
 
    std::cout << '\t'
              << "дни отправления (" << PN <<" - пн, " << VT <<" - вт, ..., " << VS << " - вс) "
              << NO_DAYS <<" - конец ввода:"
              << std::endl;
 
    int  day_ind = 0;
    for(;;)
    {
        do
        {
            std::cout << '\t'
                      << '\t'
                      << "-> ";
 
            std::cin >> day_ind;       
        }while(   day_ind < NO_DAYS
               || VS < day_ind);
 
        if(day_ind == NO_DAYS)  break;
        train_data.start_days_.insert(static_cast<T_start_day>(day_ind));
    }
 
    std::cout << '\t'
              << "время прибытия:"
              << std::endl;
    input_time(train_data.time_finish_);
 
    std::cout << '\t'
              << "число мест СВ          : ";
    std::cin >> train_data.places_SV_count_;
 
    std::cout << '\t'
              << "число купейных мест    : ";
    std::cin >> train_data.places_kupe_count_;
 
    std::cout << '\t'
              << "число плацкартных мест : ";
    std::cin >> train_data.places_plazkart_count_;
 
    std::cout << '\t'
              << "число общих мест       : ";
    std::cin >> train_data.places_common_count_;
    std::cout << std::endl;
 
    return  std::make_pair(train_ind, train_data);    
}
/////////////////////////////////////////////////////////////////////////////////////////
T_trains_map  input_trains()
{
    std::cout << "Введите количество поездов в расписании: ";
    int  trains_count = 0;
    std::cin >> trains_count;
    T_trains_map  trains_map;
    for(int  i = 0; i < trains_count; ++i)
    {
        std::cout << "Запись № "
                  << i + 1
                  << " из "
                  << trains_count
                  << ":";
        trains_map.insert(input_train());
    }
    return  trains_map;
}
/////////////////////////////////////////////////////////////////////////////////////////
std::ostream&  operator<<
    (
        std::ostream&                    os,  
        const T_trains_map::value_type&  trains_map_elem
    )
{
    os << trains_map_elem.first
       << std::endl
       << trains_map_elem.second.station_finish_
       << std::endl
       << trains_map_elem.second.time_start_.h_
       << std::endl
       << trains_map_elem.second.time_start_.m_
       << std::endl
       << trains_map_elem.second.start_days_.size()
       << std::endl;
    for(T_start_days::const_iterator  start_day_it = trains_map_elem.second.start_days_.begin(); 
        start_day_it != trains_map_elem.second.start_days_.end(); ++start_day_it)
    {
        os << *start_day_it
           << std::endl;
    }
    os << trains_map_elem.second.time_finish_.h_
       << std::endl
       << trains_map_elem.second.time_finish_.m_
       << std::endl
       << trains_map_elem.second.places_SV_count_
       << std::endl
       << trains_map_elem.second.places_kupe_count_
       << std::endl
       << trains_map_elem.second.places_plazkart_count_
       << std::endl
       << trains_map_elem.second.places_common_count_
       << std::endl;
    return  os; 
}
/////////////////////////////////////////////////////////////////////////////////////////
std::ostream&  operator<<(std::ostream& os,  const T_trains_map&  trains_map)
{
    struct  T_print_train_in
    {
        std::ostream&  os_;
        //-------------------------------------------------------------------------------
        T_print_train_in(std::ostream&  os) : os_(os)
        {}
        //-------------------------------------------------------------------------------
        void  operator() (T_trains_map::value_type  trains_map_elem)
        {
            os_ << trains_map_elem;
        }
    };
 
    std::for_each(trains_map.begin(), trains_map.end(), T_print_train_in(os));    
    return os;
}
/////////////////////////////////////////////////////////////////////////////////////////
std::istream&  operator>>
    (
        std::istream&  is,  
        T_trains_map&  trains_map
    )
{
    T_train_ind  train_ind = 0;
    while(is >> train_ind)
    {
        T_train_data  train_data;
        is >> train_data.station_finish_;
        is >> train_data.time_start_.h_;
        is >> train_data.time_start_.m_;
        int  start_days_size = 0;
        is >> start_days_size;
        for(int  i = 0; i < start_days_size; ++i)
        {
            int  day_ind = 0;
            is >> day_ind;
            train_data.start_days_.insert(T_start_day(day_ind));
        }
        is >> train_data.time_finish_.h_;
        is >> train_data.time_finish_.m_;
        is >> train_data.places_SV_count_;
        is >> train_data.places_kupe_count_;
        is >> train_data.places_plazkart_count_;
        is >> train_data.places_common_count_; 
 
        trains_map[train_ind] = train_data;        
    }
    return is;
}
/////////////////////////////////////////////////////////////////////////////////////////
enum  T_menu_item
{
    EXIT,
    GET_TO_STATION,
    GET_T0_STATION_IN_DAY,
    GET_PLACES_IN_TRAIN_WITH_IND,
    GET_IN_FINISH_TIME_INTERVAL,
    FILL_FILE
};
/////////////////////////////////////////////////////////////////////////////////////////
void  check_file
    (
        const std::ios_base&  file,        
        const std::string&    file_name
    )
{
    if(!file) 
    {        
        std::cerr << "Невозможно открыть файл \"" 
                  << file_name 
                  << "\""
                  << std::endl;
        exit(EXIT_FAILURE);
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
char  rus_symb_tolower(char  c)
{
    return  std::tolower(c, std::locale(""));
}
/////////////////////////////////////////////////////////////////////////////////////////
T_str  rus_word_tolower(const T_str&  word)
{
    T_str  res_word;
    std::transform(word.begin(), word.end(), std::back_inserter(res_word), 
                   rus_symb_tolower);
    return  res_word;
}
/////////////////////////////////////////////////////////////////////////////////////////
std::ostream&  operator<<
    (
        std::ostream&               os,  
        const T_train_indexes_set&  train_indexes_set
    )
{
    for(T_train_indexes_set::const_iterator  train_index_it = train_indexes_set.begin();
        train_index_it != train_indexes_set.end(); ++train_index_it)
    {
        std::cout << *train_index_it
                  << std::endl;
    }
    return  os;
}
/////////////////////////////////////////////////////////////////////////////////////////
void  get_to_station(const T_str&  file_name)
{
    std::ifstream  ifile(file_name.c_str());
    check_file(ifile, file_name);
    T_trains_map  trains_map;
    ifile >> trains_map;
 
    std::cout << "Введите станцию назначения: ";
    T_station  DOS_station_finish;
    std::cin >> DOS_station_finish;
    T_station  station_finish = from_DOS(DOS_station_finish);
 
    T_train_indexes_set  train_indexes_set;
    for(T_trains_map::const_iterator  trains_map_elem_it = trains_map.begin(); 
        trains_map_elem_it != trains_map.end(); ++trains_map_elem_it)
    {
        if(rus_word_tolower(trains_map_elem_it->second.station_finish_) 
               == rus_word_tolower(station_finish))
        {
            train_indexes_set.insert(trains_map_elem_it->first);
        }
    }
 
    if(train_indexes_set.empty())
    {
        std::cout << "До станции "
                  << station_finish
                  << " нет поездов."
                  << std::endl;
    }
    else
    {
        std::cout << "До станции "
                  << station_finish
                  << " следуют поезда со следующими номерами: "
                  << std::endl
                  << train_indexes_set
                  << std::endl;
    }  
}
/////////////////////////////////////////////////////////////////////////////////////////
T_str  get_day_str(T_start_day  start_day)
{
    switch(start_day)
    {
    case PN:
        return "понедельник";        
 
    case VT:
        return "вторник"; 
 
    case SR:
        return "среда";        
 
    case CHT:
        return "четверг";        
 
    case PT:
        return "пятница";        
 
    case SB:
        return "суббота";        
 
    case VS:
        return "воскресенье";
 
    default:
        return "";
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
void  get_to_station_in_day(const T_str&  file_name)
{
    std::ifstream  ifile(file_name.c_str());
    check_file(ifile, file_name);
    T_trains_map  trains_map;
    ifile >> trains_map;
 
    std::cout << "Введите станцию назначения: ";
    T_station  DOS_station_finish;
    std::cin >> DOS_station_finish;
    T_station  station_finish = from_DOS(DOS_station_finish);
 
    int  day_ind = 0;
 
    do
    {
        std::cout << "Введите день отправления (" 
                  << PN 
                  << " - пн, " 
                  << VT 
                  << " - вт, ..., " 
                  << VS 
                  << " - вс): "; 
 
        std::cin >> day_ind;       
    }while(   day_ind < PN
           || VS < day_ind);    
    
    T_start_day  start_day = T_start_day(day_ind);
 
    T_train_indexes_set  train_indexes_set;
    for(T_trains_map::const_iterator  trains_map_elem_it = trains_map.begin(); 
        trains_map_elem_it != trains_map.end(); ++trains_map_elem_it)
    {
        if(rus_word_tolower(trains_map_elem_it->second.station_finish_) 
               == rus_word_tolower(station_finish)
           && trains_map_elem_it->second.start_days_.count(start_day))
        {
            train_indexes_set.insert(trains_map_elem_it->first);
        }
    }
 
    if(train_indexes_set.empty())
    {
        std::cout << "До станции "
                  << station_finish
                  << " в день недели "
                  << get_day_str(start_day)
                  << " нет поездов."
                  << std::endl;        
    }
    else
    {
        std::cout << "До станции "
                  << station_finish
                  << " в день недели "
                  << get_day_str(start_day)
                  << " следуют поезда с номерами: "
                  << std::endl
                  << train_indexes_set
                  << std::endl;
    }  
}
/////////////////////////////////////////////////////////////////////////////////////////
void  get_places_in_train_with_ind(const T_str&  file_name)
{
    std::ifstream  ifile(file_name.c_str());
    check_file(ifile, file_name);
    T_trains_map  trains_map;
    ifile >> trains_map;
 
    std::cout << "Введите номер поезда: ";
    T_train_ind  train_ind = 0;
    std::cin >> train_ind;    
    T_trains_map::const_iterator  find_it = trains_map.find(train_ind);
 
    if(find_it == trains_map.end())
    {
        std::cout << "В расписании нет поезда № "
                  << train_ind
                  << "."
                  << std::endl;
    }
    else
    {
        T_train_data  train_data = find_it->second;
        std::cout << "В поезде № "
                  << train_ind
                  << ":"
                  << std::endl
 
                  << '\t'
                  << "мест СВ          : "                                                      
                  << train_data.places_SV_count_
                  << std::endl
 
                  << '\t'
                  << "купейных мест    : "                                                      
                  << train_data.places_kupe_count_
                  << std::endl
 
                  << '\t'
                  << "плацкартных мест : "                                                      
                  << train_data.places_plazkart_count_
                  << std::endl
 
                  << '\t'
                  << "общих мест       : "                                                      
                  << train_data.places_common_count_
                  << std::endl;
    }//if(find_it == trains_map.end())
}
/////////////////////////////////////////////////////////////////////////////////////////
void  get_in_finish_time_interval(const T_str&  file_name)
{
    std::ifstream  ifile(file_name.c_str());
    check_file(ifile, file_name);
    T_trains_map  trains_map;
    ifile >> trains_map;
 
    std::cout << "Введите временной интервал: "
              << std::endl
              << '\t'
              << "начало:"
              << std::endl;
    T_time  time_finish_begin;
    input_time(time_finish_begin);
 
    T_time  time_finish_end;
    do
    {
        std::cout << std::endl
                  << '\t'
                  << "конец: "
                  << std::endl;        
        input_time(time_finish_end);    
    }while(time_finish_end < time_finish_begin);
 
    T_train_indexes_set  train_indexes_set;
    for(T_trains_map::const_iterator  trains_map_elem_it = trains_map.begin(); 
        trains_map_elem_it != trains_map.end(); ++trains_map_elem_it)
    {
        if(   time_finish_begin <= trains_map_elem_it->second.time_finish_
           && trains_map_elem_it->second.time_finish_ <= time_finish_end)
        {            
            train_indexes_set.insert(trains_map_elem_it->first);
        }
    }
 
    if(train_indexes_set.empty())
    {
        std::cout << "Поездов, прибывающих в пункт назначения в интервале от "
                  << time_finish_begin
                  << " до "
                  << time_finish_end
                  << std::endl
                  << "в расписании нет."
                  << std::endl;
    }
    else
    {
        std::cout << "В интервале от "
                  << time_finish_begin
                  << " до "
                  << time_finish_end
                  << " прибывают в пункт назначения поезда с номерами:"
                  << std::endl
                  << train_indexes_set
                  << std::endl;
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
void  fill_file(const T_str&  file_name)
{    
    T_trains_map  trains_map = input_trains();    
    std::ofstream  ofile(file_name.c_str());
    ofile << trains_map
          << std::endl;
    
    std::ifstream  ifile(file_name.c_str());    
    std::cout << "В файл \""
              << file_name
              << "\" записаны следующие данные:"
              << std::endl
              << ifile.rdbuf()
              << std::endl;
}/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    T_str  file_name = "trains.txt";
 
    for(;;)
    {
        std::cout << std::endl
                  << std::endl
                  << std::endl
                  << "Выберите действие:"
                  << std::endl
 
                  << '\t'
                  << EXIT
                  << " - выход;"
                  << std::endl
 
                  << '\t'
                  << GET_TO_STATION
                  << " - поиск поездов по станции назначения;"
                  << std::endl
 
                  << '\t'
                  << GET_T0_STATION_IN_DAY
                  << " - поиск поездов по станции назначения и дню отправления;"
                  << std::endl
 
                  << '\t'
                  << GET_PLACES_IN_TRAIN_WITH_IND
                  << " - получить информацию о наличии мест по номеру поезда;"
                  << std::endl
 
                  << '\t'
                  << GET_IN_FINISH_TIME_INTERVAL
                  << " - поиск поездов по временному интервалу прибытия в пункт назначения;"
                  << std::endl
 
                  << '\t'
                  << FILL_FILE
                  << " - заполнить файл расписания поездов;"
                  << std::endl;
 
        int  menu_item = 0;
        std::cout << std::endl
                  << '\t'
                  << "-> ";
        std::cin >> menu_item;       
        
        switch(T_menu_item(menu_item))
        {
        case GET_TO_STATION:
            get_to_station                (file_name);
            break;
        
        case GET_T0_STATION_IN_DAY:
            get_to_station_in_day         (file_name);
            break;
        
        case GET_PLACES_IN_TRAIN_WITH_IND:
            get_places_in_train_with_ind  (file_name);
            break;
        
        case GET_IN_FINISH_TIME_INTERVAL:
            get_in_finish_time_interval   (file_name);
            break;
        
        case FILL_FILE:
            fill_file                     (file_name);
            break;        
 
        default:
            exit(0);
        }//switch(T_menu_item(menu_item))        
    }//for
}