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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прокомментируйте код, пожалуйста 
:(
    Опции темы
xTr1m
Дата 29.3.2013, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Доброго времени суток. Решил отправить тестовое задание в яндекс, для собственной проверки. Задания вроде были не очень сложные, но получил отказ. Если можно, то хотел бы отдать кому-нибудь код "на проверку", чтобы сказали, что не так. Сюда, наверное, выкладывать не буду, могу отослать на почту или в личку. Заранее спасибо.
PM MAIL WWW ICQ   Вверх
Alca
Дата 29.3.2013, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Чего? выкладывай


--------------------
PM WWW ICQ Skype Jabber   Вверх
xTr1m
Дата 29.3.2013, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ладно, прикреплю как файл

Присоединённый файл ( Кол-во скачиваний: 20 )
Присоединённый файл  задание_яндекс.rar 1,04 Kb
PM MAIL WWW ICQ   Вверх
Guinness
Дата 29.3.2013, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Второе задание, я думаю они хотели примерно этого. Или если QString как контейнер не катит, то запихивать в массив char.
Код

#include <QCoreApplication>

#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    const quint32 mask = 0xFF;

    quint32 ip = 0x12AAEA3F;
    quint32 val = 0;
    QString ip_address;

    for(int i = 3; i >= 0; i--){
        val = (ip >> i*8) & mask;
        ip_address.append(QString("%1%2").arg(val).arg(i==0 ? "" : "."));
    }

    qDebug() << ip_address;

    
    return a.exec();
}

PM MAIL   Вверх
Alca
Дата 29.3.2013, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



xTr1m, это, что все задания, не верю


--------------------
PM WWW ICQ Skype Jabber   Вверх
xTr1m
Дата 29.3.2013, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



там был еще один вопрос про скорость алгоритмов и на многопоточность. можно глянуть тут
это, как я понимаю, первый уровень отсева
PM MAIL WWW ICQ   Вверх
bsa
Дата 29.3.2013, 14:47 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



xTr1m, и не удивительно, что тебя послали. Кому нужен оторванный от жизни школьник?
Функция main() должна возвращать int.
хидер "conio.h" нестандартен.
Тебя просили целое число преобразовать в строку, а ты что сделал?
Имхо, я бы это задание выполнил так:
Код
#include <iostream>

int main()
{
   unsigned int ip = 0x12345678;
   for(int i = 24; i >= 0; i -= 8) {
      std::cout << ((ip >> i) & 0xff);
      if (i > 0)
         std::cout << '.';
   }
   return 0;
}


Цитата(xTr1m @  29.3.2013,  15:38 Найти цитируемый пост)
там был еще один вопрос про скорость алгоритмов и на многопоточность. можно глянуть тут
это, как я понимаю, первый уровень отсева 
set, multiset (в т.ч. и сортированные - сортированы по умолчанию) и сортированные vector и deque.

А в примере на многопоточность есть как минимум две проблемы: когда Add лочит doubles, а Find(int) к этому времени уже залочил integers, затем Find может попытаться захватить doubles, но не выходит и ждет другой поток, а другой поток ждет освобождения integers - deadlock. Вообще ситуация с захватом двух мьютексов очень сложная и требует очень большой аккуратности и максимального ограничения областей захвата. В данном случае, лучше лочить не одновременно, а по очереди (что в find, что в add). Вторая проблема связана с сравнением чисел с плавающей точкой. Очень часто операция сравнения (operator==) может банально не работать. Поэтому для действительных чисел лучше использовать неточное сравнение ( abs(a - b) < eps ).
PM   Вверх
volatile
Дата 29.3.2013, 23:24 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

// Перепишите код, устранив имеющиеся в нём проблемы, но не изменяя функцию main
class Foo {
 public:
  Foo(int j) { i = new int[j]; }
  ~Foo() { delete i; }

 private:
  int* i;
};

class Bar: Foo {
 public:
  Bar(int j) { i = new char[j]; }
  ~Bar() { delete i; }

 private:
  char* i;
};

void main() {
  Foo* f = new Foo(100);
  Foo* b = new Bar(200);
  *f = *b;
  delete f;
  delete b;
}

Ну вот кто это составляет такие заданя. Тут надо по крайней мере написать что они вообще хотели.
Если исходить из того, что дано, тогдаа члены i вообще нужно удалить. Доступа к ним нет, а сам класс с ними ничего не делает.
А фантазировать, на тему, что с ними хотел делать автор, это из области парапсихологии.
Так что вот так будет правильней:

Код

struct Foo {
  Foo(int) {}
};

struct Bar: Foo {
  Bar(int) : Foo (42) {}
};

void main() {
  Foo* f = new Foo(100);
  Foo* b = new Bar(200);
  *f = *b;
  delete f;
  delete b;
}

