Loading...
l000p avatar l000p 13 Точки

Странно поведение C++ Fundamentals.

Здравейте, решавам домашното от C++ Fundamentals и открих нещо, което не мога да си обясня. Когато hit-нах 40/100 на задача Min and Max: https://softuni.bg/trainings/resources/officedocument/42359/homework-c-plus-plus-fundamentals-september-2019/2402

Започнах да проверявам какво може да не е в ред и реших да опитам да въведа число с десетична запетая в конзолата (compare) при което програмата започва да игнорира cin >> compare и продължава до върти цикълът докато не изкара някакви необичайни стойности на minN и maxN. 

По моята логика дори ако въведа число с десетична, то би трябвало да загуби стойност и да бъде записано от целочислен тип след, което цикълът да продължи нормално.

Това е source кода: https://pastebin.com/cEpDwcLV 

 

След това реших да кастна въвежданото число до челочислено и така програмата работи ОК, но все пак получавам 40/100.

Някой може ли да задълбочи по темата ? 

Source code след кастване: https://pastebin.com/fpGNpaA0

Благодаря !

 

 

0
Fundamentals Module
j.petrov_90 avatar j.petrov_90 373 Точки
Best Answer

Привет, колега,

Буквално 1 дума дели кода ти от това да получи 100/100.

Написал си, че всяко прочетено число е или новия минимум или новия максимум.
А защо да не е и двете?
Ако програмата ти има само 1 число то трябва да бъде едновременно и минимум и максимум. По твоята логика обаче това не е така.

Относно експеримента ти със std::cin :
По време на лекцията си говорихме, че каквото му подадеш на cin да чете от конзолата - то това ще се опита да прочете (с неговата големина).
Ти му искаш int, а му подаваш число с плаваща запетая - няма как да стане.

Защо няма да стане?
cin взима входния поток и се опитва да "извлече" това, което му искаш.
Ако следваме твоя експеримент ти искаш int, целочислен тип, а му подаваш ... да кажем 3.14

cin успява да извлече цифрата 3, намира "точка" и спира, връщайки ти числото 3.
Сега в потока е останало ".14".
При следващо поискване на целочислен тип то не успява да извлече нищо смислено е затова не ти връща нищо.
В променлимата ни compare има "глупости", защото е имало "глупости" по начало. Ти никъде не я зануляваш.
Спомни си въпроса от лекцията с колко ябълки имал Гошо. Същото е и тук.

Сега с този ".14" в потока, ако му поискам един "char" ще ми върне успешно символа '.'

Поздрави,
Живко

0
l000p avatar l000p 13 Точки

Здравей Живко, благодаря за отговорът, бях наясно че cin извлича и записва това, което може, но идея си нямах, че в потока остава това, което евентуално е останало. 

Има ли начин да предотвратим това? Начин с който да изчистим "буферираното" или да го игнорираме ?? 

 

Имаше подобна задача в basics, но там цикълът беше докато не въведем команда stop.

Поздрави.

0
j.petrov_90 avatar j.petrov_90 373 Точки

Когато работиш с потоци (в този случай и cin/стандартния вход/) обикновенно се предполага, че знаеш формата в който ще идват данните.
Аналогично както даде пример с команда стоп може да имаш варианта - извличай числа докато има такива (ако не им знаеш бройката).

Относно това бефирирането - да, има начин да се игнорира информация от потока.
Това става с функцията "ignore()" на std::cin
Например std::cin.ignore() - това ще игнорира 1 символ от входа.
функцията ignore() също я има и като вариан с параметър, който приема аргумент колко символа да се игнорират.
Например std::cin.ignore(3) - игнорира следващите 3 символа.

П.С.cin-а попринцип автоматично консумира whitespace-овете между различните данни. За него това е "разделителят".

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.