Нужно поместить входной файл fstream в формат, который я могу зациклить и расшифровать - PullRequest
1 голос
/ 28 ноября 2011

У меня будет файл данных, который будет составлен следующим образом.Первая строка будет количеством строк в файле [N] Следующая строка и каждая последующая строка будет иметь три значения.Если значение три >0, то эта позиция является треугольником.Если значения два и три равны <0, то эта позиция представляет собой круг.Если только значение три <0, то эта позиция является прямоугольником.

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

вот код, который я написал до сих пор.

#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

// MAIN
int main(void)
{
    int N=0;
    ifstream Hinfo;
    // ........................................................
    Hinfo.open("Holes");
    if (Hinfo.fail())
    { 
        cerr << "Error:  open input file error" << endl;
        exit(-1);
    } 
    else
        cout << "Success:  input files opened" << endl;
    // ........................................................
    Hinfo >> N;
    float A[N];
    float B[N];
    float C[N];
    float Rec[];
    float Cir[];
    float Tri[];
    // ........................................................
    for(int i=0; i<N; i++)
        Hinfo >> A[i] >> B[i] >> C[i];
    Hinfo.close();
}

Я действительно не знаю, что делать дальше, или если то, что я сделал до сих пор, - правильный путь.

далее я думал об этом, чтобы найти прямоугольники, треугольники и круги.

for (i=0; i<N; i++)
{
    if (C[i] < 0)
    {
        if (B[i] < 0)
            A[i] >> B[i] >> C[i] >> Circle[];
        else 
            A[i] >> B[i] >> C[i] >> Rectangle[];
    }
    else
        A[i] >> B[i] >> C[i] >> Triangle[];
}

Смогу ли я сделать это?Пожалуйста, помогите, мне трудно управлять всеми этими массивами.Есть ли более простой способ разделить все эти данные на массивы треугольников, кругов и прямоугольников?Имейте в виду, что я новичок, поэтому сложный или продвинутый синтаксис может запутать мой хрупкий ум n00b

Спасибо, Люк.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2011

Что я хотел бы сделать, это написать структуру для хранения одной записи данных, вероятно, так:

const int TRIANGLE = 1;
const int CIRCLE   = 2;
const int RECTANGLE = 3;
struct Entry
{
    float points[3];
    int type;
};

Таким образом, каждый раз, когда вы читаете строку значений, вы можете поместить их в новуюВведите и установите тип соответственно.Тогда вам нужен только один массив или вектор для хранения записей.Или вы можете создать массив / вектор для каждого типа записи.

std::vector<Entry> Entries;
for(int i=0; i<N; i++)
{
    Entry e;
    Hinfo >> e.points[0] >> e.points[1] >> e.points[2];
    if( e.points[2] > 0 )
        e.type = TRIANGLE;
    else if( e.points[2]<0 && e.points[1]<0)
        e.type = CIRCLE;
    else if( e.points[2]<0 && e.points[1]>=0 && e.points[0]>=0)
        e.type = RECTANGLE;
    Entries.push_back(e);
}

Что-то вроде этих строк должно сделать это.

0 голосов
/ 28 ноября 2011

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

Таким образом, вам не нужны отдельные массивы для каждого из трех типов фигур.

float A[N];
float B[N];
float C[N];
int type[N];

const int Triangle = 0;
const int Circle = 1;
const int Rectangle = 2;

Затем вы можете выполнить цикл, чтобы найти типы

for (i=0; i<N; i++)
{
    if (C[i] < 0)
    {
        if (B[i] < 0)
            type[i] = Circle;
        else 
            type[i] = Rectangle;
    }
    else
        type[i] = Triangle;
}

ЗатемВы можете снова просмотреть циклы:

for (i=0; i<N; i++)
{
   if (type[i] == Triangle)
   {
        // I am a triangle;
   }

   else if ...   
}

Конечно, вам даже не нужен второй цикл, но если ваш учитель этого захочет, это будет один из способов сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...