Новинарски форум

бъгове в домашното...(точно тей)

бъгове в домашното...(точно тей)

от Георги Пенков -
Number of replies: 3

привет колеги,

както обърнаха внимание някои колеги в basefile-а за домашното подозрително присъства оператор >>, за който се споменава в условието, че трябва да бъде написан. нещо повече - той е бъгав ?!

хм... изненада и за мен, но обяснението е много просто. условието на задачата е част от един семинар по ООП, проведен с някои от групите. там демонстрирах стъпка по стъпка изработката на оператора "<<", който трябваше да ви е за ориентир. в края на лекцията загатнах как би следвало да се реализира ">>" (т.е.. по аналог), но явно по погрешка съм записал "демонстрацията". в този ред на мисли - оператор "<<" е тестван, а оператор ">>" - не е. от там и бъговете...

та, както е забелязал колегата Тодоров, тази реализация е грешна. в нея редът с ">>" трябва да се замени с ">>=". той, обаче, е пропуснал да забележи, че има още един бъг - цикълът продължава един път повече и се получава прехвърляне границите на масива. в следствие на което b.cnt придобива странни стойности. т.е. трябва в проверката на цикъла ++ да е инфиксен, а не постфиксен. с други думи правилното решение изглежда така (в червено са промените) :

int operator >> (BitBucket &b, const int n) {
	unsigned char o = 0, r; // o : overflow, r : current remaining
	int i = 0;		// iterate over all elements of data[]
				// starting from the 'MOST' significant
				// which in this example happens to be
				// the FIRST element of the data[] array
	do  {
		r = b.data[i];
		r <<= sizeof (unsigned char) * 8  - n;
		b.data[i] >>= n;
		b.data[i] |= o;
		o = r;
	} while (++i < SZ);
	
	b.cnt -= n;
	if (b.cnt < 0)
		b.cnt = 0;

	return o;
}
 

така, заради това недоглеждане, както изглежда най-сложното подусловие отпада.

все пак, за всички, които желаят да покажат добро разбиране на shift-left и shift-right обявяваме следното бонус условие, което ще доведе до допълнителни точки :

  • да се реализират операторите > и <, които правят rotate-left и rotate-right. това са операции, при които битовете, които са в "пренос" при преместването се записват като старши или младши в противоположния край на структурата. 

    например ако имаме 10100110 10100110 10100110 10100000, при прилагане на оператор < с 3 ще получим резултат 00110101 00110101 00110101 00000101
In reply to Георги Пенков

Re: бъгове в домашното...(точно тей)

от Георги Пенков -

Привет,

напомням, че срокът за предаване на домашното е 1май. оценката от домашното може да има отношение към крайната оценка и е вероятно да има в случаите, в които не ви достига малко за по-високата (желана) от вас оценка.

консултации по домашното можете да получите по всяко време във форума или в рамките на занятията на място във ФМИ.

поздарви,
г.пенков

In reply to Георги Пенков

Re: бъгове в домашното...(точно тей)

от Владимир Начев -

За какво използваме полето cnt  ?

In reply to Владимир Начев

Re: бъгове в домашното...(точно тей)

от Георги Пенков -

привет,

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

поздрави,

г.