좋은질문

C# 잘못된 부분좀 지적 부탁드립니다.

JustineBaek 2014. 9. 24. 00:14

 

 

 

 

입력형식:피연산자 와 연산자 사이 공백없이, ex)123+456
class Program
    {
        static void Main(string[] args)
        {
            int x, y, result = 0;
            char op;
            Console.Write("두 숫자와 연산자를 입력하라 (x+y) : ");
            int p1 = 0;
            int p2 = 0;
            op = (char)Console.Read();

            while(true) {
                x = Console.Read();
                y = Console.Read();

                if(x >= '0' & x <= '9')
                {
                    x = x - '0';
                    p1 = p1 * 10 + x;
                }

                else if (y >= '0' & y <= '9')
                {
                    y = y - '0';
                    p2 = p2 * 10 + y;
                    break;
                }

                else
                {
                    op = (char)x; // 연산자 저장
                }
            } 
             
            switch (op)
            {
                case '+': result = p1 + p2; Console.WriteLine(x + " + " + y + " = " + result);
                    break;
                case '-': result = p1 - p2; Console.WriteLine(x + " - " + y + " = " + result);
                    break;
                case '*': result = p1 * p2; Console.WriteLine(x + " * " + y + " = " + result);
                    break;
                case '/': result = p1 / p2; Console.WriteLine(x + " / " + y + " = " + result);
                    break;
            }
        }
    }
}

실행순서(실행했을때, 수행되는 순서를 제 생각대로 적은것 입니다. 잘못된 부분이 있으면 지적좀 부탁드립니다.)
ex)123+456
1. while문으로 들어가 x값 숫자 123을 넣으면, 1->12->123 이런식으로 저장,  
2. 다음은 숫자가 아닌 문자이므로 if문을 빠져나와 아래 else 문으로 가서, 연산자(+)를 저장,
3. 빠져나온후 두번째 else if문으로 향하여 y 값에 대해 456을 입력하면 순차적으로 4->45->456으로 저장, break문을 통해 빠져나온다.
4. switch문을 통해 p1=123과 p2=456, 문자는 +로 저장된 값들을 switch문을 통해 계산, 
이대로 수행한다면, 제대로 나와야 하지 않나요?? 출력결과는 123+456까지 입력은 받지만 switch문은 실행되지 않는것 같습니다.

 

 

 

 

안녕하세요?

 

1. 아래와 같이 수정하면 잘 동작합니다.

 

2. 아래


... 생략

 

op = (char)Console.Read();   // while문 안에서 x ->op->y 순으로 받아들여야 합니다.       

while(true)
{
     x = Console.Read();

     op = (char)Console.Read();   // 윗 줄에서 안으로 코드를 옮겼습니다.
     y = Console.Read();

 

     // x를 판별 합니다.

     if(x >= '0' & x <= '9')
     {
           x = x - '0';
           p1 = p1 * 10 + x;
     }

  

     // y를 판별합니다. ( elseif -> if로 대체 )
     else if (y >= '0' & y <= '9')

     if (y >= '0' & y <= '9')               // if를 분리하여, x,y 각각 변수를 받습니다.

     {
           y = y - '0';
           p2 = p2 * 10 + y;
           break; // while문 해제에 따라 break 불필요.      
     }
     else// op는 위에서 받았으므로 불필요합니다.
     {
           op = (char)x; // 연산자 저장
     }
}

 

... 생략



//***********************************************************************

// 정리된 전체 코드

//***********************************************************************

 

class Program
{
     static void Main(string[] args)
     {
            int x, y, result = 0;

 

            char op;

 

            Console.Write("두 숫자와 연산자를 입력하라 (x+y) : ");

 

            int p1 = 0;

 

            int p2 = 0;


           x = Console.Read();

 

           op = (char)Console.Read();

           y = Console.Read();

 

           if(x >= '0' & x <= '9')
           {
                x = x - '0';
                p1 = p1 * 10 + x;
           }

 
           if (y >= '0' & y <= '9')
           {
                y = y - '0';
                p2 = p2 * 10 + y;
           }

 

           switch (op)
           {
                case '+': result = p1 + p2; Console.WriteLine(x + " + " + y + " = " + result);
                     break;
                case '-': result = p1 - p2; Console.WriteLine(x + " - " + y + " = " + result);
                     break;
                case '*': result = p1 * p2; Console.WriteLine(x + " * " + y + " = " + result);
                     break;
                case '/': result = p1 / p2; Console.WriteLine(x + " / " + y + " = " + result);
                     break;
          
  }

     }

}

 

3. 기존 코드의 문제점

    -. 콘솔입력 인식 순서 잘못. op를 while문 안으로 이동해야함. x -> op -> y순으로

    -. if~elseif~else 블럭의 논리 오류. x, y변수가 각각 판별되어야 하는데, x만 판별됨.

       그리고는, 또 입력을 전부 받음. 따라서, if x~, if y~로 각각 판별하게 변경함.

    -. op입력이 while문 안으로 들어옴으로써, else 블럭은 불필요.

    -. 위의 기능에서는 while문 불필요. 따라서, while문 해제하고, if y~ 부분 break; 해제.

 

 

도움이 되시길 바랍니다.

감사합니다.

 

 

 

written by

  

legend

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C과외/C#과외/VB과외 프로그래밍 과외.서울인천경기-방문강의.기타전국-화상강의.제대로 체계적으로 배우고싶은분들.15년경력 프리랜서.삼성/포스코/한진 등.

서울,인천,경기,분당,일산,과천,산본,부천,부평,평촌,안산,안양,광명,용인,시흥,성남,수원,평택,오산,화성,동탄,천안,아산,

c#프로그래밍1:1과외, 15년 이상 프로젝트 경력의 프리랜서 직접 강의,

c#프로그래밍 과외, c#프로그래밍교육, IT·컴퓨터·컴퓨터과외비·프로그래밍과외, c# 강좌, c# 프로그래밍,

데이터베이스, 데이터베이스 프로그래밍, db, DB, 과외비,컴퓨터1:1,컴퓨터개인지도,컴퓨터실무과외,컴퓨터과외,컴퓨터1:1과외,

서울,인천,경기,부천,안산,분당,일산,천안,과천,산본,안양,광명,평촌,수원,평택,오산,용인,부평,시흥,성남,화성,동탄

광주,부산,대구,대전,마산,창원,울산,전주,군산,원주,강릉,충청남도,충청북도,강원도,경상남도,경상북도,전라남도,전라북도,제주도