[Homework] C# Basics - Operators Expressions and Statements
Моля Ви да поставяте всичките си въпроси за домашната работа от 3-тата лекция тук, а не да правите по тема за всяка задачка :))
Моля Ви да поставяте всичките си въпроси за домашната работа от 3-тата лекция тук, а не да правите по тема за всяка задачка :))
Ако някой може да даде идея къде бъркам с решението на задача 8 от Operators and expressions, ще съм много благодарен.
Ето варианта, който измислих: http://pastebin.com/Vh0XU1p1
Проблемът е, че не пресмята правилно - например 78 и 36 ги смята като прости.
Здравейте някой може ли да ми каже защо , в 15 задача не ми дава да използвам uint . Става въпрос за позицията
int firstBitsGroupPosition = 3;//position 3,4,5
int secondBitsGroupPosition = 24;//position 24,25,26
Ето и кода на задачата http://pastebin.com/y98qbCuT тя си работи и дава верни отговори но просто се зачудих , ако някой има идея нека сподели !
The left-shift operator (<<) shifts its first operand left by the number of bits specified by its second operand. The type of the second operand must be an int or a type that has a predefined implicit numeric conversion to int. http://msdn.microsoft.com/en-us/library/a1sway8w.aspx
Хора на 16-та задача последното условие ми е 33 333 333 333 което е над допустимото за uint32.Трябва да направя проверка или е сгрешена задачата(както задача 10)? Мерси предварително.
Да, последното число е над допустимото. И аз много мислех какво да го направя, като според мен out of range трябваше да връща за опита да се въведе bit -1, но в крайна сметка реших да направя проверка и за въведеното число и ако то също e извън допустимите граници също да връща out of range.
Аз искам да предложа на вниманието ви моето решение на задача 6. Four-Digit Number.
Когато зачетох условието, и на мен ми мина мисълта да правя деление на 10, 100 и т.н, но когато видях, че пише "The number has always exactly 4 digits and cannot start with 0.", ми хрумна друго: щом е тъй, защо да се занимавам с деление, с разделяне на string-a и т.н когато имаме един страхотен метод Console.Read() който чете точно един символ? :) Така директно си запазвам още с четенето цифрите в отделни променливи. Е, и точно, защото е символ, се наложи да вадя 48... (защото на символа 0, отговаря числото 48, 1 = 49 и т.н та го вадя за да получа нужната цифра), но е много е семпло и работи. ^^ Работи дори и ако започва с 0, работи и с... букви :D Но както и да е - мисля, че няма смисъл от каквито и да ре проверки, ексепшъни и други неща, щом данните ще са винаги правилни.
Едит:
Всъщност, след днешната лекция, ми хрумна и един друг подобен начин за решението й. Не знам дали е решена по този начин от някой де, но може да приемем и като един string всичко, а после да принтираме стойностите като елемент от масив. Например, за разменени стойности да е нещо такова: Console.WriteLine("{0}{2}{1}{3}", inputNumber[0], inputNumber[1], inputNumber[2], inputNumber[3]). Честно, не съм го тествала де, ама нещо ми подсказва, че ще стане :D
Здравейте, някой може ли да ми каже къде греша в 11 задача. На последната проверка с 62241 ми дава отговор 1, а трябва да е 0. Ето това е кода:
Console.Write("Enter your number: ");
int number= int.Parse(Console.ReadLine());
Console.WriteLine(Convert.ToString(number, 2).PadLeft(16, '0'));
int mask = number << 3;
Console.WriteLine(mask != 0 ? 1 : 0);
Здравей,
в този код, който си написала, винаги ще ти дава отговор 1, с изключение когато числото е 0, защото числото изместено с 3 бита на ляво винаги е различно от 0.
Пробвай да изместиш числото с 3 бита на дясно и след това маската да ти е измественото число И (&) 1 и след това проверката да е дали маската е равна на 1, ако е значи третият бит е 1, ако не е, значи е 0.
Надявам се да съм бил полезен.
Поздрави.
Благодаря, получи се, но все още не мога да си изясня напълно ролята на маската
Ролята на маската е да вземе стойността на даден бит, да нулира даден бит или да даде стойност на даден бит.
Здравейте,
Ето и моите решения на домашното, включително и изпитните задачи включени в него:
05. Problem 1. Third Digit is 7?
10. Point Inside a Circle & Outside of a Rectangle
12. Problem 1. Extract Bit from Integer
13. Check a Bit at Given Position
14. Problem 1. Modify a Bit at Given Position
Изпитните задачи:
Ето на 15 задача Bits Exchange малко по-различно решение. Включил съм методи, за да не преписвам кода 3 пъти. Сигурен съм, че има много по-добър начин на решение, надявам се коментарите ми в кода да са ясни и достатъчно.
https://github.com/Harizanov/CSharp/blob/master/BitsExchange.cs
Това са моите решения плюс някои от изпитните задачи:
Problem 1.Odd or Even Integers
Problem 2.Gravitation on the Moon
Problem 10.Point Inside a Circle & Outside of a Rectangle
Problem 11.Bitwise: Extract Bit #3
Problem 12.Extract Bit from Integer
Problem 13.Check a Bit at Given Position
Problem 14.Modify a Bit at Given Position
Problem 16.** Bit Exchange (Advanced)
Изпитни задачи:
Очаквам вашите мнения и препоръки.
Някой може ли да ми каже как трябва да се формулира кода за 1 и 2-ра задача ?
В какъв смисъл как трябва да се формулира? Имаш нужда от кода или от разяснения по него? Ето го кода на 2-те задачи:
Ако имаш нужда от разяснения по кода (кое от кода какво точно прави) пиши и ще ти го разясня.
Значи какво трябва да разбирам под n % 2 !
Също така Double.Parse и Int.Parse ?
И мерси за кода :)
int.Parse и double.Parse парсват (преобразуват) текст в число. Когато четеш нещо от конзолата (чрез Console.ReadLine()) в C# то се възприема като текст и затова, за да го възприеме програмата като число е нужно да го парснем (преобразуваме) в число, а това става точно чрез int.Parse и double.Parse, като int.Parse преобразува текста в цяло число, а double.Parse преобразува текста в число с плаваща запетая (реално число). Тоест всичко което имаш пред Parse зависи от типа данни, в който искаш да преобразуваш (дали ще е целочислен тип или число с плаваща запетая или друг тип). n % 2 дава остатъка от целочисленото деление на числото n на 2. Тоест ако n е четно число - 12 например, то 12 : 2 = 6 и няма остатък, затова n % 2 = 0 за всички четни числа, а n % 2 != 0 за всички нечетни числа ( != означава различно, тоест не равно). Ако n например е 5 то n % 2 = 1 ( 5 : 2 = 2 целочислено и 1 остатък).
Видях, че в някои решения на задача 15. Bits Exchange се използва long, int вместо uint32, както е в условието на задачата. Мъчих се да реша задачата само с цикъл, понеже още не разбирам масивите. Очаквам коментари относно Решението ми.
UInt32 може да го викнеш като uint :) абсолютно същото е. Обаче между long и uint има 32 бита разлика, а между int и uint е само един бит, така че ако ти трябват повече битове от 32 - uint няма да ти свърши работа. Също така освен ако не се изисква оптимизация може да си ползваш int вместо byte, няма нужда да си усложняваш живота излишно. Първия If може да го пропуснеш, понеже така или иначе няма какво да пропусне с това continue.
Благодаря! :) Първоначално в тази задача превърнах нулите в единици, а единиците в нули. Получи се каша и съвсем обърках условието на задачата, понеже гледах и 19. Bits inverter от предишното домашно, която не успях да реша... та я решавах за втори път. Явно пиша излишни неща, за да съм сигурна, че покривам всички case-ове и да се ориентирам по-добре.
Ако искаш да се ориентирсш по-добре, не е грешно да си слагаш коментари с // или /* */. Добра практика е да са на английски, така който и да гледа кода ще се ориентира пи-лесно също.
Искам да попитам нещо по задачата - Volleyball
Направих я почти,но накрая ми изкарва грешни (близки )числа,ето кода:
using System;
class Volleyball
{
static void Main()
{
string leap = Console.ReadLine();
int numberOfHolidays = int.Parse(Console.ReadLine());
int numberOfweekends = int.Parse(Console.ReadLine());
double totalPlayes = 0;
totalPlayes += numberOfweekends;
totalPlayes += (48 - numberOfweekends) * 3 / 4;
totalPlayes += numberOfHolidays * 5 * 2/3;
if (leap == "normal")
{
totalPlayes += 5.97;
}
Console.WriteLine(totalPlayes);
}
}
Имам числа с плаваща запетая,как да ги закръгля.Пробвах с Math.Round - не се получи или аз не съм го направил правилно.
Здравей, имаш няколко проблема.
totalPlayes += (48 - numberOfweekends) * 3 / 4 не смята правилно, тъй като 3 и 4 са от тип int и при деленето се връща число от тип int. Може да го напишеш double(3)/4. Аналогично и при 2/3.
totalPlayes += numberOfHolidays * 5 * 2/3; Не трябва да има *5(това са броя holidays от първия пример).
if (leap == "normal") трябва да проверяваш да ли е leap, а не normal. И формулата за leap е: totalPlayes *= 1.15;(или totalPlayes += totalPlayes * 15 / 100;).
За принтирането може да напишеш Console.WriteLine((int)totalPlayes);
Здравей. Така както си го направил кода, всяко число, което въведеш, се дели n-1 на брой пъти (n e самото число, което си въвел) като ако има остатък си сложил "prosto" да е равно на 0, което пък да е равно на Prime. Тоест като въведеш 78, последното число, на което го делиш е 77, при което има остатък, съответно "prosto" ти е равно на 0 и съответно ти го изписва като prime.
Защо вместо да го въртиш този цикъл, което е излишно, направо не сложиш деление на числата 2, 3, 5, и 7? Всякакво друго деление е излишно, защото ако едно число се дели на 12 примерно, то ще се дели и на 2. Ако се дели на 9, ще се дели и на 3... и така нататък. Тоест няма да е просто. Излишно е да го делиш на всички възможни числа. Плюс това цикъла ти трябва да спира в момента, в който успееш да го разделиш на едно от всичките числа, с които го делиш. Така направен той си го върти и всеки път сменя стойността на "prosto".
Ако едно число не се дели на 2, 3, 5 и 7, и ако самото число не е едно от тях, и ако е положително, то то е просто.
Не съм много сигурен дали го обясних както трябва. Ако имаш нужда от допълнителни обяснения, пиши.
Ето и един друг подход на задача 8 http://pastebin.com/YY2e7NeH Веднъж като се схване логиката с делителя и става лесно за разбиране, но мисля че може и да се опрости.