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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2013, 06:53   #1
Mix_me
 
Регистрация: 24.05.2013
Сообщений: 7
Вопрос Бинарные файлы( равноудаленные точки )

Привет!
Есть задачка: В бинарном файле задано множество точек на плоскости. Найти из данного множества равноудаленные точки от заданной с клавиатуры точки.

Код:
void CreateFile()
{
    Point point; //структура
    
    fstream binFile("file", fstream::in | fstream::out | fstream::trunc | fstream::binary);
    
    float n; // количество чисел в файле
    float myN; // число вводимое с клавиатуры
    
    srand(time(NULL));
    
    cout << "Сколько чисел записать в файл?" << endl;
    cout << "-> ";
    cin >> n; 
    
    cout << "Введите число: ";
    cin >> myN;
   
    for (int i = 0; i < n; i++)
    {
       point.x = (rand() % 25) * 0.1;
       point.y = (rand() % 25) * 0.1;
       binFile.write((const char*) &point, sizeof(point));
    }
     
    binFile.seekg(0, fstream::beg);
    while(!binFile.eof())
    {
        binFile.read((char*) &point, sizeof(point));
        
        cout << point.x << ";" << point.y << " |-| "; 
        
        if ( sqrt((point.x - point.y) * (point.x - point.y) + 
                  (point.x - point.y) * (point.x - point.y)) == myN )
            
        cout << " Равноудаленные точки: " << point.x << point.y << endl;
    }
    
    binFile.close();
}
Вот что у меня получилось, вопрос в том верно ли я нахожу эти раноудаленные точки?
Если нет, то укажите направление
Mix_me вне форума Ответить с цитированием
Старый 17.11.2013, 11:05   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
if ( sqrt((point.x - point.y) * (point.x - point.y) +
(point.x - point.y) * (point.x - point.y)) == myN )
sqrt( (x-y)^2 + (x-y)^2 ) - Только меня одного эта формула смущает?
Цитата:
укажите направление
Тебе нужно создать массив точке, потом в него считать весь файл. Поскольку у тебя структура файла известна, то размер массива будет FileSize/sizeof(Point);

А дальше уже проходишь перебором по всем точкам (предположительно перебор как в сортировке пузырьком можно взять) и сравниваешь их длины от твоей точки
Т.е.
Код:
bool dist(Point my,Point p1,Point p2){
 return
  sqrt(sqr(my.x-p1.x)+sqr(my.y-p1.y))
  =
  sqrt(sqr(my.x-p2.x)+sqr(my.y-p2.y))
}
Вот это, я думаю и будет нормальным решением задачи.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.11.2013, 07:37   #3
Mix_me
 
Регистрация: 24.05.2013
Сообщений: 7
По умолчанию

Немного переписал. Ну вот смотрите пытаюсь вот так делать:
Код:
void CreateFile()
{
    Point myPoint;
    Point PointWithKeyBoard;
    
    fstream file("file", fstream::in | fstream::out | fstream::trunc | fstream::binary);
    
    int n;  //количество точек в файле
    
    srand(time(NULL));
    
    cout << "Введите количество точек в файле: ";
    cin >> n;
    
    for(int i = 1; i < n; i++)
    {
        myPoint.x = (rand() % 10) * 0.5;
        myPoint.y = (rand() % 10) * 0.5;
        
        file.write((const char*) &myPoint, sizeof(myPoint));  
    }
    
    file.seekg(0, fstream::beg);
    while(!file.eof())
    {
        file.read((char*) &myPoint, sizeof(myPoint));
        cout << "(" << myPoint.x << "," << myPoint.y << ")" << " ";
    }
    
    cout << endl << endl;
    cout << "Введите точку с клавиатуры: ";
    cin >> PointWithKeyBoard.x >> PointWithKeyBoard.y;
    cout << "Введеная точка: " << "(" << PointWithKeyBoard.x << "," << PointWithKeyBoard.y << ")";
  
    int d = 0; //расстояние
    file.seekg(0, fstream::beg);
    while(!file.eof())
    {
        file.read((char*) &myPoint, sizeof(myPoint));
        
        for(int i = 1; i < n; i++)
        {
                d = sqrt( (myPoint.x - PointWithKeyBoard.x) * (myPoint.x - PointWithKeyBoard.x) + 
                                (myPoint.y - PointWithKeyBoard.y) * (myPoint.y - PointWithKeyBoard.y)   );
                cout << d;
        }
    }
      
    file.close();
}
При выч. d программа зацикливается.
Mix_me вне форума Ответить с цитированием
Старый 25.11.2013, 13:46   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
for(int i = 1; i < n; i++)
Что это и зачем оно здесь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.11.2013, 09:50   #5
Mix_me
 
