안녕하세요 C#으로 이진법 변환 폼을 만들어볼려합니다. 잘안되는데 도움부탁드립니다.

lhu3319의 이미지

10진수 2진수 8진수 16진 텍스트박스를 만듭니다. 10진수 텍스트박스에 decimal 값을 입력하고 변환 버튼 클릭하면 2진수 8진수 16진수 텍스트 박스에 변환된 값이 출력되는 것입니다.
진수변환 함수를 안써보고 만들어볼려합니다. 그리고 int자료형 보다 decimal 자료형을 써볼려고합니다. 효율이 떨어지기는 하지만

일단 제가 생각하는 것은 배열을 만든 후 배열 값에 나머지를 추가하고 마지막 값은 decimal값을 넣고 배열을 역순출력을 할려합니다.
밑에는 제가짜본 코딩인데 잘안되서 오류가 어딘지좀 알려주시면 감사하겠습니다.
private void Convert_Click(object sender, EventArgs e)
{
decimal mod, deci = decimal.Parse(Dec.Text.ToString());

List num = new List();
while (deci != 0)

{

mod = deci % 2;


num.Add(mod);
deci /= 2;

}

num.Reverse(); Binary.Text = "";
foreach (int j in num) { Binary.Text += num[j] + " "; }

}
}
}

HDNua의 이미지

1. 어떤 부분에서 어떻게 오류가 있는지를 말씀해주시는 편이 좋습니다.
예를 들면 "잘 안 된다"라는 것은 좋지 못한 설명이고, "10진수 5를 넣어보았는데 101이 출력되지 않습니다."라고 하면 좋은 설명입니다.

2. decimal은 기본적으로 실수 연산을 합니다. 10을 넣었다고 쳐보죠. 코드 중간에 while (deci != 0)이라는 확인 조건문이 있습니다.
만약 10을 집어넣었다고 치면, 반씩 줄어들게 되니, 10은 5가 될 것입니다. 그런데 그 절반은 얼마인가요?

아마 정수형 나눗셈의 결과를 기대하고 2를 말씀하셨을 수도 있으나, 말씀드렸듯 decimal에 대한 나눗셈은 실수 연산입니다. 2.5가 나옵니다.

같은 방식으로, 1을 2로 몇 번 나눈다고 쳐도 0.5, 0.25, 0.125, ...와 같은 식으로 나오지, 어지간해서는 0이 나오지 않습니다.
실제로는 부동소수점의 표현 범위때문에 결국 0이 나오게는 됩니다만 어찌되건 의도하는 결과는 아닙니다.

그런 측면에서 연구해보셔요. 사실 그냥 int를 쓰시는 걸 추천합니다.

3. 해결은 하지 않고, 코딩에 관한 주석만 달았습니다. 참조하세요.

using System;
/// using System.Collections; // for ArrayList
using System.Collections.Generic;
 
namespace ConsoleApplication3
{
    class Program
    {
        /// <summary>
        /// 10진수를 입력받으면 2진수로 출력합니다.
        /// </summary>
        /// <param name="args">프로그램 인자입니다.</param>
        static void Main(string[] args)
        {
            string input = Console.ReadLine();
            string output = Convert(input);
            Console.WriteLine("{0} converted to {1}", input, output);
        }
 
 
        /// <summary>
        /// 10진수로 입력된 정수 텍스트를 2진법으로 표현한 문자열을 반환합니다.
        /// </summary>
        /// <param name="text">2진법으로 표현할 10진수 문자열입니다.</param>
        /// <returns>2진법으로 표현된 문자열입니다.</returns>
        static string Convert(string text)
        {
            // decimal mod, deci = decimal.Parse(Dec.Text.ToString());
            decimal mod, deci = decimal.Parse(text); // text를 변환하도록 변경
 
            /* List num = new List(); */
            // List는 Generic이라고 하여, 특정 형식에 대한 리스트를 만듭니다.
            // 예를 들어 decimal의 리스트를 만드는 것이 목적이라면 아래와 같이 합니다.
            List<decimal> num = new List<decimal>();
 
            // 그냥 쓰시려면 ArrayList를 사용하셔야 하는데,
            // List<Type>으로 사용하시는 것이 더 일반적이고 편한 방법입니다.
            /// ArrayList _num = new ArrayList();
 
            // 자기만 볼 코드를 짜더라도 주석은 달아주셔요.
            // 나중 가면 주석 안 짠 스스로를 원망하게 됩니다.
            while (deci != 0)
            {
                // 절차:
                // 수를 2로 나눈 나머지를 리스트에 차례대로 넣고
                // 0이 될 때까지 반복합니다.
                mod = deci % 2;
                num.Add(mod);
                deci /= 2;
            }
            // 나머지 순서를 뒤집으면 이진법의 순서대로 출력됩니다.
            num.Reverse();
 
            // Binary.Text = "";
            string ret = "";
            foreach (int j in num)
            {
                // Binary.Text += num[j] + " ";
                ret += num[j];
            }
 
            // 보통 리스트 반복할 때 위와 같이는 잘 안 합니다.
            // 이런 표현 방법도 고려해보세요.
            /**
            // 1. for 반복문
            for (int i = 0; i < num.Count; ++i)
            {
                ret += num[i];
            }
            // 2. foreach about object
            foreach (decimal d in num)
            {
                ret += d;
            }
            */
 
            // 2진수로 표현된 결과를 반환합니다.
            return ret;
        }
    }
}

저는 이렇게 생각했습니다.

익명 사용자의 이미지

항상 부족하다고 생각해야하는데 제가 편하게만 답을 얻을려고 하는것같았씁니다. 죄송하고 감사합니다. 주석다는 습관을 들여야겟네요

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.