如果你想通过添加一个简单的循环来使用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要进行另一次转换。
我的第一个倾向是声明一个整数变量,一旦最终用户输入了他们的选择,它将从scanf设置为0或1。
然后,如果新变量== 1,那么它将循环回到开头,如果没有,它将退出程序。
很简单,是吗?
只是想知道,是否有一种更有效的方式来循环这个程序,或者这是一个好方法,至少我现在拥有的基本知识。
答案 0 :(得分:2)
是的,您可以将其置于循环中,并在循环结束前询问退出问题。根据答案,您可以exit(0)
。或者你可以将它整合到第一个问题中; 1 =华氏度,2 = ......,0 =退出。
循环可能只是while(1) { ... }
。另一种方法是在循环之前有一个变量:
int done = 0;
然后循环while ( !done ) { ... }
。 (读作“未完成时”)。在循环中,完成后设置done=1
,然后循环将终止。
(为了清楚起见:它将在完成整个{ ... }
块之后终止,但你会发现 - 如果你到了那一点,你需要阅读(/询问)continue
和break
)
有几点需要考虑:你的循环需要清理吗?这里
Temperature *converter = [[Temperature alloc] init];
你分配一些内存。如果你再次循环,你将分配更多的内存。等等:这被称为“内存泄漏”。这种情况一直持续到内存不足并且程序崩溃(尽管在这种情况下需要很长时间)。
所以你应该通过
完成释放转换器 [converter release];
这样你就不会泄漏任何记忆。
这也是将程序的某些部分放在一个单独的函数中的好时机,因为当它变得越来越大时,它会变得有点不清楚。