По крайней мере здесь все правильно, и интерфейс для пользователя, не изменицца.
(т.е. там где работал исходный код, там-же точно с таким эффектом будет работать и этот.
Только без путаницы и оверхедов.


Это сообщение отредактировал(а) volatile - 29.3.2013, 23:39
PM MAIL   Вверх
noize
Дата 1.4.2013, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


5.18.2
*


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

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



Цитата

Вторая проблема связана с сравнением чисел с плавающей точкой. Очень часто операция сравнения (operator==) может банально не работать

не раскажете подробнее о данной проблеме? 
PM MAIL   Вверх
Crafty
Дата 1.4.2013, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

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



Цитата(noize @  1.4.2013,  08:51 Найти цитируемый пост)
не раскажете подробнее о данной проблеме?  

Проблема в том, что числа с плавающей точкой нельзя представить точно.
Код

#include <iostream>
#include <iomanip>

int main()
{
   double x = 1.0;
   double y = 0.0;
   for (int i = 0; i != 10; ++i)
   {
      std::cout  << std::setprecision(25) << y  << std::endl;
      y += 0.1;
   }
   if (y == x)
      std::cout << y << " == " << x << std::endl;
   std::cout << std::setprecision(25) << y << " != " << x << std::endl;
}


Код

stdout:
0
0.1000000000000000055511151
0.2000000000000000111022302
0.300000000000000044408921
0.4000000000000000222044605
0.5
0.5999999999999999777955395
0.699999999999999955591079
0.7999999999999999333866185
0.899999999999999911182158
0.9999999999999998889776975 != 1


Добавлено @ 13:34
Поэтому  обычно сравнивают вот так 
Код

#include <iostream>
#include <iomanip>

int main()
{
   double x = 1.0;
   double y = 0.0;
   for (int i = 0; i != 10; ++i)
   {
      y += 0.1;
   }
   double epsilon = 0.00001;
   if (std::abs(x - y) <= epsilon)
      std::cout << std::setprecision(25) << y << " == " << x << std::endl;
}


Это сообщение отредактировал(а) Crafty - 1.4.2013, 15:11
PM MAIL   Вверх
Guinness
Дата 1.4.2013, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хм, я обычно сравниваю так:
Код

if(abs(a-b) < eps * max(a,b)){
    std::cout << "equal" << std::endl;
}

PM MAIL   Вверх
noize
Дата 1.4.2013, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


5.18.2
*


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

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



Crafty
1. это справедливо и для float ?
2. В языке C действует такое же ограничение?

Это сообщение отредактировал(а) noize - 1.4.2013, 14:03
PM MAIL   Вверх
Crafty
Дата 1.4.2013, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

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



Цитата(Guinness @  1.4.2013,  13:44 Найти цитируемый пост)
Хм, я обычно сравниваю так:

Зачем так много действий в условии и max и умножение
Попробуйте сравнить допустим 1.0 и 1.1 при эпислон 0.0001, в твоем случае он считает что они равны, что не верно

Добавлено @ 14:06
noize, на всех языках ИМХО одно и тоже что паскаль, что си, что питон. Тут дело не в языке программирования ,а в том как представлены числа с плавающей точкой на самой машине.

Добавлено @ 14:06
Цитата(noize @  1.4.2013,  14:02 Найти цитируемый пост)
1. это справедливо и для float ?

да

Это сообщение отредактировал(а) Crafty - 1.4.2013, 14:10
PM MAIL   Вверх
Guinness
Дата 1.4.2013, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Crafty @  1.4.2013,  14:05 Найти цитируемый пост)
Зачем так много действий в условии и max и умножениеПопробуйте сравнить допустим 1.0 и 1.1 при эпислон 0.0001, в твоем случае он считает что они равны, что не верно


Разве?
(1.1 - 1.0 = 0.1) < 1.1 * 0.00001
Вроде как неравенство не проходит в данном случае, и числа неравны.

Собственно, делается это, для того чтобы сравнивать числа любых размеров. К примеру:
a = 0.008
b = 0.00701
eps = 0.001

abs(a-b) < max(a,b) * eps => 0.00099 < 0.008*0.001

Соотвественно, данные цифры не равны, что вполне логично. Т.к. различия у них в первой же значащей цифре.

И другой пример
a = 1.008
b = 1.00701
eps = 0.001

abs(a-b) < max(a,b) * eps => 0.00099 < 1.008*0.001

А тут цисла равны. Что, как мне кажется, правильно. В Вашем же случае, нужно постоянно менять эпсилон, чтобы понимать в каком знаке Вы хотите совпадения.


Это сообщение отредактировал(а) Guinness - 1.4.2013, 14:37
PM MAIL   Вверх
noize
Дата 1.4.2013, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


5.18.2
*


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

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



Crafty, а как же утверждение о том, что стандарт языка гарантирует 6 цифр после мантиссы для float и n-ое количество цифр для double? 
Вот такая программка
Код

#include <iostream>

int main()
{
    using namespace std;

    float a = 0.000001;
    float b = 0.000002;
    cout << "a = " << a << "; b = " << b << endl;
    if (a == b) {
        cout << "a равняется b" << endl;
    } else if (b > a) {
        std::cout << "b больше a" << std::endl;
    }

    double c = 0.0000001;
    double d = 0.0000001;
    double e = 0.0000002;
    cout << "c = " << c << "; d = " << d << "; e = " << e << endl;
    if (c == d) {
        cout << "c равняется d" << endl;
    } else {
        cout << "c не равняется d" << endl;
    }
    if (c == e) {
        cout << "c равняется e" << endl;
    } else if (e > c) {
        cout << "e больше c" << endl;
    }

    return 0;
}

выдаёт вот такой результат:
Код

a = 1e-06; b = 2e-06
b больше a
c = 1e-07; d = 1e-07; e = 2e-07
c равняется d
e больше c

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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