• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы Stilus
  • Дата начала
S

Stilus

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

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

DarkKnight

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;
}
 
D

DarkKnight

Так чисто прочитал, сразу вспомнилась Теория Принятия Решений (ТПР) из универа...
Если поднять теорию по ТПР, то вообще влет решаются, ну а так если самому алгоримтм писать, довольно интересно, но наверное громозко...
 
R

romanriddick

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

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

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

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

DarkKnight

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

DarkKnight

О условиях (неравенставах) задачи линейного программирования.
Для дальнейшего построения системы линейных уровнений и нахождения максимума или минимума целевой функции(оптимальности)...
согласно принципу симплекс-метода

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

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

romanriddick

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

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

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


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

тоже делал гридами [Кол-во арг + Ячейка Знака + значение фу-нции] + целевая функцыя
зделал зведения к канонической форме (может етого и не нужно, просто для наглядности)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!