Loading...
imollov avatar imollov 1 Точки

Преобразуване на дадено число от десетична в двоична бройна система.

Здравейте,

Изцяло нов съм в света на програмирането и почнах да чета книгата "Въведение в програмирането със C#". На една от задачите в глава 6 се затруднявам в решението. Става дума за въпрос 12. Напишете програма, която преобразува дадено число от десетична в двоична бройна система. В интеренет намерих информация за начина на преобразуване, а именно: За да превърнем число от десетична в двоична бройна система, трябва да го разделяме на 2, докато частното стане нула като записваме остатъците вдясно (ако числото не може да се дели на 2, записваме единица, а ако може - нула).

Освен това намерих доста решения на задачата, някои са прекалено сложни, други само с метода Convert.ToString(n, 2). Аз обаче искам да използвам само loops и съответно искам да разбера защо моят код не работи, след като то моята логика следвам това, което е записано на теория.

Ето го и моя код:

    Console.Write("Enter N: ");
    int n = int.Parse(Console.ReadLine());
    int divider = 2;
    int a;
     for (int i = n; i <= 0; i /= 2)
      {     
        if (i % divider == 0)
        {
          a = 1;
          Console.Write(a);
        }
     else if (i % divider != 0)
        {
          a = 0;
        Console.Write(a);
        }
      }

Благодаря, предварително.

Тагове:
0
Programming Basics 16/09/2016 09:41:19
AntyfrizZz avatar AntyfrizZz 238 Точки
Best Answer

Здравей,

 

1) Започвай да се учиш да си дебъгваш кода. Ако пуснеш един дебъг ще видиш, че изобщо не влизаш във for цикъла. Оправи го.

2) Като го оправиш погледи и условията завлизане в двата if-а. В момента не са верни.

3) С този метод ще отпечаташ двуично число, но обратно на това, което трябва да се получи. Например за 9 ще получиш 0001, а реално е 1000. Ако все пак държиш на твоя метод, може да измислиш вариант да обърнеш резултата.

 

Поздрави!

 

1
24/08/2016 17:23:31
imollov avatar imollov 1 Точки

Мерси за коментара. Направих леки промени в loop-a и if-овете. Така успях да стигна до момента с обратното получаване на двоичното число. Ето какво направих като корекции, в червено са:

    Console.Write("Enter N: ");
    int n = int.Parse(Console.ReadLine());
    int divider = 2;
    int a;
     for (int i = n; i <!= 0; i /= 2)
      {     
        if (i % divider == 0)
        {
          a = 10;
          Console.Write(a);
        }
     else if (i % divider != 0)
        {
          a = 01;
        Console.Write(a);
        }
      }

Резултатът е следния: при въведено число 66 изкарва 0100001, a коректният резултат е 1000010. Открих примерен код за обръщане:

            Console.WriteLine("Enter a Number");
            int numb = int.Parse(Console.ReadLine());
            int reverse = 0;
            while (numb > 0)
            {
                int rem = numb % 10;
                reverse = (reverse * 10) + rem;
                numb = numb / 10;
               
            }
            Console.WriteLine("Reverse number={0}", reverse);
            Console.ReadLine();
        }

Но в моя код не мога да го имплементирам за да работи както трябва.

0
AntyfrizZz avatar AntyfrizZz 238 Точки

Здравей,

 

За да си обърнеш числото, вместо да принтираш на всяка итерация, го запиши в променлива. Най - лесно ще е ако тази променлива е стринг. След това лесно ще обърнеш и принтираш стринга. Решението, което си намерил е за огледално обръщане на инт, но в двоично число (започващо или завършващо на 0), няма да е ОК.

 

Поздрави!

0
imollov avatar imollov 1 Точки

Здравей,

И пак благодаря за насоките.

От както ми писа се мъча, но стигнах само до тук:

    Console.Write("Enter N: ");
    int n = int.Parse(Console.ReadLine());
    int divider = 2;
    string a = "";
     for (int i = n; i != 0; i /= 2)
      {     
        if (i % divider == 0)
        {
          a = "0";
        }
                 else if (i % divider != 0)
        {
          a = "1";
        }
       Console.Write(a);
      }

Обръщането на стринга, гледайки в нета, не мога да го съчетая с дотук написания ми код. 

0
Rafael avatar Rafael 6 Точки

Предполагам дори не ти дава решение 

Проблема е че loop а ти неможе да се прекрати 

