13 / 13 / 9
Регистрация: 28.07.2017
Сообщений: 103
1

Cin точнее scanf?

29.03.2018, 23:39. Показов 612. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Во время написания кода и попытки понимания возникновения ошибки, отправил на проход тестов два идентичных кода, отличия были только в том, что в одном случае для ввода перменных использовался ввод с помощью std::cin, а в другом - scanf(). В итоге тест с std::cin прошел на 50%, а со scanf() - 45%. Скажите, пожалуйста, почему так происходит. Кстати, отличие в проходимых тестах тоже есть, т.е. со scanf() один тест прошел, а в std::cin оне не проходит.

Тест для scanf() и Код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <cstdio>
#include <set>
 
int main ()
{
    std::multiset <float> mSet;
    int qAccounts;
    float p;
    scanf ("%d %f", &qAccounts, &p);
    p = (100 - p) / 100;
    while (qAccounts--)
    {
        float tmp;
        scanf ("%f", &tmp);
        mSet.insert (tmp);
    }
    while (mSet.size () != 1)
    {
        float tmp = *mSet.begin ();
        mSet.erase (mSet.begin ());
        tmp += *mSet.begin ();
        mSet.erase (mSet.begin ());
        mSet.insert (tmp * p);
    }
    printf ("%f", *mSet.begin ());
    return 0;
}


Тест для cin и Код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//#include <cstdio>
#include <set>
#include <iostream>
 
int main ()
{
    std::multiset <float> mSet;
    int qAccounts;
    float p;
//    scanf ("%d %f", &qAccounts, &p);
    std::cin >> qAccounts >> p;
    p = (100 - p) / 100;
    while (qAccounts--)
    {
        float tmp;
//        scanf ("%f", &tmp);
        std::cin >> tmp;
        mSet.insert (tmp);
    }
    while (mSet.size () != 1)
    {
        float tmp = *mSet.begin();
        mSet.erase (mSet.begin ());
        tmp += *mSet.begin ();
        mSet.erase (mSet.begin ());
        mSet.insert (tmp * p);
    }
//    printf ("%f", *mSet.begin ());
    std::cout << *mSet.begin ();
    return 0;
}


И вот сама задача если кому интересно.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2018, 23:39
Ответы с готовыми решениями:

Операторы cin и scanf
Пример кода: void func(float* p){ cout &lt;&lt; &quot;Введите значение&quot;; scanf(&quot;%f\n&quot;, &amp;p); } Как...

Из scanf в std::cin
Как тоже самое сделать с помощью std::cin? printf(&quot;Введите автора %d книги.\n&quot;,i+1);...

Переделаем вместе scanf() в cin>>
Был исходник: void Comp::Get() // Ввод данных с клавиатуры =) { printf (&quot;\n Введите...

Scanf vs cin (double variant)
double k = 0.0; scanf(&quot;%f&quot;, &amp;k); double k1 = 0.0 cin &gt;&gt; k1; Вводим -1,5. Получаем: k =...

7
1392 / 1021 / 325
Регистрация: 28.07.2012
Сообщений: 2,810
29.03.2018, 23:52 2
Цитата Сообщение от dude78 Посмотреть сообщение
со scanf() один тест прошел, а в std::cin оне не проходит
Может ты просто по времени не проходишь? В базовом виде cin работает медленнее, чем scanf.
0
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
29.03.2018, 23:56 3
может проблема с форматным выводом? округление до копеек, т.е. только 2 знака после запятой
0
7 / 7 / 5
Регистрация: 25.03.2018
Сообщений: 377
30.03.2018, 00:16 4
Ещё есть такая фишка, что cin работает с потоком, а scanf с терминальной строкой

Добавлено через 2 минуты
да и помню на одном сайте по прогр. была цитата :"Мораль: если входных данных много, то надо использовать scanf."
0
nonedark2008
30.03.2018, 00:34
  #5

Не по теме:

Цитата Сообщение от mat_for_c Посмотреть сообщение
может проблема с форматным выводом? округление до копеек, т.е. только 2 знака после запятой
Странная задача. В условии ничего про округления не сказано, предлагают гадать и перебирать варианты самим...

0
13 / 13 / 9
Регистрация: 28.07.2017
Сообщений: 103
30.03.2018, 19:00  [ТС] 6
nonedark2008, Если говорить про отличия, то: при scanf() 8-й тест проходит, в то время как у cin он не проходит. Но зато 14-й и 15-е тесты у cin проходят, а у scanf() на них неправильный ответ.

Да, если использовать cin то по времени последний тест не проходит, т.к. слишком все долго. Но при scanf() этот тест во время вписывается, но ответ все-равно не правильный.

Непонятно, почему если ввод разный, то и результаты разные. Смысл то один и тот же, мы присваиваем значение переменный. Типы у них одинаковые...
0
7538 / 6399 / 2918
Регистрация: 14.04.2014
Сообщений: 27,865
30.03.2018, 19:13 7
Где-то же предлагали sync_with_stdio(false) делать для ускорения cin.
1
1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
30.03.2018, 19:39 8
Цитата Сообщение от nmcf Посмотреть сообщение
Где-то же предлагали sync_with_stdio(false) делать для ускорения cin.
Ошибка при решении задачи "Сумма максимума и минимума" - Time limit exceeded
Но такое предложение видел только на этом сайте (у них это в рекомендациях по решению задач написано). На другом может и не действовать, у каждого свои требования. Надо смотреть алгоритм.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.03.2018, 19:39
Помогаю со студенческими работами здесь

Заменить cin / cout на scanf / printf
#include&lt;iostream&gt; #include&lt;locale.h&gt; #include&lt;Windows.h&gt; #include&lt;string&gt; #include &quot;123.h&quot;...

Заменить printf scanf на cout cin
#include&lt;iostream.h&gt; #include&lt;math.h&gt; #pragma argsused int main(int argc, char* argv) {int i;...

Заменить cin cout на printf scanf
Преподаватель не хочет принимать код по минимальному основанию системы счисления , из-за того, что...

Переделать scanf и printf в cin и cout
#include &quot;stdio.h&quot; #include &quot;math.h&quot; int main() { float S=0; int n=3; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru