Создание цикла программы впервые в target-c - PullRequest
2 голосов
/ 11 августа 2010

Я пытаюсь добавить «значение воспроизведения», если хотите, в консольную программу преобразования шкалы температур в Objective-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;
 }

 }

}

ОК, поэтому я хотел бы предложить пользователю инструкцию printf, спрашивая его, хотят ли они преобразовать другую температуру после того, как они сделали свое первое преобразование.

В приглашении конечному пользователю будет предложено нажать 0, чтобы выйти из программы, или 1, чтобы выполнить другое преобразование.

Моим первым стремлением было объявить целочисленную переменную, которая будет установлена ​​в 0 или 1 из scanf, как только конечный пользователь введет свой выбор.

Тогда, если новая переменная == 1, то она вернется к началу цикла, если нет - выйдет из программы.

Довольно просто, да?

Просто интересно, есть ли более эффективный способ зациклить эту программу или это хороший способ, по крайней мере, с базовыми знаниями, которые у меня есть сейчас.

1 Ответ

2 голосов
/ 11 августа 2010

Да, вы можете просто поместить это в цикл и задать вопрос о выходе прямо перед концом цикла. В зависимости от ответа, вы можете просто exit(0). Или вы можете интегрировать это в первый вопрос; 1 = Фаренгейт, 2 = ..., 0 = Выход.

Цикл может быть просто while(1) { ... }. Другим подходом было бы иметь переменную перед циклом:

int done = 0;

, а затем перебрать while ( !done ) { ... }. (читать это как "пока не сделано"). В цикле установите done=1, когда закончите, и цикл завершится.

(для ясности: он завершится только после завершения всего блока { ... }, но вы узнаете об этом - если вы дойдете до этого момента, вам нужно прочитать (/ спросить) о continue и break)


Есть несколько вещей, которые следует учитывать: нужно ли очищать ваш цикл? Здесь

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

Вы выделяете немного памяти. Если вы просто выполните цикл снова, вы выделите больше памяти. И так далее: это называется «утечка памяти». Это продолжается до тех пор, пока у вас не закончится память, и программа не будет аварийно завершена (хотя в этом случае это займет много времени).

Так что вы должны действительно выпустить конвертер, когда закончите с ним, выполнив

 [converter release];

Таким образом, вы не потеряете память.


Также это был бы хороший момент, чтобы поместить части вашей программы в отдельную функцию, потому что становится немного неясно, что именно происходит, когда она становится все больше и больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...