Това се дължи на факта че колкото и да делиш едно число на две то никога няма да стане 0   да не говорим и за по малко

Пробвай с 1 

1/2= 0.5

....

 

Изчакай няколко минути ще ти публикувам и решение

0
24/08/2016 17:21:10
imollov avatar imollov 1 Точки

Прав си. След като въведа n и програмата спира.

0
damyan91 avatar damyan91 91 Точки

Здравей! На пръв поглед, мисля че логиката ти не е много правилна. За конкретната задача май ще е по-добре да се използва while-цикъл. В отделна променлива запазваш остатъка от делението на две (N % 2), който може да е 0 или 1. След това делиш N на 2   (N / 2) докато N e различно от 0. Би било удобно да използваш List, където да добавяш остатъка от делението N % 2. След като излезеш от while цикъла (N = 0) и всички разлики /0 или 1/ са добавени в List-а, трябва да го принтираш в обратен ред. Това на пръв поглед. Може да има и по-лесни решения.  

0
imollov avatar imollov 1 Точки

Благодаря за помощта. yes

Останах си с използването на for и мисля, че се получи. Кода ми съм го сложил като коментар в мненията под и над твоето, ако искаш да видиш как се получи.

0
ivaiva avatar ivaiva 0 Точки

Някой да ми даде съвет как се принтира в обратен ред? Сигурно е супер елементарно, но просто не ми идва на ум :/

Става дума, че искам да принтна "а" в ето тази програма, но в обратна поредност:

        int n = 95;
        int a = 0;
        for (int i = 0; i < 8; i++) {
            a = n % 2;
            n /= 2;
            System.out.print(a);
    }

 

0
21/11/2017 16:50:11
Rafael avatar Rafael 6 Точки

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace binary
{
    class Program
    {
        static void Main(string[] args)
        {
            
                Console.WriteLine("Enter N:");
                int n = int.Parse(Console.ReadLine());
                string ans=null;
                while (n != 0)
                {
                    if (n % 2 == 1)
                    {
                        n -= 1;
                        ans += "1";
                    }
                    else
                        ans += "0";

                    n /= 2;
                }
            Console.WriteLine( Reverse(ans) ); 

        }
        public static string Reverse(string text)
        {
            char[] cArray = text.ToCharArray();
            string reverse = String.Empty;
            for (int i = cArray.Length - 1; i > -1; i--)
            {
                reverse += cArray[i];
            }
            return reverse;
        }

    }
}
 

0
24/08/2016 18:21:23
imollov avatar imollov 1 Точки

Благодаря за кода, който си написал. yes 

Втората част от кода ти ми се стори доста трудна за мен и знанията ми. След доста ровене направих моят код да е по елементарно написан. Ако имаш забележки и критики ще се радвам да ги чуя.

    Console.Write("Enter N: ");
     int n = int.Parse(Console.ReadLine());
     int divider = 2;
     string a = string.Empty;
      for (int i = n; i != 0; i /= 2)
       {    
         if (i % divider == 0)
         {
           a += 0;
         }
          else if (i % divider != 0)
         {
           a += 1;
         }
       }
        string revstr = ""; 
      int length;                 
       length = a.Length - 1;           
        while (length >= 0)               
        {
           revstr += a[length]; 
           length--;
        }
      Console.WriteLine(revstr);

0
Leprikona avatar Leprikona 108 Точки

Разгледай опциите, които предлага C#. Там има най-различни функции, които ти спестяват мъчението сам да мислиш формулата за решаването на някоя задача. В случая можеш да използваш директо функцията "Convert.ToString(int value, int to Base)", където "int value" е числото, което искаш да преобразуваш, а " int to Base" е бройната система, в която да го превърнеш: числото "2" е за двуична бройна система, "8" е за осмична бройна система и "16" е за шестнадесеттичната бройна система.

напр. ако искаш числото 481218 в двуична бройна система се исписва така:

Convert.ToString(481218, 2)

, което ще даде резултат "1110101011111000010".

2
18/09/2016 09:49:36
gabi.ivanova avatar gabi.ivanova 370 Точки

Човекът е написал:
" Освен това намерих доста решения на задачата, някои са прекалено сложни, други само с метода Convert.ToString(n, 2). Аз обаче искам да използвам само loops и съответно искам да разбера защо моят код не работи, след като то моята логика следвам това, което е записано на теория. "

1
16/09/2016 09:43:12
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.