2010-08-11 3 views
2

간단한 루프를 추가하여 Objective-C의 온도 눈금 변환 콘솔 프로그램에 "재생 가치"를 추가하려고합니다.목표 -c에서 처음으로 프로그램 루프 만들기

지금, 여기 내 현재 main.m 파일에 대한 코드입니다

#import <Cocoa/Cocoa.h> 
#import "class.h" 

int main(int argc, char *argv[]) 
{ 
int result; 
int prompt, prompt2, sourceTempText; 
double sourceTemp; 

printf("Please choose a source temperature scale:\n[1] Fahrenheit\n[2] Celsius\n[3] Kelvin\n[4] Rankine\n\n"); 

result = scanf("%i", &prompt); 

if (result != 1) 
    printf("I couldn't understand your input, I need only one number!"); 

else if (result == EOF) 
    printf("I apologize, I encountered an error when trying to read your input."); 

else if (result == 1) 
{ 
printf("\nNow, please enter the temperature you would like to convert:\n\n"); 

scanf("%lf", &sourceTemp); 

Temperature *converter = [[Temperature alloc] init]; 

switch (prompt) 
{ 
    case 1: 
    //end-user chooses Fahrenheit 
    [converter setFahrenheitValue:sourceTemp]; 
    sourceTempText = 1; 
    break; 

    case 2: 
    //end-user chooses Celsius 
    [converter setCelsiusValue:sourceTemp]; 
    sourceTempText = 2; 
    break; 

    case 3: 
    //end-user chooses Kelvin 
    [converter setKelvinValue:sourceTemp]; 
    sourceTempText = 3; 
    break; 

    case 4: 
    //end-user chooses Rankine 
    [converter setRankineValue:sourceTemp]; 
    sourceTempText = 4; 
    break; 
} 

printf("\nNow, please choose a target temperature scale:\n[1] Fahrenheit\n[2] Celsius\n[3] Kelvin\n[4] Rankine\n\n"); 

scanf("%i", &prompt2); 

char *scales[4] = { "Fahrenheit", "Celsius", "Kelvin", "Rankine" }; 

switch (prompt2) 
{ 
    case 1: 
    //end-user chooses Fahrenheit 
    printf("%lf degrees %s is %lf degrees Fahrenheit\n", sourceTemp, scales[prompt-1], [converter fahrenheitValue]); 
    break; 

    case 2: 
    //end-user chooses Celsius 
    printf("%lf degrees %s is %lf degrees Celsius\n", sourceTemp, scales[prompt-1], [converter celsiusValue]); 
    break; 

    case 3: 
    //end-user chooses Kelvin 
    printf("%lf degrees %s is %lf degrees Kelvin\n", sourceTemp, scales[prompt-1], [converter kelvinValue]); 
    break; 

    case 4: 
    //end-user chooses Rankine 
    printf("%lf degrees %s is %lf degrees Rankine\n", sourceTemp, scales[prompt-1], [converter rankineValue]); 
    break; 
} 

} 

} 

OK, 그래서 나는 그들이 할 것인지를 묻는의 printf 문을 사용하여 사용자에게 메시지를 표시하고 싶습니다 그들이 처음으로 전환을 한 후에 다른 온도로 변환하십시오.

프롬프트에서 최종 사용자에게 0을 눌러 프로그램을 종료하거나 1을 눌러 다른 변환을 요청할 것입니다.

내 첫 번째 성향은 일단 최종 사용자가 자신의 선택을 입력하면 scanf에서 0 또는 1로 설정 될 정수 변수를 선언하는 것이 었습니다.

그런 다음 새 변수 == 1이면 처음으로 되돌아갑니다. 그렇지 않으면 프로그램을 종료합니다.

아주 간단합니다.

궁금한 점은이 프로그램을 루프하는 더 효율적인 방법이 있는지, 아니면 지금 당장 가지고있는 기본 지식으로는 좋은 방법인지 궁금합니다.

답변

2

예, 루프에 넣을 수 있으며 루프 종료 직전에 종료 질문에 답할 수 있습니다. 대답에 따라 단지 exit(0) 일 수 있습니다. 또는 첫 번째 질문에이를 통합 할 수 있습니다. 1 = 화씨, 2 = ..., 0 = 종료.

루프는 while(1) { ... } 일 수 있습니다. 또 다른 방법은 루프 앞에 변수를 두는 것입니다.

int done = 0; 

다음 루프를 while (!done) { ... }으로 만듭니다. ("완료되지 않은 동안"이라고 읽음). 루프가 끝나면 done=1으로 설정하면 루프가 종료됩니다.

은 (명확성을 위해 : 그것은 단지 전체 { ... } 블록을 완료 한 후 종료됩니다,하지만 당신은 그것을 발견 할 것이다 - 당신은/(읽기 요청해야 그 시점에 올 경우)에 대한 continuebreak)


고려해야 할 몇 가지 사항이 있습니다. 루프를 정리해야합니까? 여기

Temperature *converter = [[Temperature alloc] init]; 

일부 메모리를 할당합니다. 다시 루프하는 경우 더 많은 메모리를 할당합니다. 등등 : 이것은 "메모리 누출"이라고합니다. 이것은 메모리 부족으로 프로그램이 중단 될 때까지 계속됩니다 (이 경우에는 오랜 시간이 걸릴 것입니다). 당신이

[converter release]; 

당신이 어떤 메모리를 누출하지 않습니다이 방법을 수행하여, 그것을 완료하면

그래서 당신은 정말 컨버터를 해제해야합니다.그것은 더 크고 더 큰 얻을 때 정확히 무슨 일이 일어나고 있는지 조금 불분명되기 때문에


또한이 별도의 기능에 프로그램의 일부를 넣을 수있는 좋은 순간이 될 것입니다.

+0

안녕하세요. 나는 이미 그렇게 했어야했는데 그렇게하도록 지시 받았지만 xD를 잊어 버렸습니다. 어쨌든 다른 기능에 프로그램의 여러 부분을 저장하는 개념을 이해하는 데 도움이되는 좋은 참고 자료가 있습니까? – Qcom

+1

글쎄, 나는 거의 모든 언어에있어 매우 기본적인 것이다. 기본 개념은 0 개 이상의 인수를주고 그 중 하나의 값이 나옵니다. 반환 값 그래서 당신은'int getOneInt (char * message) {printf ("% s \ n", message); ... scanf ... etc .. return i; }'그러면 사용자로부터 하나의 int를 가져온 다음이를 반환합니다. 따라서 int가 필요할 때마다 int a = getOneInt ("이제 소스 스케일을 입력하십시오.")를 실행하면 메인 루프가 해당 이슈를 연속으로 세 번 처리하지 않아도됩니다. – mvds

+0

죄송합니다. 방금 언급 한 것처럼 printf의 반복 인스턴스를 사용하는 대신 클래스 파일에 일반적으로 사용되는 메소드를 추가하는 것이 의미하는 바는 이미 의미를 알고 있습니다. 그래, 나는 새로운 fo sho ahaha 다. – Qcom