[Homework] C# Basics - Operators Expressions and Statements
Моля Ви да поставяте всичките си въпроси за домашната работа от 3-тата лекция тук, а не да правите по тема за всяка задачка :))
Моля Ви да поставяте всичките си въпроси за домашната работа от 3-тата лекция тук, а не да правите по тема за всяка задачка :))
Някой да е стигнал до 15-та задачка? Неед пример.. ;д Зная.. ,че за решението на тази задача трябва да използваме комбинация от задачите за взимане и установяване на бит на определена позиция но.. нещо съм блокирал ;д Трябва ми само с 1 изречение да ми подскажете как да спретна задачата.. аз ще се оправя натам.. Благодаря предварително :))
Има ли мераклии да ми проверят 16 задача, че бая ме замая - ще съм много благодарен, ако някой я изтества още веднъж :)
Току що я свърших и въпреки, че преди това бях решил последната задача от учебника, тази имаше още подводни камъни - гърми при стойности близки до граничните, когато си дефинирал с int, ако дефинираш uint пък започват да пищят bitwise операторите.
Ето и предложение за решението:
Ако някой се навие да проверява, моля да гледа внимателно и дали съм обхванал exception-ите съгласно условието на задачата.
Здравей колега. Признавам, че не съм ти тествал решението но вярвам, че ако ти работи коректо за всичките тестове по домашното и правилно си адресирал проблемите когато битовете ще се overlap-ват или ще бъдат out of range значи всичко трябва да ти е наред. Искам обаче да ти дам няколко насоки за по добро форматиране на кода и в крайна сметка да бъде по четим. Когато искаш да въведеш число в конзолата най-добре да ползваш директно int.Parse(Console.ReadLine()); Има си изключения разбира се но когато имаш нужда да се въвежда просто число най-добре на един ред да се инициализира променливата. Също така забелязах по-надолу в тялото на else statement-а, създаваш променливи но на по долен ред ги инициализираш. Това също може да се направи на един ред и е по четимо. По принцип не е грешно и така както си го направил но обикновено така се прави когато на въпросните променливи ще им придаваш постоянно нови стойности в някой цикъл, докато тук просто 1 път им задаваш стойност и това е :) Изключвам само променливата chngZeroOne - там съм съгласен как си го направил :) Като цяло се опитвай да придаваш на кода си по-добра четимост ако е възможно още докато го пишеш и се старай да е добре форматиран.
Това е моето решение на задачата. Използвал съм един while цикъл, който да разменя бит по бит отколкото да грабне цялото парче от последователни битове и да прави малко извращения с тях :) Надявам се да си ме разбрал и да съм бил от полза.
Към User: HPetrov (points: 112) | 15/03/2014 20:17:22
Задачата ти е много добре описана, подредена и с кратко изчистено решение според мен. Трябва да обърнеш обаче внимание на проверката за overlapping не е коректна:
if (k > firstPos && k > secondPos)
{
Console.WriteLine("Overlapping");
return;
}
и няма да проработи в случай че имаш, числа например p=7;q=8;k=5.
Според мен просто трябва да промениш проверката на
if ((secondPos - firstPos) < k) // - трябва да се извади от по-голямото по-малкото или да се използва модул
{
Console.WriteLine("Overlapping");
return;
}
За съжаление не може да се коментира коментар затова коментирам към User: nikolay.dimov83 (points: 3) | 15/03/2014 17:30:32
Лека!
Прав си за overalapping-а, явно не съм обърнал достатъчно внимание. Мисля, че (Math.Max - Math.Min) < k ще свърши работата или може би даже Math.Abs
Това са решенията ми Линк 15-та и 16-та задача също са решени. Сложил съм и коментари, за да бъде по - ясно. Ако някой намери грешки чакам критики :). За тези, които искат да се помъчат сами на задачите и да не гледат решенията на другите, ето малко допълнителни разяснения:
15 задача - решава се в следните основни стъпки:
За нея най - добре става с маска равна на 7 (последни битове са 111)
1) Запаметяване на битовете от позиция 3,4,5 в една променлива от целочислен тип
2) Запаметяване на битовете от позиция 24,25,26 също в променлива от целочислен тип
3) Нулиране на битовете на числото на позиции 3,4,5
4) Нулиране на битовете на числото на позиции 24,25,26
5) използване на създадените променливи за добавяне на запаметените стойности
16 задача - решава се по същия начин, само че трябва да се заместят числата 3 и 24 с "q" и "p" и маската не е фиксирано число 7, а се калкулира от променливата "k". Аз съм използвал следният израз за калкулиране на маската:
mask = Convert.ToInt32(new string('1',k), 2) -> Този израз създава стринг с толкова единици колкото ни е "k" и след това обръща от стринг в число от целочислен тип. Другата разлика от предната задача е, че трябва да се направят проверки.
Надявам се, че съм бил от полза. Успех! :)
Колега, при проверката за овърлап не трябва да има равно - ако разликата е точно колкото К не се получава застъпване.
Иначе твоя вариант за мска много ми допадна :)
Благодаря за проверката :) Поправих си грешката
На 8 задача за всички числа под 10 ти дава, че са False.
Вкарай и тази проверка:
bool primeCases = ((number == 2) || (number == 3) || (number == 5) || (number == 7));
Един hint и от мен за тези, които се чудят как да си направят маската в зад. 16 (ако ще сменяте цялата редица наведнъж):
Можете да ползвате следната логика, за да си направите цикъл:
00000001 = 1 = 20
00000011 = 3 = 20 + 21
00000111 = 7 = 20 + 21 + 22
00001111 = 15 = 20 + 21 + 22 + 23
..и т.н.
Мойто решение на първа задача с побитови операции http://pastebin.com/HgcvhyTH
Здравейте,
Предлагам Ви алтернативно решение на 10-та задача. Point Inside a Circle & Outside of a Rectangle.
И аз така съм я решил. Само че, може да съкратиш малко, като зададеш да смята само стойности y>1 . Няма сисъл да се занимаваш с целия правоъгълник. Това което ни интерисува се намира над y>1 .
Здравейте, може ли някой да ми обясни тази задача:
Problem 5. Third Digit is 7?
Write an expression that checks for given integer if its third digit from right-to-left is 7.
И по - точно каква е идеята с делението на 100 и след това на 10 и защо остатъкът е третата цифра всъщност?
(математиката не е от най - силните ми предмети)
Ако имаш едно число например 111711 и искаш да вземеш неговата трета цифра го делиш на 100 и се получава 1117.11, но тъй като ние го запазваме в променлива от целочислен тип (int) то дробната част се маха и остава 1117. След това като делиш на 10 с оператор (%) се получава от израза 1117 % 10 = 7, защото от 111.7 се взима само остатъка (7) , докато в обикновеното деление се взима само 111. Надявам се да съм го обяснил разбираемо :D
@ zombiefrog Здрасти,
Идеята е следната първо делим въведеното число от тип int на 100, за да осигурим третата цифра от числото да стане последна. Пример: int x = 65798; Това число като го разделим на 100 ще получим 657, защото числата от тип int са цели числа и остатъка след десетичната запетая се губи, тоест ще получим 657, а не 657.98, ... сега веднага ще попиташ "е и?" :) Тука се появвява нуждата от цялочислено делене на 10. Цялочисленото делена в С# се извършава с оператора %. Делим полученото число цялочислено на 10 и получаваме неговата последна цифра 7 (която е трета за зададеното число 65798), защото дленето % връща като резултат само остатъка от деленето. С други думи изважда последното число което се дели точно на десет от настоящото число, от нашето число 657, последното число делящо се точно на 10 е 650 и 657 - 650 = 7. За този пример твоята програма трява да върне "True" защото третата цифра е 7.
Мерси за обяснението, наистина е изчерпателно и вече смятам, че го разбрах. Лек ден :)
Явно докато съм писал и обядвал едновременно svetli0o ти е отговорил, извинявам се за дублирането и на двамата.
Благодаря и на теб и на svetli0o. Лошо е като си забравил някакви основни неща от математиката, но пък чувството да ги научиш отново, макр и след години е супер :)
С родилни мъки успях да направя моето работещо решение на домашно за 16-та задача с двете звездички. Истината е, че 15 я бях напраил с масиви и ако не беше форума нямаше да мога да реша 16-та. И така да кажа няколко думи за това как съм я решил. Повечето във формума 15-та задача са я решили чрез маска 7 (битово 111), която се отмества на ляво със 24 и с 3 бита и с побитовите оператори & и | си правят две променливи, които пазят резултатите от тези битове. След това зануляват по 3 бита на числото, след 3-тия и 24-тия и им разменят стойностите. По подобен начин става и с 16 задача. Тука проблема е, че се задават от потребителя, броя на битовете, които да се сменят. В 15 бяха постоянно 3 бита и затова се използва маска 7 (битово 111). За 16 задача си направих един стринг, в който се начукват 1-ци, к на брой пъти (подадените битове от потребителя). След което получения стринг го конвертирам в число (маска) и така по стария път на 15 задача.
За да ни е гадно, който е измислил задачата е дал и пример, в който не винаги q e по - голямо от р, поради което съм направил една проверка за по-голямо или равно и програмата наглася стойностите, така че по - голямото да е q и нямам проблем, иначе се получава проблеми при проверките.
Задача 7-въпрос
Здравейте,
Във връзка с решението ми на зад.7 пиша следното:
using System;
class PointInACircle
{
static void Main()
{
Console.WriteLine("x =");
double x = double.Parse(Console.ReadLine());
Console.WriteLine("y =");
double y = double.Parse(Console.ReadLine());
bool inside = (x * x) + (y * y) <= (2 * 2);
Console.WriteLine("These coodinates are inside the circle= {1}",inside);
}
}
Проблема е, че при двата случая когато x e 0 или y e 0, ми излиза като грешка при стартирането на програмата. Логично е,че тези две точки са вътре, но как да го напиша в програмата?
В Console.WriteLine("These coodinates are inside the circle= {1}",inside);
Напиши {0} вместо {1}.
Здравей,
Грешката ти беше в конзолното отпечатване, последен ред. Така работи :) и с координати х = 0 и у = 0 няма проблем :)
class PointInACircle
{
static void Main()
{
Console.WriteLine("x = ");
double x = double.Parse(Console.ReadLine());
Console.WriteLine("y = ");
double y = double.Parse(Console.ReadLine());
bool inside = (x * x) + (y * y) <= (2 * 2);
Console.WriteLine("These coodinates are inside the circle = {0}", inside);
}
Ето как бих те посъветвал да го направиш:
class PointInACircle
{
static void Main()
{
//Console.WriteLine("x =");
Console.Write("x = ");
double x = double.Parse(Console.ReadLine());
//Console.WriteLine("y =");
Console.Write("y = ");
double y = double.Parse(Console.ReadLine());
double radius = 2;
bool inside = (x * x) + (y * y) <= (radius * radius);
//Console.WriteLine("These coodinates are inside the circle = {0}", inside);
Console.WriteLine(inside ? true : false);
}
Въпреки че е против правилата ви благодаря :) Просто 2 очи не виждат като 6 :D
Жокер 1 : Маската трябва да ти е 7 (0000 0111), за да влияеш на 3 бита. Сега вече се опитай по презентацията на Наков да се оправиш.
Ако трябва ще помагам още :)
Не съм още , на 8 съм ,но погледни във файла демо , в личната ти страница за лекции и домашни - там слагат подсказки ! До 2 - 3 часа и аз ще съм на нея и ще коментираме !Приятно решаване !