Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Бинарные файлы.(Продолжение) 
V
    Опции темы
ioManip
  Дата 22.11.2013, 06:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



Все привет! Снова я со своими файлами! Вот эта та самая тема Начало темы. Я думаю уже всеми забытая.

Кратко условие: Дан бин.файл с точками на плоскости. Найти равноудаленные точки от зад. с клавиатуры точки.

Ребят все ни как не получается, сделать эту задачу. Вот что на данный момент имеется:
Код

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.x1 = (rand() % 25) * 0.1;
       point.y1 = (rand() % 25) * 0.1;
       point.x2 = (rand() % 25) * 0.1;
       point.y2 = (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.x1 << ";" << point.y1 << " |-| "; 
        cout << point.x2 << ";" << point.y1 << " |-| ";
        
        if ( sqrt((point.x2 - point.x1) * (point.x2 - point.x1) + 
                  (point.y2 - point.y1) * (point.y2 - point.y1)) == myN )
            
        cout << " Равноудаленные точки: " << point.x1 << point.y1 << point.x2 << point.y2 << endl;
    }
    
    binFile.close();
}


Скажите, пожалуйста, в верном ли направлении я иду?(Есть стойкое ощущение, что логика программы неправильная)

Это сообщение отредактировал(а) ioManip - 22.11.2013, 06:34
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
baldina
Дата 22.11.2013, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



сортируешь точки. критерий - расстояние от заданной. далее последовательно просматриваешь, точки с одинаковыми расстояниями являются равноудаленными.
в зависимости от размера файла можно сортировать в памяти, либо потребуется внешняя сортировка.
расстояние полностью вычислять необязательно, достаточно сравнивать квадраты расстояний
PM MAIL   Вверх
baldina
Дата 22.11.2013, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(ioManip @  22.11.2013,  06:33 Найти цитируемый пост)
float n; // количество чисел в файле

у вас число точек не целое?  smile 

Цитата(ioManip @  22.11.2013,  06:33 Найти цитируемый пост)
float myN; // число вводимое с клавиатуры

вроде бы речь шла о точке?
PM MAIL   Вверх
feodorv
Дата 22.11.2013, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(ioManip @  22.11.2013,  07:33 Найти цитируемый пост)
        cout << point.x2 << ";" << point.y1 << " |-| ";

Копипаст в действии)))


Цитата(ioManip @  22.11.2013,  07:33 Найти цитируемый пост)
       if ( sqrt((point.x2 - point.x1) * (point.x2 - point.x1) + 
                  (point.y2 - point.y1) * (point.y2 - point.y1)) == myN )

Вы действительно именно так собрались сравнивать числа с плавающей точкой?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
ioManip
Дата 22.11.2013, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



baldina, Попробую!

feodorv, 
Цитата(feodorv @  22.11.2013,  13:28 Найти цитируемый пост)
Вы действительно именно так собрались сравнивать числа с плавающей точкой?

В самом начале темы, bsa писал, что нужно находить расстояние между точками и сравнивать с введенной точкой. Я как понял, так и написал.

P.S. Ну видимо, bsa немного другое имел ввиду. 

--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
bsa
Дата 22.11.2013, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



ioManip, скорее всего я имел в виду нечеткое сравнение (больше/меньше). Я никогда бы не предложил четкое равенство для чисел с плавающей точкой.
PM   Вверх
ioManip
Дата 24.11.2013, 06:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



Пытаюсь найти расстояние, вот так:
Код

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();
}


Но происходит зацикливание! Но если убрать  file.seekg(0, fstream::beg); то все хорошо, только в результате ничего не выводит!
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
ioManip
Дата 25.11.2013, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



Ребят, врое проблему с зацикливанием решил, оставив лишь это:
Код

for(int i = 0; i < n; i++)
    {
          d = sqrt( (myPoint.x - PointWithKeyBoard.x) * (myPoint.x - PointWithKeyBoard.x) + 
                    (myPoint.y - PointWithKeyBoard.y) * (myPoint.y - PointWithKeyBoard.y)   );
          cout << d << endl;
    }

Но сейчас другая возникла, каждый раз при подсчете d, переменной myPoint присваивается лишь последнее значение, т.е.
если точки (2,4) (4,5) (3,8) , то берется только последняя точка.
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
feodorv
Дата 25.11.2013, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(ioManip @  25.11.2013,  10:16 Найти цитируемый пост)
переменной myPoint присваивается лишь последнее значение

myPoint не меняется в цикле smile А должна...

Добавлено через 4 минуты и 40 секунд
Цитата(ioManip @  25.11.2013,  10:16 Найти цитируемый пост)
если точки (2,4) (4,5) (3,8)

При таких точках нет никакой необходимости во float. Необходимо тупо ограничиться целыми числами, тогда и сравнивать напрямую можно. А сравнивать не расстояние, а, как мудро посоветовал baldina:
Цитата(baldina @  22.11.2013,  11:33 Найти цитируемый пост)
достаточно сравнивать квадраты расстояний




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
ioManip
Дата 27.11.2013, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



