Пт, 17.08.2018, 02:11
Форум інформатиків України
Головна Реєстрація Вхід
Вітаю Вас, Гість · RSS
Вітання на форумі
Незнайомець
Вітаємо на форумі,
Незнайомцю!

 
зареєструйтесь
Перед реєстрацією обов’язково прочитайте:
Оновлення Учасники Пошук
Особисті повідомлення
Видавництво ’’Аспект’’ Видавництво

  • Сторінка 2 з 3
  • «
  • 1
  • 2
  • 3
  • »
Модератор форуму: Bandalak, Ktara, НІКОЛЯ, volevikt  
Форум інформатиків » РОЗДІЛ VIІІ: ОБМІН ДОСВІДОМ (УРОКИ, ФАКУЛЬТАТИВИ, ПОЗАКЛАСНА РОБОТА) » 8.6 Факультатив з програмування » Мова С++ (поради, запитання....) (Все що стосується програмування на С++)
Мова С++ (поради, запитання....)
Пилипчук_О_П Дата: Нд, 13.08.2017, 01:17 | Повідомлення № 16
Ветеран спілкування
Повідомлень: 4202
Нагороди: 38
Рейтинг: 377
Цитата Bandalak ()
На олімпіадах директиви та зовнішні модулі заборонені.

Справді, щоразу потрібно уважно читати технічні умови конкретної олімпіади. Був час, коли з Турбо Паскаля вилучали довідкову систему (ніби учень, який без довідкової системи не може написати програму, буде претендувати на призові місця) :)
Приклад правил олімпіади, де технічні обмеження сформульовані не дуже жорстко: http://zoi2016.at.ua/index/pravila/0-6

На "багатомовних" олімпіадах складно сформулювати обмеження так, щоб нікого не "образити".
Пилипчук_О_П Дата: Вт, 17.04.2018, 22:57 | Повідомлення № 17
Ветеран спілкування
Повідомлень: 4202
Нагороди: 38
Рейтинг: 377
Хто може чітко пояснити таку проблему:
Код
#include<iostream>
using namespace std;
int main()
{
    double a;
    cin>>a;
    cout<<int(a*10)%10;
    return 0;
}

Вводимо 4.6
Отримуємо 5.
Чому? Я хотів 6...

P.S. Здогадуюсь, що причина в двійковому поданні десяткових чисел, але як це наочно побачити?


Відредаговано: Пилипчук_О_П - Вт, 17.04.2018, 22:59
Пилипчук_О_П Дата: Вт, 17.04.2018, 23:33 | Повідомлення № 18
Ветеран спілкування
Повідомлень: 4202
Нагороди: 38
Рейтинг: 377
Цитата Пилипчук_О_П ()
Вводимо 4.6
Отримуємо 5.
Чому? Я хотів 6...

Зробив невеличке дослідження.
У двійковому поданні 4.6 - це 100.100(1100), тобто періодичний дріб. Зрозуміло, що зберігаються не всі цифри дробової частини, тому насправді змінна містить менше, ніж 4.6. Класична ситуація...
В Паскалі захищеніше: функція int повертає значення не цілого, а дійсного типу, яке для знаходження остачі потрібно примусово округлити (round). Тому виводиться правильний результат: 6.
fox11 Дата: Ср, 18.04.2018, 06:10 | Повідомлення № 19
Прописаний назавжди
Повідомлень: 283
Нагороди: 3
Рейтинг: 61
#include<iostream>
using namespace std;
int main()
{
    double a;
    cin>>a;
    a=a*10;
    cout<<(int)a%10;
}

return 0; уже не обязательно.
Apice Дата: Ср, 18.04.2018, 08:11 | Повідомлення № 20
Тут живе...
Повідомлень: 199
Нагороди: 4
Рейтинг: 44
Цитата fox11 ()
return 0; уже не обязательно.
Було б "не обязательно", якби void main()
Так, компілятор "проковтне" і Ваш код, але ж дисципліна...
Пилипчук_О_П Дата: Ср, 18.04.2018, 08:25 | Повідомлення № 21
Ветеран спілкування
Повідомлень: 4202
Нагороди: 38
Рейтинг: 377
Цитата fox11 ()
return 0; уже не обязательно.

return 0; - майже обов'язково. Програма має повернути код помилки в систему. Код 0 - ознака успішного завершення. Існують й інші коди, які свідчать про різні нештатні ситуації. Краще привчати учнів до гарного стилю.
Bandalak Дата: Ср, 18.04.2018, 11:15 | Повідомлення № 22
Лідер форуму
Повідомлень: 5919
Нагороди: 42
Рейтинг: 265
Код
#include<iostream>
using namespace std;
int main()
{
    double a;
    cin>>a;
    cout<<int(a*10)%10;
    return 0;
}


Код
#include<iostream>
using namespace std;
int main()
{
    double a;
    cin>>a;
    a=a*10;
    cout<<(int)a%10;
}

return 0;


Щось я не побачив суттєвої різниці між цими кодами. В одному виходить 6, а в іншому 5?
fox11 Дата: Ср, 18.04.2018, 17:24 | Повідомлення № 23
Прописаний назавжди
Повідомлень: 283
Нагороди: 3
Рейтинг: 61
Цитата Пилипчук_О_П ()
return 0; - майже обов'язково. Програма має повернути код помилки в систему. Код 0 - ознака успішного завершення. Існують й інші коди, які свідчать про різні нештатні ситуації. Краще привчати учнів до гарного стилю.
Согласен, но я имел ввиду, что современные компиляторы С++ автоматически добавляют return 0; в конец главной функции main().
Проверял на e-olimp работает.


