Помогите решить плз задачку с исп. структур и файлов на C++

Тема в разделе "C/C++/C#", создана пользователем Stilus, 13 июн 2010.

  1. Stilus

    Stilus Гость

    Уважаемые программисты!Прошу помощи с решением задачи на С++.Сам никак не могу составить!Всю голову сломал уже.
    Программирование с использованием структур и файлов.
    Записи должны выводиться на экран в виде отформатированной таблицы. Программа должна содержать меню.

    Описать структуру с именем MARSH, содержащую следующие поля:
    1)название начального пункта маршрута;
    2)название конечного пункта маршрута;
    3)номер маршрута.
    Написать программу, выполняющую следующие действия:
    4)ввод с клавиатуры данных в массив, состоящий из восьми элементов типа MARSH;
    5)записи должны упорядочиваться по номерам маршрутов;
    6)вывод на экран информации о маршруте, номер которого введен с клавиатуры;
    7)если таких маршрутов нет, выдать на дисплей соответствующее сообщение.
     
  2. patriot2008

    patriot2008 Гость

    готов взяться. Пишите на washington2006[at]rambler.ru . Договоримся ))
     
  3. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Код (C++):
    #include <iostream>
    #include <limits.h> //для INT_MAX
    #include <iomanip> //для setw()
    #include <fstream> //для файлового ввода/вывода

    using namespace std;

    //Структура Маршрута
    struct MARSH
    {
    char NameStart [16]; //Начальный пункт маршрута
    char NameEnd [16]; //Конечный пункт маршрута
    int Number; // Номер маршрута
    };

    int Count = 0; //Введеное кол-во маршрутов
    const int MaxEl = 8; //Размерность массива
    MARSH El[MaxEl]; // Массив элементов

    //Функция вывода меню
    char ShowMenu (void)
    {
    cout<<
    "-----------------------"<<endl<<
    "        MENU        "<<endl<<
    "-----------------------"<<endl<<
    "<1> - Input Marshrut"<<endl<<
    "<2> - Print All Marshrut"<<endl<<
    "<3> - Print Marshrut of Number"<<endl<<
    "<4> - Quit"<<endl<<endl<<
    "<5> - Save To File"<<endl<<
    "<6> - Load From File"<<endl;

    cout<<": ";

    return getchar(); //Ожидаем ввода
    };

    //Функция Добавление элемента
    bool Add()
    {
    MARSH Temp; //Временная переменная структуры
    cin.sync(); //Синхронизируем входной поток (В нем скорее всего необработаная эскейп-последовательность
    //или код ентера
    cout<<endl<< //Рисуем шапка
    "----------------------------------------"<<endl<<
    "         Input new Marshrut"<<endl<<
    "----------------------------------------"<<endl;
    cout<<"Enter Start Marshrut: "; //Вводим начало маршрута
    cin.getline(Temp.NameStart,16);

    cout<<"Enter End Marshrut: "; //Водим конец маршрута
    cin.getline(Temp.NameEnd,16);

    cout<<"Enter Number (#) Marshrut: "; //Вводи номер маршрута
    cin>>Temp.Number;
    cout<<endl;

    if (Count < MaxEl) //Проверяем что бы массив был не переполнен (Условие задачи [8])
    {
    El[Count] = Temp; //Помещяем элемент в массив
    Count ++; //Интерементируем кол-во элементов
    } else { //Если переполнение
    cout<<endl<<"False :Massive is FULL"<<endl;
    cin.sync();
    return false;
    }

    cin.sync();
    return true;
    }

    //Функция сортивовки Массива элементов
    void Sort (void)
    {
    for (int i = 0; i< Count; i++)
    {
    int Min = INT_MAX; //Максимальное значение Int
    int minPos = -1; //Позиция с минимальным элементом
    for (int j=i; j<Count;j++) //Перебираем
    {
    if (El[j].Number<Min)//Ищим наименьший элемент
    {
    Min = El[j].Number;
    minPos = j;
    }
    MARSH Temp; //Меняем местами по-возрастанию Ном. маршрута элементы
    Temp = El[i];
    El[i] = El[minPos];
    El[minPos] = Temp;
    }
    }
    }

    //Функция вывода Элементов Массива (Всех
    void Print(void)
    {
    //Рисуем шапку setw(int) длина поля для вывода
    cout<<setw(3)<<"  "<<setw(6)<<"#     "<<setw(17)<<"Start Marshrut  "<<setw(17)<<"End Marshrut  "<<endl<<
    "------------------------------------------"<<endl;
    cout.setf(ios::left);
    //Обходим массив элементов и печатаем все
    for (int i=0; i < Count; i++)
    {
    cout<<setw(3)<<i+1<<setw(6)<<El[i].Number<<setw(17)<<El[i].NameStart<<setw(17)<<El[i].NameEnd<<endl;
    }
    cout.unsetf(ios::left);
    cout<<"------------------------------------------"<<endl<<endl;

    cin.sync(); //синхронизация потока и задержка
    cin.get();
    }

    //Функции проверки маршрута по его номеру и вывод его на экран
    void PrintOfNumMars(void)
    {
    int NumMarsh; // Номер маршрута
    cin.sync();
    cout<<endl<<"Input No Marshruta : ";
    cin>>NumMarsh; //Получаем номер маршрута
    cout<<endl;
    //Обходим весь цикл элементов
    for (int i=0; i < Count; i++)
    {
    //Пытаемся найти требуемый номер маршрута
    //если нашли отрисовываем шапку выводим элемент и выходи return ом из функции
    if (El[i].Number == NumMarsh)
    {
    cout<<setw(3)<<"  "<<setw(6)<<"#     "<<setw(17)<<"Start Marshrut  "<<setw(17)<<"End Marshrut  "<<endl<<
    "------------------------------------------"<<endl;
    cout<<setw(3)<<i+1<<setw(6)<<El[i].Number<<setw(17)<<El[i].NameStart<<setw(17)<<El[i].NameEnd<<endl;

    cin.sync(); //синхронизация потока и задержка
    cin.get();
    return;
    }
    }
    //Если не нашли элемента с треб. номером пишим что ничего не вышло :-)
    cout<<"Marshrut "<<NumMarsh<<" NOT FOUND"<<endl;

    cin.sync(); //синхронизация потока и задержка
    cin.get();
    }

    //Функция сохранения массива элементов в файл
    void SaveToFile(void)
    {
    char filename[256]; //Имя файла
    cout<<endl<<"Input Filename to Save Date : ";
    cin.sync();
    cin.get(filename,256); //Вводим имя файла

    ofstream OutFile(filename,ios::binary); //Определяем выходной поток и делаем его бинарным
    for (int i=0; i < Count; i++)
    {
    OutFile.write(reinterpret_cast<char*>(&El[i]),sizeof(El[i])); //Пишим элементы в файл
    }
    OutFile.close(); //Закрываем файл
    }

    //Функция загрузки массива из файла
    void LoadFromFile(void)
    {
    char filename[256]; //Имя файла
    cout<<endl<<"Input Filename to Load Date : ";
    cin.sync();
    cin.get(filename,256); //Получение имени файла

    ifstream InFile(filename,ios::binary); //Определение входного потока как бинарного
    Count = 0;
    InFile.read(reinterpret_cast<char*>(&El[Count]),sizeof(El[Count])); //Читаем первый элемент из файла
    while (!InFile.eof()) // Пока не конец файла читаем остальные элементы
    {
    InFile.read(reinterpret_cast<char*>(&El[Count]),sizeof(El[Count]));
    Count++;
    }

    InFile.close(); //Закрываем файл
    }

    //Входная функция программы
    int main (void)
    {
    char ch=0;
    while (ch !='4') //Пока не введено '4' - ВЫХОД, то повторять меню
    {
    cin.sync();
    ch = ShowMenu();
    switch (ch)
    {
    case '1': Add();Sort();break;
    case '2': Print();break;
    case '3': PrintOfNumMars();break;
    case '5': SaveToFile();break;
    case '6': LoadFromFile();break;
    }
    }
    return 0;
    }
     
  4. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    ))) Почти))) Новые топы только трогать не буду)
     
  5. romanriddick

    romanriddick Гость

  6. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Так чисто прочитал, сразу вспомнилась Теория Принятия Решений (ТПР) из универа...
    Если поднять теорию по ТПР, то вообще влет решаются, ну а так если самому алгоримтм писать, довольно интересно, но наверное громозко...
     
  7. romanriddick

    romanriddick Гость

    да , прога из СППР (ТПР) ее можно зделать в екселе , но ето будет не прога)))...
    я тогда зделал ее макросамми , но ограничения были только на <=,=, так как большего и не надо было делать...)))

    меня очень заинтересовала как ее зделать в билдере при разных ограничениях <=,>=,=... толкового алгоритма так и не нашел, может у когото есть ???

    да , и еще может кто нить имеет алгоритм Гомори или "ветвей и границ (1,2)?" Вот с ними вопше не понятно что делать)))

    П.С.: писал такую прогу на курсовую (на билдере) , решение заняло 60 листов А4 и делало не все...
    решения макросами занимало около 30 ст , но производительность падала в разы и иногда вылетало ...
    тоесть макросы для Гомори и "ветвей" точно не подойдет, а вот на билдере было б интересно зделать , тем более аналогов такой проги не будет (развечто ексель и матлаб)))
     
  8. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Тоже писал такую прогу как курсовую, но решение было не больше чем 4xA4 (12 шрифт), из них половина интерфейс.
    Домой приду гляну, должна где то сохраненая быть...
    Там смысл такой, хоть смутно помню:
    Ввод кол-ва аргументов и функций на базе этого, размерность грида находилась [Кол-во арг + Ячейка Знака + значение фу-нции][Кол-во ф-ий]
    Все знаки которые были > или >=, менялись на < и <= с домножением само собой аргументов и знач. функции на -1.
     
  9. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    О условиях (неравенставах) задачи линейного программирования.
    Для дальнейшего построения системы линейных уровнений и нахождения максимума или минимума целевой функции(оптимальности)...
    согласно принципу симплекс-метода

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

    неравенства приводятся к системе линейных уровнений, расчитываются аргументы
    Ну это так не читая... что помню...
    на графике решение хорошо находятся...
     
  10. romanriddick

    romanriddick Гость

    на графике можно розвязывать только 2хн или нх2 уравнения, ет просто делаетса и на графике и просто перебором чисел...
    а от знаки не всегда меняютса домножением, иногда в индексном столпце выходит отрицательное число , а такое делать сымплексом нельзя (делаетса двоичным симплекс методом) или зводитса методом x-mz где m очень большое число ... ето я в екселе реализовал ...

    >>Тоже писал такую прогу как курсовую, но решение было не больше чем 4xA4 (12 шрифт), из них половина

    хотел бы я взгленуть на алгоритм по которому вы ето делали , знаю что можно дзделать коротче чем я зделал , но как я уже казал , алгоритма нет)))


    >>Ввод кол-ва аргументов и функций на базе этого, размерность грида находилась [Кол-во арг + Ячейка Знака + значение фу-нции][Кол-во ф-ий]

    тоже делал гридами [Кол-во арг + Ячейка Знака + значение фу-нции] + целевая функцыя
    зделал зведения к канонической форме (может етого и не нужно, просто для наглядности)
     
Загрузка...
Похожие Темы - Помогите решить плз
  1. mrx13
    Ответов:
    8
    Просмотров:
    257
  2. kuklofon
    Ответов:
    9
    Просмотров:
    573
  3. GREED
    Ответов:
    1
    Просмотров:
    532
  4. vovanabali
    Ответов:
    0
    Просмотров:
    531
  5. zarina
    Ответов:
    0
    Просмотров:
    672

Поделиться этой страницей