[Homework] C# Basics - Operators Expressions and Statements
Моля Ви да поставяте всичките си въпроси за домашната работа от 3-тата лекция тук, а не да правите по тема за всяка задачка :))
Моля Ви да поставяте всичките си въпроси за домашната работа от 3-тата лекция тук, а не да правите по тема за всяка задачка :))
И здравейте отново. Как да проверя колко цифри има едно число?
Трябва ми за следната проверка на задача 6:
The number has always exactly 4 digits and cannot start with 0.
Опитах с myint.ToString().Lenght
но май не го използвам както трябва.
Ето и моите решения на всичките задачи от домашното без тези със звездичка - тях ще добавя после ЦЪК
Мисля, че работят. Чакам някой да каже, ако нещо съм пропуснала или сбъркала. Мерси :)
UPDATE 28.03.2014
Вече качих и задачите със звездичка плюс корекции.
Anichka , би ли обяснила решението на задача 14 и най-вече следното:
int mask = bitValue << indexP;
int result = numberN | mask;
if (bitValue == 0)
{
mask = ~(1 << indexP);
result = numberN & mask;
}
Благодаря предварително и поздравление за успешно решената задача!
Трета задача ти е грешна. Въведи 0 и ще ти дава True пак. Трябва да използваш логически оператор "&&". Демек да въведеш изключение за нулата. :)
ScreeM,
всъщност по-правилно май е да го напиша така:
int mask;
int result;
if (bitValue == 0)
{
mask = ~(1 << indexP);
result = numberN & mask;
}
else
{
mask = bitValue << indexP;
result = numberN | mask;
}
въпреки че върши същата работа за изхода на конзолата.
GTeoharov,
Това с нулата изобщо не го бях забелязала. Мерси :)
Имам един въпрос към задача 14 - видях че има функция за изкарване бинарния код на числото като стринг. Дали няма да стане ако го изкарам така, разбия го на char-ове, после сменя точно определената позиция с 1 или 0 и пак да го конвертирам към binary формат (тук ще е малко проблемно) като съответно после изведа и полученото число ?
Не съм се замисляла над този вариант, но сигурно е напълно възможно. Ще проверя. Все пак те съветвам да го оставиш като втори вариант на задачата, защото идеята е да упражним побитовите операции.
Забравих да допълня, че варианта с маската е ясен :) Просто мислех и за алтернативно решение.
Аз още упражнявам побитовите - всеки гледа от собствената камбанария :)
Затова не те разбрах правилно.
Хрумна ми нещо със стринг и чарове. Уж работи, но има нужда от още работа по него:
Console.WriteLine("Enter integer number n");
int numberN = int.Parse(Console.ReadLine());
Console.WriteLine("Enter index p");
int indexP = int.Parse(Console.ReadLine());
Console.WriteLine("Enter value 0 or 1 for the bit at index p");
int bitValue = int.Parse(Console.ReadLine());
string strNumberN = Convert.ToString(numberN, 2).PadLeft(16, '0');
Console.WriteLine("Binary representation of n");
Console.WriteLine(strNumberN);
char[] numberNBits = new char[16];
for (int i = 0; i < numberNBits.Length; i++)
{
if (i == strNumberN.Length - 1 - indexP)
{
numberNBits[i] = Convert.ToChar(bitValue.ToString());
}
else
{
numberNBits[i] = strNumberN[i];
}
}
for (int i = 0; i < numberNBits.Length; i++)
{
Console.Write(numberNBits[i]);
}
Console.WriteLine();
От конзолата по-добре да се чете направо стринг и куп други неща, които могат да се променят...
Но засега това измъдрих :)
Моят вариант за 15-та (използвам цикли, за да не преписвам код)
using System;
class BitsExchange
{
static void Main()
{
while (true)
{
uint num = uint.Parse(Console.ReadLine());
for (int i = 0; i < 3; i++)
{
uint mask1 = 1;
uint mask2 = 1;
mask1 = mask1 << 3 + i;
mask2 = mask2 << 24 + i;
mask1 = num & mask1;
mask2 = num & mask2;
mask1 = mask1 >> 3 + i;
mask2 = mask2 >> 24 + i;
if (mask1==0&&mask2==1)
{
num = num & (uint)(~(1 << 24 + i));
num = num | mask2 << 3 + i;
}
else if (mask1==1&mask2==0)
{
num = num & (uint)(~(1 << 3 + i));
num = num | mask1 << 24 + i;
}
}
Console.WriteLine(num);
}
}
}
Ето и моят вариант на 15-та задача:
Сложил съм няколко коментара, но ако има неясноти или критики - коментирайте.
Ето и моето Домашно.Все още не е цялото,но ще качвам другите задачи в последствие.И понеже съм начинаещ ще се радвам ако някой го разгледа и даде мнение на какво ниво е г/д.Благодаря :)
int a = (int)char.GetNumericValue(digit[0]);
Този тип редове от 6 задача много ми харесаха! Имам само едно
единствено предложение за 3-та - можеш да търсиш остатъка направо
от 35 (НОК), а не веднъж от 7 и веднъж от 5.
Както си го направил си работи правилно, просто идея. Успех!
Maka7a, раэгледах домашното ти и видях, че имаш интересни решения. Забеляэах само една малка техническа грешка в задачата Third digit is 7?. След като разделиш въведеното число на 100, трябва да разделиш полученото на 10, a не на 7, иначе програмата не прави коректна проверка. Ето така (digit / 100) % 10 == 7
Имам известен проблем с 14та задача и ще се радвам, ако някой даде идея какво пропускам... Кода ми работи за всички числа с изключение на нулата, защото битовото й представяне естествено е само нули и като поискам да вкарам една единица, тя се инвертира към нула и нещата зацепват. Мъчех се да добавя някакво изключение ако числото е равно на 0, да не ми прави инвертиране, ами директно да вкарва единицата на определената позиция, но нищо не направих (не мога да мисля вече чак :) )
using System;
namespace Modify_a_Bit_at_Given_Position
{
class Bit_at_Given_Position
{
static void Main()
{
int number,position;
int value;
int mask;
Console.Write("Please enter number: ");
number = int.Parse(Console.ReadLine());
Console.WriteLine("Your number in binary format is " + (Convert.ToString(number, 2).PadLeft(16, '0')));
Console.Write("Please enter position: ");
position = int.Parse(Console.ReadLine());
Console.Write("Please enter v (1 or 0): ");
value = int.Parse(Console.ReadLine());
if (value == 1)
{
mask = ~(0 << position);
}
else
{
mask = ~(1 << position);
}
int result = number & mask;
Console.WriteLine("Your new number in binary format is " + (Convert.ToString(result, 2).PadLeft(16, '0')));
Console.WriteLine("Your new number is {0}",result);
}
}
}
int result = number
&mask;
Това тук важи само, ако искаш да обърнеш 1 към 0, за да обърнеш 0 към 1 - можеш да ползваш побитов оператор ИЛИ --> |.
Тоест:
if (value == 1)
{
result = number | mask;
}
else if (value == 0)
{
result = number
& mask;
}
А маската ~(0 << position); смени на 1 << position за value == 1.
Като това цялото можеш да го сложиш в горните if-ове за да не пишеш втори път едни и същи if-ове.
Надявам се да съм помогнал.
Пропуснал съм как се ползва или-то. Мерси :)
Искам да попитам дали може малко да ми разясните условието на самата задача, защото не успявам да разбера каква е идеята?
Хванах се днес и написах набързо 16-та задача. Направил съм и някои шукарийки (цвят на резултата).
Ето кода: http://pastebin.com/M0qrrP1w.
Сложил съм няколко коментара, за да разгранича кой код за какво е.
Ако помогне на някого, ще се радвам.
Ако имате критики - не ги пестете.
EDIT №1: Всъщност сега забелязах, че формулата за overlapping, ми е грешна и сега ще я променя.
EDIT №2: Overlapping формулата е оправена.
Формула за Overlapping: (p + k - 1) <= k
Формула за Out of range: (p + k - 1) > 31 || (q + k) > 31
Не знам дали е чийтване, но я реших изцяло със стрингове,
опитах с побитови операции, стигнах до половината и пробвах по този начин.
Изглежда, че работи :)
може ли малко помощ за 13 задача Check a Bit at given position
using System;
class CheckBitGivenPosition
{
static void Main()
{
Console.WriteLine("Enter the integer number: ");
int number = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Enter the bit at position: ");
int bitP = int.Parse(Console.ReadLine());
int changeNumber = number << bitP;
bool results = (changeNumber & 1) == 1;
Console.WriteLine("bit at position p have value 1? - {0}",results);
}
}
къде греша
Смени посоката на стрелката. Вместо int changeNumber = number << bitP; го направи int changeNumber = number >> bitP;
Поздрави :)
вярно къде съм спал
благодаря за корекцията
Трябва да работи, поне при мен работи:
int n = myint.ToString().Length;
Освен ако числото не е отрицателно, "-" си го брои за стринг. Math.Abs ти дава абсолютната стойност.
int n = ((int)Math.Abs(myint)).ToString().Length;
Сега вече ще показва броя на цифрите коректно, дори и ако числото е отрицателно.
Ето моето решение аз не проверявам, колко цифри е числото а просто задавам интервал при въвеждане и казвам да е между 1000 и 9999 :). След това създавам 4-ри променливи всяка, от която е съответно първата, втората, третата и четвъртата цифра на числото и си ги принтирам в комбинациите на условието.