Відредаговано: fox11 - Ср, 18.04.2018, 17:27
LVV Дата: Сб, 28.04.2018, 19:24 | Повідомлення № 24
Прописаний назавжди
Повідомлень: 430
Нагороди: 5
Рейтинг: 127
Цитата Пилипчук_О_П ()
#include<iostream>
using namespace std;

int main()
{
    double a = 4.6;
    cout<<int(a*10)%10;
    return 0;

}
В Visyual Studio 2017 виводить очікуване 6
У CodeBlocks 17.2 (компілятор GCC) виводить 5
???????????????????????????????

Bandalak Дата: Сб, 28.04.2018, 20:52 | Повідомлення № 25
Лідер форуму
Повідомлень: 5919
Нагороди: 42
Рейтинг: 265
miniGW виводить 6
Пилипчук_О_П Дата: Сб, 28.04.2018, 22:35 | Повідомлення № 26
Ветеран спілкування
Повідомлень: 4202
Нагороди: 38
Рейтинг: 377
Цитата LVV ()
В Visyual Studio 2017 виводить очікуване 6У CodeBlocks 17.2 (компілятор GCC) виводить 5
Не маю нічого проти С++ в школі і навіть якоюсь мірою "за". Так само, як і за Паскаль, оскільки не бачу великої різниці. Але завзяті  прихильники С++ мали б внести ясність щодо цієї проблеми...
fox11 Дата: Нд, 29.04.2018, 07:44 | Повідомлення № 27
Прописаний назавжди
Повідомлень: 283
Нагороди: 3
Рейтинг: 61
Дело не в языке. 4.4 4.5 4.7 выдает правильно 4, 5 и 7 соответственно. Дело в ИСР.
Пробовал в Кумире 4.6 выдает 6.
"В Visyual Studio 2017 виводить очікуване 6"
Может глюк в MinGW?

Додано (29.04.2018, 07:44)
---------------------------------------------
Цитата fox11 ()
Не маю нічого проти С++ в школі і навіть якоюсь мірою "за". Так само, як і за Паскаль, оскільки не бачу великої різниці.
А вот это зря. Возьмите хотя бы мотивацию детей. "Вы одни на весь город кто изучает С++")))
А если серьезно, пригодится и в институте и после (надеюсь).
При Вашем подходе, почему бы не вернуть на старый добрый Бейсик? Он мне больше нравился и для детей был легче.
Приезжала в гости бывшая ученица, с Германии. Ее дети учат Джаву!!! Более того ее муж немец, когда учился в гимназии,  изучал Джаву!!!


Відредаговано: fox11 - Нд, 29.04.2018, 07:53
Пилипчук_О_П Дата: Нд, 29.04.2018, 12:55 | Повідомлення № 28
Ветеран спілкування
Повідомлень: 4202
Нагороди: 38
Рейтинг: 377
Цитата fox11 ()
При Вашем подходе, почему бы не вернуть на старый добрый Бейсик? Он мне больше нравился и для детей был легче.

Якщо мова про класичний Бейсік з номерами рядків, то перехід з нього, наприклад, на Паскаль, цілком виправданий: користувацькі іменовані процедури і функції - це те, чого бракувало Бейсіку.
Щодо різниці між С++ і Паскалем я, звичайно, трохи перегнув :) . Різниця є, тому для використання в школі більше придатний Паскаль. Звичайно, потрібно брати сучасні компілятори, середовища і т.п. Можливо, взяти якусь мову-спадкоємця, наприклад, Zonnon (детально не випробовував). Його компілятор повністю інтегрується у Visual Studio разом з іншими мовами платформи .NET.

https://uk.wikipedia.org/wiki/Zonnon
Bandalak Дата: Пн, 30.04.2018, 12:06 | Повідомлення № 29
Лідер форуму
Повідомлень: 5919
Нагороди: 42
Рейтинг: 265
Цитата fox11 ()
Может глюк в MinGW?

В MinGW виходить 6.

То мабуть глюк у CodeBlock. У ньому виходить 5. Але чомусь саме CodeBlock використовують на олімпіадах.

Цитата Пилипчук_О_П ()
якщо мова про класичний Бейсік з номерами рядків,

Останній раз ми у школі з дітьми вчили Q-Basic на початку 2000-х років. Він мені дуже подобався. Там рядки не обов'язково нумерувати, є підпрограми-функції та класичні процедури. Особливо гарно там графіка реалізована, не потрібно виходити з графічного режиму для організації діалогу.
Шкода, що не зробили прототип того бейсика для сучасних операційних систем!
Пилипчук_О_П Дата: Пн, 30.04.2018, 22:56 | Повідомлення № 30
Ветеран спілкування
Повідомлень: 4202
Нагороди: 38
Рейтинг: 377
Цитата Bandalak ()
То мабуть глюк у CodeBlock.

Навряд. CodeBlocks - це середовище, яке використовує певний компілятор. Тому причину слід шукати в компіляторі. Якщо вона взагалі існує.
Чомусь всі вирішили, що це помилка. С++ - мова сувора :) Я вище писав про своє дослідження: http://informatic.org.ua/forum/17-2376-88838-16-1523997186
Форум інформатиків » РОЗДІЛ VIІІ: ОБМІН ДОСВІДОМ (УРОКИ, ФАКУЛЬТАТИВИ, ПОЗАКЛАСНА РОБОТА) » 8.6 Факультатив з програмування » Мова С++ (поради, запитання....) (Все що стосується програмування на С++)
  • Сторінка 2 з 3
  • «
  • 1
  • 2
  • 3
  • »
Пошук:


© Форум інформатиків України, 2007-2018.