Привет! Смотрите что получилось:
Код

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;
    
    int arrayofDistance[n];
    
    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)   );

        arrayofDistance[n] = d;
        cout << arrayofDistance[n] << endl;
    }
   
      
    file.close();
}


Мне удалось найти расстояния, и "положить" их в массив(пока не знаю зачем). А что дальше? Сравнивать расстояния между собой? И те которые равны, и будут равноудаленными?

Это сообщение отредактировал(а) ioManip - 27.11.2013, 10:35
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
feodorv
Дата 27.11.2013, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(ioManip @  27.11.2013,  11:33 Найти цитируемый пост)
sqrt

совершенно лишняя!!! Какая разница с точки зрения сравнения - сравнивать расстояния или квадраты расстояний? А вот с точки зрения программирования здесь пропасть: первое - float, второе - int. (Это ещё если промолчать, что потом инту присваивается флоат).

Цитата(ioManip @  27.11.2013,  11:33 Найти цитируемый пост)
И те которые равны, и будут равноудаленными?

Да! Но тут тоже нужна аккуратность...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
baldina
Дата 27.11.2013, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



ioManip,
Цитата(baldina @  22.11.2013,  10:33 Найти цитируемый пост)
сортируешь точки. критерий - расстояние от заданной. далее последовательно просматриваешь, точки с одинаковыми расстояниями являются равноудаленными.
в зависимости от размера файла можно сортировать в памяти, либо потребуется внешняя сортировка.
расстояние полностью вычислять необязательно, достаточно сравнивать квадраты расстояний 


Цитата(ioManip @  27.11.2013,  10:33 Найти цитируемый пост)
 int n;      //количество точек в файле

Цитата(ioManip @  27.11.2013,  10:33 Найти цитируемый пост)
for(int i = 1; i < n; i++)

у тебя точек n-1

Добавлено через 2 минуты и 13 секунд
Цитата(ioManip @  27.11.2013,  10:33 Найти цитируемый пост)
Мне удалось найти расстояния, и "положить" их в массив

я бы сказал "в одну и ту же ячейку памяти за границей массива":
Цитата(ioManip @  27.11.2013,  10:33 Найти цитируемый пост)
arrayofDistance[n] = d;

будь внимательнее

Добавлено через 4 минуты и 25 секунд
вообще традиционно счетчик в цикле изменяют от 0. это связано с индексацией: первая ячейка имеет смещение 0.
поэтому цикл обычно выглядит как
Код

for (size_t i=0; i != n; ++i) {
}

PM MAIL   Вверх
ioManip
Дата 1.12.2013, 05:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



И снова, Hello! Я к Вам с таким вопросом, сравнение квадратов расстояний мы должны производить в цикле while ?
Код

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;
    
    int arrayofDistance[n];
    
    cout << "Введите точку с клавиатуры: ";
    cin >> PointWithKeyBoard.x >> PointWithKeyBoard.y;
    cout << "Введеная точка: " << "(" << PointWithKeyBoard.x << "," << PointWithKeyBoard.y << ")" << endl;
    
    for(int i = 0; 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 = ( (myPoint.x - PointWithKeyBoard.x) * (myPoint.x - PointWithKeyBoard.x) + 
              (myPoint.y - PointWithKeyBoard.y) * (myPoint.y - PointWithKeyBoard.y)  );

        arrayofDistance[n] = d;
        cout << arrayofDistance[n] << endl;
    }  
    
    for(int i = 0; i < n; i++)
       {
          for(int j = i + 1; j < n; j++)
             {
                if (arrayofDistance[i] == arrayofDistance[j])
                {
                     cout << endl;
                     cout << "(" << myPoint.x << "," << myPoint.y << ")";
                }
             }
       }
       file.close();
}


Если использовать код выше, то он не во всех случаях корректно работает. Но если же отрывок нахождения расстояний перенести в цикл, то ....вообще беда smile
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
feodorv
Дата 1.12.2013, 06:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Так. Опять двадцать пять)))
Цитата(ioManip @  1.12.2013,  06:23 Найти цитируемый пост)
        arrayofDistance[n] = d;
        cout << arrayofDistance[n] << endl;

Цитата(baldina @  27.11.2013,  17:15 Найти цитируемый пост)
я бы сказал "в одну и ту же ячейку памяти за границей массива"


Добавлено через 53 секунды
Цитата(ioManip @  1.12.2013,  06:23 Найти цитируемый пост)
он не во всех случаях корректно работает

Шо, бывает, что работает корректно?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
ioManip
Дата 1.12.2013, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



feodorv, Не могу понять Вас. 
Вот так будет верно?
Код

for(int i = 0; i !=n; i++)
{
     arrayofDistance[i] = d;
     cout << arrayofDistance[i] << endl;
}

--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0589 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.