2013-07-14 3 views
0

저는 첫 번째 객관적인 C 프로그램을 작성하고 있습니다. Stephen Kochan가 프로그래밍 한 Objective-C 2.0 프로그래밍과 같은 매우 간단한 계산기를 만드는 것입니다.간단한 Objective-C 계산기 프로그램 연속 인쇄

어쨌든 프로그램을 실행할 때마다 계속해서 똑같은 것을 반복해서 인쇄하므로 다른 것을 입력 할 수있는 옵션이 주어지지 않습니다. 코드는 아래에 있습니다. 누군가가 while 루프와 switch 함수 사이에 문제가 있다고 생각하면 도움이 될 것입니다. 미리 감사드립니다. 한마디로

#import <Foundation/Foundation.h> 

@interface Calculator : NSObject { 
    double number, accumulator; 
    char operator; 
} 

    -(void) add: (double) n; 
    -(void) subtract: (double) n; 
    -(void) multiply: (double) n; 
    -(void) divide: (double) n; 


@end 

@implementation Calculator 

-(void) add: (double) n { 
    accumulator += n; 
    NSLog(@"%fl", accumulator); 
} 

-(void) subtract: (double) n { 
    accumulator -= n; 
    NSLog(@"%fl", accumulator); 
} 

-(void) multiply: (double) n { 
    accumulator *= n; 
    NSLog(@"%fl", accumulator); 
} 

-(void) divide: (double) n { 
    if (n == 0) 
     NSLog(@"Error! You can't divide by 0!"); 
    else 
     accumulator /= n; 
     NSLog(@"%fl", accumulator); 

} 

@end 






int main(int argc, const char * argv[]) 

{ 

    @autoreleasepool { 
     double number, accumulator; 
     char operator; 

     Calculator *myCalc = [[Calculator alloc] init]; 

     NSLog(@"Begin calculations by typing a number then S"); 
     scanf("%lf, %c", &accumulator, &operator); 

     while (operator != 'E') { 
      NSLog(@"%lf", accumulator); 
      NSLog(@"What would you like to do next?"); 
      scanf("%lf, %c", &number, &operator); 

      switch (operator) { 
       case '+': 
        [myCalc add: number]; 
        break; 

       case '-': 
        [myCalc subtract: number]; 
        break; 

       case '*': 
        [myCalc multiply: number]; 
        break; 

       case '/': 
        [myCalc divide: number]; 
        break; 

       default: 
        break; 
      } 



      } 

    } 
    return 0; 
} 
+0

NSLog (@ "다음에 하시겠습니까?"); scanf ("% lf, % c", & number, & 연산자); 이것은 끊임없이가는 대신에 이것들에 도달하면 프로그램을 멈추게 할 것입니다. – user2277872

+0

나는 그것을 놓쳤습니다! 하지만 불행히도 여전히 계속 실행 중입니다. 이유는 모르겠지만 ... –

+0

@AshleyElisabethStallings 어, 이전에 언급 한 내용이 어디로 갔는지 모르겠지만 반복하겠습니다. 시도하기 전에 C 언어를 배우는 것이 좋습니다. Objective-C로 시작하십시오 (그리고 여기에는 언어뿐만 아니라 C 표준 라이브러리에 대한 지식도 포함되어 있습니다). 그렇지 않으면 나중에 문제가 발생할 것입니다. –

답변

0

는 : scanf()를 사용하지 않습니다. 당신이 생각하는대로 작동하지 않습니다.

나는 무엇이 잘못되었는지 설명하기 위해 이미 시도했지만, 기본적으로 줄 바꿈과 물건을 좋아하지 않으며 pedantic입니다. SO 검색 similar questions. 쉬운 솔루션은

char buf[0x100]; 
char *end; 

fgets(buf, sizeof buf, stdin); 
accumulator = strtod(buf, &end); 
while (isspace(*end)) 
    end++; 

operator = *end; 

는 또한, 계산기의 논리에 결함이 같은 사실은 뭔가 유용한로 scanf()을 교체하는 것입니다. myCalc 개체는 main() 함수와 동일한 이름의 accumulator 변수를 공유하지 않습니다. 프로그램은 기본적으로 입력 된 첫 번째 숫자를 고려하지 않습니다. 또한 "유형 'S' '부분의 용도가 무엇인지 알지 못하지만 코드에"S "를 입력하는 검사는 없으며 끝 부분에는"E "만 입력하십시오. 보조 노트에


: 우리가 C (기본적으로)에있어,하지만 여전히 식별자로 C++ 키워드를 사용하는 것은 좋은 생각이 아니다. newoperator을 예약하십시오. 변수 op을 호출하십시오. 또한

, 디자인 개선 등을 수행 할 수 있습니다 멀리에 큰 switch계산기 클래스, 당신은 [myCalc performOp:'+' withNumber:number];

+0

정말 고마워요! 나는이 모든 것을 시험해 볼 것이므로 잘하면 그것이 효과가있을 것이다! 그리고 나는 "S"가 실제로 이해가되지 않는다는 데 동의하지만이 책에서 제안 된 문제를 해결하기 위해 노력하고 있습니다. 하하지만 고마워 !! –

+0

@AshleyElisabethStallings 환영합니다. –

0

scanf 같은 것을 쓸 수있는 그런 식으로 사용하는 나쁜 기능은 일반적으로 추상적 인. 일반적으로 입력 라인을 문자열로 읽은 다음 문자열에 sscanf (또는 다른 구문 분석기)을 사용하는 것이 일반적입니다.

그러나이 경우 해결 방법은 간단합니다. scanf은 성공적으로 할당 된 입력 항목 수를 반환합니다. 너는 둘을 기대한다. 오류가 있거나 파일 끝에 도달하면 2보다 작습니다. 따라서 :

 int rc = scanf("%lf, %c", &number, &operator); 
     if (rc < 2) { 
      break; 
     }