Регистрация: 24.05.2013
Сообщений: 7
По умолчанию

Ну как же, для того чтобы найти расстояние для всех точек
Mix_me вне форума Ответить с цитированием
Старый 26.11.2013, 13:01   #6
Mix_me
 
Регистрация: 24.05.2013
Сообщений: 7
По умолчанию

Вроде проблема решена(с поиском расстояний)
Вот:
Код:
void CreateFile()
{
    Point myPoint;
    Point PointWithKeyBoard;
    
    fstream file("file", fstream::in | fstream::out | fstream::trunc | fstream::binary);
    
    int n;      //количество точек в файле
    int d = 0; //расстояние
    
    srand(time(NULL));
    
    cout << "Введите количество точек в файле: ";
    cin >> n;
    
    cout << endl;
    cout << "Введите точку с клавиатуры: ";
    cin >> PointWithKeyBoard.x >> PointWithKeyBoard.y;
    cout << "Введеная точка: " << "(" << PointWithKeyBoard.x << "," << PointWithKeyBoard.y << ")" << endl;
    
    for(int i = 1; i < n; i++)
    {
        myPoint.x = rand() % 10;
        myPoint.y = rand() % 10;
        
        file.write((const char*) &myPoint, sizeof(myPoint));  
    }

    file.seekg(0, fstream::beg);
    while(!file.eof())
    {
        file.read((char*) &myPoint, sizeof(myPoint));
        
        cout << "(" << myPoint.x << "," << myPoint.y << ")" << " ";
        
        d = sqrt( (myPoint.x - PointWithKeyBoard.x) * (myPoint.x - PointWithKeyBoard.x) + 
                  (myPoint.y - PointWithKeyBoard.y) * (myPoint.y - PointWithKeyBoard.y)   );
        cout << d << endl;
    }
   
      
    file.close();
}
А дальше? У нас есть расстояния, таак, теперь их нужно сравнивать между собой так? И если расстояния равны, то это как раз равноудаленные точки, верно же?
Mix_me вне форума Ответить с цитированием
Старый 26.11.2013, 13:03   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Ну как же, для того чтобы найти расстояние для всех точек
Так у тебя их еще нет )
Ты их еще не считал.
Смотри:
Цитата:
while(!file.eof())
{
file.read((char*) &myPoint, sizeof(myPoint));
Это цикл, который... что делает? Считывает одну точку. И после него ты сразу хочешь проверять все?
Тебе нужно сначала их считать, или выкинуть цикл.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.11.2013, 11:14   #8
Mix_me
 
Регистрация: 24.05.2013
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Считывает одну точку.
Так...почему это 1?
Смотрите в последнем моем посте, есть код, так вот результат его работы:
Код:
Введите количество точек в файле: 5
Введите точку с клавиатуры: 5 6  
Введеная точка: (5,6)
(9,5) 4
(0,5) 5
(6,0) 6
(8,1) 5
(8,1) 5
Если не учитывать во внимание дробную часть, то все же верно!
Mix_me вне форума Ответить с цитированием
Старый 27.11.2013, 13:02   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
в последнем моем посте
Когда я писал свое сообщение его еще не было )
Теперь ты поправил ситуацию - дело стало лучше.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бинарные файлы (C/Си) dmitryi98 Помощь студентам 6 15.08.2012 08:01
Равноудаленные точки от центра окружности MeTeOpA Помощь студентам 3 19.07.2012 19:49
Бинарные файлы с++ Killspamers Помощь студентам 0 01.03.2012 14:04
Бинарные файлы VorobeY1326 Общие вопросы C/C++ 12 09.05.2009 21:00
С++ Бинарные файлы EwwwA Общие вопросы C/C++ 0 20.04.2009 17:32