Отговора на третият пример в задача 16 , Bit Exchange Advanced от Домашно 3 е грешен !
Пример :
2369124121
2 22 10
10001101 00110101 11110111 00011001
01110001 10110101 11111000 11010001
1907751121
Истинският отговор е 1907749073 .
Пример :
2369124121
2 22 10
10001101 00110101 11110111 00011001
01110001 10110101 11111000 11010001
1907751121
Истинският отговор е 1907749073 .
Сигурна ли си?
Не ти прегледах кода изцяло, а видях само защо ти гърми за "k", но нека ти кажа аз какво правя, че получавам точно отговора от примера
Един масив, в който слагам едната част от битовете които трябва да се пълнят. Той е с дължина k или q - (q - k). В случая е 10.
Един масов, в който слагам другата част от битовете, отново с дължина k (10).
В тях пълня аналогично от p/q до q + k - 1 или p + k - 1 както е условието:
int j = 0;
for (int i = _q; i <= _q + _k - 1; i++)
{
localFrom[j] = i;
j++;
}
Така с ключ 0 (на първа позиция) идва стойността на q, с ключ 1 т.е. на втора позиция q+1 и така до q+k-1 (същото и за p)
Намирам битовете на всяка от позициите на localFrom[i] и localTo[i]
т.е. имам примерно from[0] => 22 => (колко бита е), from[1] => 23 => (битовете) и т.н.
to[0] => 2 => (битовете), to[1] => 3 => (битовете) и т.н. до p+k-1
Като имам позициите и битовете на тези позиции, осъществявам размяна по следонто условие:
Ако бит 22 и бит 2 са различни -> ако бит 22 е 0 => слагам 1 на 22ра позиция и 0 на 2ра позиция, във всички останали случаи слагам 0 на 22ра позиция и 1 на 2ра... И така за всички позиции, които са се напълнили в масивите localFrom[] и localTo. Ако битовете които сравнявам са еднакви не правя нищо.
Накрая като пусна програмата, въведа числото, p/q/k получавам отговора от примера.
на определен етап от избистрянето на решението на тази задача и аз получих същия оговор 1907749073 но първата ми работа беше да се осъмня в кода си, не в примера :) след известно време осъзнах че губя битове при преместването на маската наляво и надясно, при операциите << и >>
е в крайна сметка получих точно отговора от примера, верен е!
въобще ползваш ли дебъгера? ползвай го защото ако следиш нещата само наум тук може и да върши работа, но при по-дълъг код е невъзможно да запазиш в главата си цялата идея без трасировка като дебъгера
успех!
А, как, винаги първото нещо е да се осъмниш в примера. Примерите винаги са грешни. Шегувам се, разбира се, естествено трябва да мъчиш докрай, а не при първия различен отговор да обвиниш примера и да пишеш тема. Ако трябва да съм искрен, авторката, ако съдя по постовете й до сега, действа доста импулсивно.
а ти защо си нагласяваш маската по отговора ?
Сигурна съм - защото всички други примери ми дават правилен резултат и в 15 задача го пусках това число с 2, 22 и 10 и все толкова си дава
Маската си е винаги ясна - колкото е позицията на толкова се премества единицата на дясно !
Как ще я сбъркам ?
не нагласям маската по отговора, а от грешния отговор разбирам, че не нещо не е наред, в моя случай движението на маската
и мисля че отново не разбра, че отговора в примера е верен, следователно грешиш някъде, можеш да си пуснеш кода и да получиш по-точни обяснения какво да оправиш, но едно е ясно - грешен е!
Имаш грешка в кода най-вероятно, ако искаш качи си кода да го погледнем. Тук може да тестваш задачата с моят код.
не знам защо се получиха 2 еднакви поста, който може нека изтрие този
доста елегантно решение, супер!
моето е доста по-тромаво, но пък може би по-ясно, почти на всяка операция изписвам на конзолата какво става
който още не е готов, нека го рънне за онагледяване, със сигурност ще го разбере:
Нямам грешка в кода - от всички други примери излиза точно резултата, от същиягт код - кода ми е в другата тема - може да го видите !
Както и примерите от 15 задача пусках и те си излизат точно отговорите - пуснала съм и кодът ми за 15 в темата за 15 - тя е частен случай на 16.
Пуснах го този пример и в 15 задача с 2 ,22 и 10 и пак същото число излиза , а аз съм я решила по 2 начина 15
Ето го кодът ми , въпреки ,че го пусках в другата тема , ето го отново ,може даго пуснете спокойно във Вижуал студио - работи си перфектно !
class BitExchangeAdvanced
{
static void Main()
{
while (true)
{
Console.Write("Enter a number: Range number : Min value = 0, Max value = ");
Console.WriteLine(uint.MaxValue + " : \n");
string line = Console.ReadLine();
uint number; bool result = uint.TryParse(line, out number);
if (result == false) //not a valid uint number
{
Console.WriteLine("\nThis is not a valid input for uint number!\n\n");
}
else // the input for number is valid
{
Console.WriteLine("\nEnter a value for position [p]: Range p : Min value p = 0, Max value p = 31 !\n");
line = Console.ReadLine();
int p; // mask can take values from 1 to 1000 0000 0000 0000 0000 0000 0000 0000 for uint
// type uint has 32 bits word, so k=32
// position p takes values from 0 to 31
// bits are numbered from 0 to 31 , from right to left
result = int.TryParse(line, out p);
if (result == false || p < 0 || p > 31)
{
Console.WriteLine( result == false ? "\nThis is not a valid input for p!\n\n" : "\nOut of range!\n\n");
}
else //the input for p is valid
{
Console.WriteLine("\nEnter a value for position [q]: Range q : Min value q = 0, Max value q = 31 ! \n");
line = Console.ReadLine(); int q; result = int.TryParse(line, out q);
if (result == false || q < 0 || q > 31)
{
Console.WriteLine(result == false ? "\nThis is not a valid input for q!\n\n" : "\nTOut of range!\n\n");
}
else // the input for q is valid
{
int MaxValueOfK; if (p > q)
{
MaxValueOfK = 32 - p;
}
else // q > p
{
MaxValueOfK = 32 - q;
}
Console.WriteLine("\nEnter a value for [k]! Range k : Min value k = 0, Max value k = "
+ MaxValueOfK + " !\n");
line = Console.ReadLine();
int k;
result = int.TryParse(line, out k);
if (result == false || p + k > 32 || q + k > 32) //not a valid integer number or k is out of it's range
{
Console.WriteLine(result == false ? "\nThis is not a valid input for k!\n\n" : "\nOut of range!\n\n");
}
else //the input for k is valid
{
// condition for bits overlapping
bool overlap = ( p < q && p + k >= q ) || ( q < p && q + k >= p );
//checking for bits overlapping
if (overlap)
{
Console.WriteLine("\nOverlapping !\n\n");
}
else // there are not bits overlaps
{
// swaping p with q, p+1 with q+1, p+2 with q+2, ......, p+k-1 with q+k-1
int bitPValue;
int bitQValue;
uint maskP;
uint maskQ;
for (int i = 0; i <= k-1; i++)
{
//geting the value from the bit in position [p]
maskP = 1u << p;
bitPValue = (int)(number & maskP) >> p; // 0 or 1
//geting the value from the bit in position [q]
maskQ = 1u << q;
bitQValue = (int)(number & maskQ) >> q; // 0 or 1
//replacing the value in the q-bit with the value in the p-bit
if (bitPValue == 1) //so we are inserting value [1] in q
{
// changing the q-Bit Value to 1
number = number | maskQ;
}
else //bitPValue = 0, so we are insertin value [0] in q
{
// changing the q-Bit Value to 0 maskQ = ~ maskQ;
number = number & maskQ;
}
//replacing the value in the p-bit with the value in the q-bit
if (bitQValue == 1) //so, we are inserting value [1] in p
{
// changing the p-Bit Value to 1
number = number | maskP ;
}
else // bitQValue == 0, so we are inserting value [0] in p
{
// changing the p-Bit Value to 0
maskP = ~ maskP;
number = number & maskP;
}
p ++;
q ++;
}
Console.WriteLine("\nResult : \n\n" + number + " \n\n\n");
}
}
}
}
}
}
}
}
Умишлено ли оставяш по един празен ред нявсякъде, на първият ти тест n = 1140867093; p = 3; q = 24; k = 3; резултата ти е 0. Пак ще повторя грешката ти е в кода.
движиш маската с прекалено много позиции надясно и губиш битове - единици, от което се променя кода
реалния минус твоя отговор е = 1907751121-1907749073 = 2048
ако още не се сещаш това е 2 на 11 степен, т.е. 12 бит отдясно наляво го губиш, това пък означава че, движиш маската много надясно и реално го нулираш,
при другите числа на се получава или защото не отиват чак толкова надясно че да се нулира или просто защото конкретния бит си е 0 и така или иначе не влияе на крайния резултат
от тук извода че примерите са повече от перфектни т.к. покриват всички случаи
Цикъла while е напълно излишен, а ако наистина го искаш направи една проверка след 5-6 въвеждания на код спре.
uint number; bool result = uint.TryParse(line, out number); - по-този начин не пестиш място, а кода става трудно четим. Можеш да напишеш на един
ред променливи когато са от един тип, пример: int a = 4, b = 6, c = 44, t, y, u;
Защо постоянно пишеш line = Console.ReadLine();, задачата трябва да е направиш колко се се може по-кратка и лесна за разбиране, а не максимално дълга
Това:
line = Console.ReadLine();
int p;
result = int.TryParse(line, out p);
е еквивалентно на:
int p;
result = int.TryParse(Console.ReadLine(), out p);
Това е много кофти, грешно и трудно четим код -
line = Console.ReadLine(); int q; result = int.TryParse(line, out q);
може да го напишеш като горният пример само на два реда.
bool result = uint.TryParse(Console.ReadLine(), out number);
if (result == false)
{
Console.WriteLine("\nThis is not a valid input for uint number!\n\n");
}
може да го напишеш по този начин:
while (!uint.TryParse(Console.ReadLine(), out number)) Console.WriteLine("\nThis is not a valid input for uint number!\n\n");
така ще си спестиш if-а, и ще съкратиш много кода. Правиш 4 проверки с if, ако от всяка проверка спестиш по 5+ реда са 20+ реда по-кратък код, с празните редове който оставяш стават 40+ реда.
Редно е променливите който се изпозват вътре в цикъла да се намират в самият цикъл, а не извън него.
int bitPValue;
int bitQValue;
uint maskP;
uint maskQ;
Друг много пример за много лошо написан код:
int maxValueOfK; if (p > q)
{
maxValueOfK = 32 - p;
}
else
{
maxValueOfK = 32 - q;
}
не можа ли да свалиш този if на другия ред.
Ще вечерам и после ще продължа да търся грешката/ките в кода, с промените стигнах до тук.
Цикъла while е за да не стартирам програмата непрекъснато , а да се върти непрекъснато и да мога да нанясам стойностите по-бързо и лесно .
Програмата си дава всички стойности верни - никаква нула ! Само третеят пример е различен и то е защото е грешен .
Защо пък ,това сда е пример за лош код ? Това пък откъде го измисли ?
А това с променливете ,че трябвало да бъдат в цикъла и да се пишат на един ред - пълни глупости !
Има най-различни променливи и някои са пишат в цикъла - някой не, защо като не разбираш нищо - си се заел да критикува ?
Това което наричаш лош код е само за информация на потребителя , да знае какво К да нанася и е екстра от мен , към програмата .
Аз приключих с тази задача .- за мен си е отлична !
Я, дай твоя код да го видя ?
В първият си коментар съм дал линк към моят код, тествах ти кода и дава 0 на първият и третият тест. Какво да кажа за кода ти, много е разтегнат, имаш по няколко променливи от различен тип на един ред. Но тези неща вече съм ги написал по-горе, чети коментарите ако обичаш.
И ако щи 1000 минуса да сложите - задачата си работи !
Прости вие не разбирате как ! Даже и да я копирате правилно не умеете !
Аз съм онлайн и на мен не ми трябват плюсове - ха ха ха !
Не може всички останали отговори да са ми верни и кода да е грешен !
Айде намерете грешка - всезнайковци !
Дайте да видя вашите решения , как дават този отговор , много ми е интересно ?
как можеш да упорстваш че не ти е грешен кода, след като толкова народ потвърдихме че примера е абсолютно точен, което автоматично означава че кода ти е неточванен или непълен както искаш, задачата не си я решила, ако мислиш, че си приключила и не приемаш критика, толкова по лошо, когато отидеш на изпита няма с кой да спориш, там оценяването е машинно и автоматично, а пък ти колкото искаш спори с машината че заслужаваш пълен брой точки :)
Виж какво Любо - кода съм си го писала сама , ред по ред , не съм го копирала от някъде си като теб и много добре знам какво прави всеки ред и какво дава програмата - тествала съм я поне 20 пъти , както написах по-горе и със стойностите от 15 задача и си работи и приключвам с този въпрос .
Тези стойности които си пуснал ха ха ха - не са от моя код !Моите са същите като от примерите - освен третият !
Дай по добре твоят код , ама май нямаш такъв !
на няколко места съм ти написал проблема, но ти просто не желаеш или да четеш или да признаеш че ти е грешен кода, все пак ще повторя:
1.имах същата грешка, абсолютно същия резултат получавах и открих че кода ми е грешен, оправих го и получавам точно като в примера
2.реалния отговор минус твоя отговор е = 1907751121-1907749073 = 2048
ако още не се сещаш това е 2 на 11 степен, т.е. 12 бит отдясно наляво го губиш, това пък означава че, движиш маската много надясно/наляво и реално го нулираш,
при другите числа на се получава или защото не отиват чак толкова надясно/наляво че да се нулират или просто защото конкретния бит си е 0 и така или иначе не влияе на крайния резултат
от тук извода че примерите са повече от перфектни т.к. покриват всички случаи
Не знам какви стойности имаш и какъв код гледаш, омръзна ми.
"Дай по добре твоят код , ама май нямаш такъв !" , вече написах веднъж че в първият си коментар съм дал линк към моето решение. Ето ти още един линк.
п.п. Продължавай в същият дух напред, късмет и успех на изпита.
ето ти онагледено, ако и сега не разбереш къде ти е грешката :) евала
преместила си го с p позиции - 2 и аз така направих и аз сгреших, при другите примери работи, при този не
реално се мести с 32 - q - k = 0 т.е. не се мести наляво, после надясно с p + k = 12, и пак наляво с p = 2
http://dotnetfiddle.net/oCwl42
Ето линк към програмата ми , в твоя линк Любо, има грешка някъде , нещо се е разместило !
Само дето напразно спорихме за резултатите !
Иначе благодаря за линка , за качване на програми ще го ползвам вече !
Сега вече може да ми тествате , решението , колкото си искате исами ще се убедите ,че дава верни отговори ! Аз си правя играта за Падащите камъни - вече е почти готова - елате в темата за 12 задача от следващото домашно да я видите !
аз и Любо получаваме отговора от примера, ти - не = ние сме решили задачата, ти - не
използвай упоритостта си да прочетеш подробния ми анализ на грешките си, за да не плачеш на изпита и се замисли защо единствена имаш отрицателен резултат, та вече е своеобразен рекорд :)
Открих си най- после грешката или по скоро незнанието по въпроса , но пък научих нещо важно !
Битовете, когато се работи с uint , въпреки ,че получават стойностти само 0 или 1 , също трябва да са от тип uint , а не от int , както беше при мен, иначе последният, -32 бит , както е задачата в този пример, става отрицателен ( -1 ), както е при тип int - най-левият бит е запазен за знака - 0 за + и -1 за минус !
Открих го ,като пуснах тест да видя какво става с битовете , предпоследният беше отрицателен -1 - иначе не се виждаше нищо на другите тестове , защото кода беше правилен .
За другите примери няма значение, затова са излизали правилно, само за този има защото с p +k = 22 + 10 = 32 достига последният 32-ят бит, който при нормалният интежер е за знака - (-1) или +(0) .
И тъй като в бит q ,които е на 12 позиция в момента има 1 ,числото вместо да получи 1 в 12 бит и бъде умножено по 2**11 , си остава с 0 в 12 бит и си остава същото.
Сега вече всички примери ми излизат !
И благодарение на грешката, научих нещо важно ! Вярно е ,че човек се учи от грешките си !
Ако бях набутала uint навсякъде, по инерция от самото начало - нямаше да знам сега, какво се случва в действителност в света на битовете !
Ето я задачата готова напълно , с всички резултати излизащи правилно,
кода си е напълно верен и си остава същият ,
само смених типа на битовете от int на uint :
Вместо да ми преписваш коментарите все едно сама си открила грешките, можеше просто да кажеш - мерси!
Типична БГ ситуация: вие ми кажете, ама аз само ше си го открия, айде хубаво! Изобщо, че призна грешка е напредък :)
За Любо - променливите ни трябва да са от тип uint, а не от тип long !
Точно там е трика на задачата !
Не си изпълнил условията на задачата !
Прочете си задачата още веднъж !
За VivaDam - отново пишеш без да провериш предварително, решението ми работи с long както и с uint !
"Точно там е трика на задачата !" - Трика на решението не е там !
"Не си изпълнил условията на задачата !" - напротив изпълнил съм го, ако не си забелязала решението ми работи коректно !
"Прочете си задачата още веднъж !" - чел съм условието многократно !
п.п. Опитвай се да мислиш малко, преди да пишеш нови коментари !!!
Извинявам се за това, което ще напиша( не го приемай като критика, просто от любопитство, не му е мястото даже в тази тема но..), но ми е много чудно наистина как си успяла да събереш толкова много отрицателни гласове в рамките на такова малко време. Пак ти казвам не го приемай като критика, но явно, де да знам, нещо не правиш като хората, когато постваш нови теми и коментираш ( незнам дали е така просто предполагам, не съм ти разглеждал публикациите). Предполагам сигурно трябва да намериш друг подход за работа с форума :) Успех :) ( просто съвет)
Много хубав аватар имаш !
Виж ,какво минусите са тъпотия ! Из целият интернет е пълно с идиоти дето само това правят - слагат минуси - и на видеата на софт уни има вече минуси - не ме интересуват - всеки може да мине по форума и да слага минуси и плюсове - и какво от това ?
Ето аз ти сложих на теб един - и какво от това ?Мога да мина из форума и да ти напраскам на всеки пост минуси - и какво от това ?
За мен е важно ,че напредвам с материала - учила съм страшно много неща в живото си - имам много дипломи в най-различни области - но това сега ми е страшно приятно да го уча и мми доставя удоволствие !
Айде чао ,нямам търпение да си довърша играта !
Не знам , но там имаше long - никъде не видях uint, пък честно казано твоята задача си е твоя работа !Мен ме интересува моята и да уча нови неща всеки ден .
Кода си ми е точно на място и прави точно каквото трябва и аз преключвам с тази задача !
А пък доколкото ,че вие сте ми открили грешката , аз изобщо не съм ви чела коментарите !
Грешката не е грешка , а съвсем нов материал, който се радвам ,че стана така , че научих - това не е преподавано изобщо на лекциите !
Айде ,че днес цял ден изпуснах , искам да си довърша днес играта и 4 домашно !
Следих с огромен интерес цялата тема и дълго се двоумях дали има смисъл и полза да се включа в нея. Все пак реших да го направя, извинения за което. Не ми е особено приятно да се проявявам като хейтър и флеймър, но ми се получава добре.
1. Когато се съмняваш в някое условие или решение, по-нормално е да си формулираш темата като въпрос, дори първо конкретно към някой от преподавателите. Хората, които се занимават с изготвянето на задачите, си имат по-важна работа от търсенето на зелен хайвер. Подозирам, че са видели темата и са си загубили времето напразно.
2. Този форум не е идеалното място да си избиваме комплексите и да се правим на всезнаещи.
3. Всички ние вероятно сме учили най-различни неща, защото са ни били интересни. Предлагам да не си ги мерим, защото ще загубиш служебно (да не кажа язък ти за дипломите). Тук сме за програмиране.
4. За минусчетата, да обясня за тях. Докато ти можеш да дадеш на всеки само по едно, за спорта , то ти може да събереш по едно от всички, от сърце. В реалния живот, в работата, ще се наложи да работиш с колеги, в екип, почти като тук. Желая на теб успех, а на бъдещите ти колеги да бъдат силни духом.
Айде, че днес доста време си загубих с този пост! И макар философски погледнато животът да е процес на губене на време, не е добре да го правим умишлено, особено пък да губим времето на другите.
П. С. Старая се да бъда учтив и директен, но при конфликт между двете винаги избирам второто.
Няма какво да го преглеждаш ,пусни го просто и ще видиш ,че си работи перфектно и с оверфлоу и с оверлапинг !
Открих си най- после грешката или по скоро незнанието по въпроса , но пък научих нещо важно !
Битовете, когато се работи с uint , също трябва да са от тип uint , а не от int , както беше при мен, иначе последният, -32 бит , както е задачата в този пример, става отрицателен ( -1 ), както е при тип int - най-левият бит е запазен за знака - 0 за + и -1 за минус !
Открих го ,като пуснах тест да видя какво става с битовете - иначе не се вижда от другите тестове .
За другите примери няма значение, затова са излизали правилно , само за този има защото достига последният 32 -ят бит, които при интежер е за знака.
Сега вече всички примери ми излизат !
И благодарение на грешката, научих нещо важно ! Вярно е ,че човек се учи от грешките си !
Ако бях набутала uint навсякъде, по инерция от самото начало - нямаше да знам сега какво се случва вдействителност в света на битовете !
Ето я задачата готова напълно , кода си е напълно верен и си остава същият ,
само смених типа на битовете от int на uint :
http://dotnetfiddle.net/k9V1qX