 |
Вітаю Вас, Гість · RSS |
 |
Мова С++ (поради, запитання....)
| |
Пилипчук_О_П |
Дата: Su, 13.08.2017, 00:17 | Повідомлення № 16 |
Ветеран спілкування
Повідомлень: 4330
| Цитата Bandalak (  ) На олімпіадах директиви та зовнішні модулі заборонені. Справді, щоразу потрібно уважно читати технічні умови конкретної олімпіади. Був час, коли з Турбо Паскаля вилучали довідкову систему (ніби учень, який без довідкової системи не може написати програму, буде претендувати на призові місця)  Приклад правил олімпіади, де технічні обмеження сформульовані не дуже жорстко: http://zoi2016.at.ua/index/pravila/0-6
На "багатомовних" олімпіадах складно сформулювати обмеження так, щоб нікого не "образити".
|
|
| |
Пилипчук_О_П |
Дата: Tu, 17.04.2018, 21:57 | Повідомлення № 17 |
Ветеран спілкування
Повідомлень: 4330
| Хто може чітко пояснити таку проблему:
Код #include<iostream> using namespace std; int main() { double a; cin>>a; cout<<int(a*10)%10; return 0; } Вводимо 4.6 Отримуємо 5. Чому? Я хотів 6...
P.S. Здогадуюсь, що причина в двійковому поданні десяткових чисел, але як це наочно побачити?
Відредаговано: Пилипчук_О_П - Tu, 17.04.2018, 21:59 |
|
| |
Пилипчук_О_П |
Дата: Tu, 17.04.2018, 22:33 | Повідомлення № 18 |
Ветеран спілкування
Повідомлень: 4330
| Цитата Пилипчук_О_П (  ) Вводимо 4.6 Отримуємо 5. Чому? Я хотів 6... Зробив невеличке дослідження. У двійковому поданні 4.6 - це 100.100(1100), тобто періодичний дріб. Зрозуміло, що зберігаються не всі цифри дробової частини, тому насправді змінна містить менше, ніж 4.6. Класична ситуація... В Паскалі захищеніше: функція int повертає значення не цілого, а дійсного типу, яке для знаходження остачі потрібно примусово округлити (round). Тому виводиться правильний результат: 6.
|
|
| |
fox11 |
Дата: We, 18.04.2018, 05:10 | Повідомлення № 19 |
Прописаний назавжди
Повідомлень: 403
| #include<iostream> using namespace std; int main() { double a; cin>>a; a=a*10; cout<<(int)a%10; }
return 0; уже не обязательно.
|
|
| |
Apice |
Дата: We, 18.04.2018, 07:11 | Повідомлення № 20 |
Прописаний назавжди
Повідомлень: 246
| Цитата fox11 (  ) return 0; уже не обязательно. Було б "не обязательно", якби void main() Так, компілятор "проковтне" і Ваш код, але ж дисципліна...
|
|
| |
Пилипчук_О_П |
Дата: We, 18.04.2018, 07:25 | Повідомлення № 21 |
Ветеран спілкування
Повідомлень: 4330
| Цитата fox11 (  ) return 0; уже не обязательно. return 0; - майже обов'язково. Програма має повернути код помилки в систему. Код 0 - ознака успішного завершення. Існують й інші коди, які свідчать про різні нештатні ситуації. Краще привчати учнів до гарного стилю.
|
|
| |
Bandalak |
Дата: We, 18.04.2018, 10:15 | Повідомлення № 22 |
Лідер форуму
Повідомлень: 6386
| Код #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 |
Дата: We, 18.04.2018, 16:24 | Повідомлення № 23 |
Прописаний назавжди
Повідомлень: 403
| Цитата Пилипчук_О_П (  ) return 0; - майже обов'язково. Програма має повернути код помилки в систему. Код 0 - ознака успішного завершення. Існують й інші коди, які свідчать про різні нештатні ситуації. Краще привчати учнів до гарного стилю. Согласен, но я имел ввиду, что современные компиляторы С++ автоматически добавляют return 0; в конец главной функции main(). Проверял на e-olimp работает.
Відредаговано: fox11 - We, 18.04.2018, 16:27 |
|
| |
LVV |
Дата: Sa, 28.04.2018, 18:24 | Повідомлення № 24 |
Прописаний назавжди
Повідомлень: 440
| Цитата Пилипчук_О_П (  ) #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 |
Дата: Sa, 28.04.2018, 19:52 | Повідомлення № 25 |
Лідер форуму
Повідомлень: 6386
| miniGW виводить 6
|
|
| |
Пилипчук_О_П |
Дата: Sa, 28.04.2018, 21:35 | Повідомлення № 26 |
Ветеран спілкування
Повідомлень: 4330
| Цитата LVV (  ) В Visyual Studio 2017 виводить очікуване 6У CodeBlocks 17.2 (компілятор GCC) виводить 5 Не маю нічого проти С++ в школі і навіть якоюсь мірою "за". Так само, як і за Паскаль, оскільки не бачу великої різниці. Але завзяті прихильники С++ мали б внести ясність щодо цієї проблеми...
|
|
| |
fox11 |
Дата: Su, 29.04.2018, 06:44 | Повідомлення № 27 |
Прописаний назавжди
Повідомлень: 403
| Дело не в языке. 4.4 4.5 4.7 выдает правильно 4, 5 и 7 соответственно. Дело в ИСР. Пробовал в Кумире 4.6 выдает 6. "В Visyual Studio 2017 виводить очікуване 6" Может глюк в MinGW?
Додано (29.04.2018, 07:44) ---------------------------------------------
Цитата fox11 (  ) Не маю нічого проти С++ в школі і навіть якоюсь мірою "за". Так само, як і за Паскаль, оскільки не бачу великої різниці. А вот это зря. Возьмите хотя бы мотивацию детей. "Вы одни на весь город кто изучает С++"))) А если серьезно, пригодится и в институте и после (надеюсь). При Вашем подходе, почему бы не вернуть на старый добрый Бейсик? Он мне больше нравился и для детей был легче. Приезжала в гости бывшая ученица, с Германии. Ее дети учат Джаву!!! Более того ее муж немец, когда учился в гимназии, изучал Джаву!!!
Відредаговано: fox11 - Su, 29.04.2018, 06:53 |
|
| |
Пилипчук_О_П |
Дата: Su, 29.04.2018, 11:55 | Повідомлення № 28 |
Ветеран спілкування
Повідомлень: 4330
| Цитата fox11 (  ) При Вашем подходе, почему бы не вернуть на старый добрый Бейсик? Он мне больше нравился и для детей был легче. Якщо мова про класичний Бейсік з номерами рядків, то перехід з нього, наприклад, на Паскаль, цілком виправданий: користувацькі іменовані процедури і функції - це те, чого бракувало Бейсіку. Щодо різниці між С++ і Паскалем я, звичайно, трохи перегнув . Різниця є, тому для використання в школі більше придатний Паскаль. Звичайно, потрібно брати сучасні компілятори, середовища і т.п. Можливо, взяти якусь мову-спадкоємця, наприклад, Zonnon (детально не випробовував). Його компілятор повністю інтегрується у Visual Studio разом з іншими мовами платформи .NET.
https://uk.wikipedia.org/wiki/Zonnon
|
|
| |
Bandalak |
Дата: Mo, 30.04.2018, 11:06 | Повідомлення № 29 |
Лідер форуму
Повідомлень: 6386
| Цитата fox11 (  ) Может глюк в MinGW? В MinGW виходить 6.
То мабуть глюк у CodeBlock. У ньому виходить 5. Але чомусь саме CodeBlock використовують на олімпіадах.
Цитата Пилипчук_О_П (  ) якщо мова про класичний Бейсік з номерами рядків, Останній раз ми у школі з дітьми вчили Q-Basic на початку 2000-х років. Він мені дуже подобався. Там рядки не обов'язково нумерувати, є підпрограми-функції та класичні процедури. Особливо гарно там графіка реалізована, не потрібно виходити з графічного режиму для організації діалогу. Шкода, що не зробили прототип того бейсика для сучасних операційних систем!
|
|
| |
Пилипчук_О_П |
Дата: Mo, 30.04.2018, 21:56 | Повідомлення № 30 |
Ветеран спілкування
Повідомлень: 4330
| Цитата Bandalak (  ) То мабуть глюк у CodeBlock. Навряд. CodeBlocks - це середовище, яке використовує певний компілятор. Тому причину слід шукати в компіляторі. Якщо вона взагалі існує. Чомусь всі вирішили, що це помилка. С++ - мова сувора Я вище писав про своє дослідження: http://informatic.org.ua/forum/17-2376-88838-16-1523997186
|
|
| |
© Форум інформатиків України, 2007-2022.  |