2010-08-11 2 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; 
} 

} 

} 

КИ, так что я хотел бы предложить пользователь с PRINTF заявлением, с просьбой, если они хотели бы конвертировать другую температуру, как только они сделали свое первое преобразование.

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

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

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

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

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

ответ

2

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

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

int done = 0; 

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

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


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

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

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

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

[converter release]; 

Таким образом, вы не просочится любую память.


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

+0

Эй, круто, спасибо. Я должен был это сделать уже, мне было поручено это сделать, но я забыл xD. В любом случае, есть ли хорошая ссылка, на которую вы могли бы указать мне, чтобы помочь мне понять концепцию хранения различных частей программы в разных функциях? – Qcom

+1

Ну, я бы не знал, это очень простой (почти) любой язык. Основная идея заключается в том, что вы даете ноль или более аргументов и вызывается одно значение; возвращаемое значение. Поэтому вы можете попытаться сделать 'int getOneInt (char * message) {printf ("% s \ n ", message); ... scanf ... и т. д. return i; } ', который затем получит один int от пользователя, а затем вернет его. Поэтому каждый раз, когда вам нужен int, вы просто делаете 'int a = getOneInt (« теперь, пожалуйста, введите исходный масштаб »);' и ваш основной цикл не будет иметь дело с этими проблемами три раза подряд. – mvds

+0

Извините, если вы имеете в виду добавление некоторых более часто используемых методов в мои файлы классов вместо использования повторяющихся экземпляров printf, как вы только что упомянули, то я уже знаю, что вы имеете в виду. Да, я новый для шо ахаха. – Qcom

Смежные вопросы