在objective-c中首次创建程序循环

在objective-c中首次创建程序循环,c,objective-c,loops,C,Objective C,Loops,我试图通过添加一个简单的循环向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 so

我试图通过添加一个简单的循环向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;
 }

 }

}
#导入
#导入“class.h”
int main(int argc,char*argv[])
{
int结果;
int提示符、prompt2、sourcetentext;
双源温度;
printf(“请选择源温度标度:\n[1]华氏\n[2]摄氏\n[3]开尔文\n[4]兰金\n\n”);
结果=scanf(“%i”,&prompt);
如果(结果!=1)
printf(“我无法理解您的输入,我只需要一个数字!”);
否则如果(结果==EOF)
printf(“很抱歉,我在尝试读取您的输入时遇到了错误。”);
else if(结果==1)
{
printf(“\n现在,请输入要转换的温度:\n\n”);
scanf(“%lf”、&sourceTemp);
温度*转换器=[[温度分配]初始];
开关(提示)
{
案例1:
//最终用户选择华氏温度
[转换器设置华氏值:源温度];
sourcetestext=1;
打破
案例2:
//最终用户选择摄氏度
[转换器设置CelsiusValue:sourceTemp];
source=2;
打破
案例3:
//最终用户选择开尔文
[转换器设置值:sourceTemp];
source=3;
打破
案例4:
//最终用户选择Rankine
[转换器设置值:sourceTemp];
source=4;
打破
}
printf(“\n现在,请选择一个目标温度标度:\n[1]华氏\n[2]摄氏\n[3]开尔文\n[4]兰金\n\n”);
scanf(“%i”和prompt2);
字符*刻度[4]={“华氏”、“摄氏”、“开尔文”、“兰金”};
开关(prompt2)
{
案例1:
//最终用户选择华氏温度
printf(“%lf度%s是%lf华氏度”\n),sourceTemp,scales[prompt-1],[converter fahrenheitValue]);
打破
案例2:
//最终用户选择摄氏度
printf(“%lf摄氏度%s是%lf摄氏度\n”),sourceTemp,刻度为[prompt-1],[converter celsiusValue]);
打破
案例3:
//最终用户选择开尔文
printf(“%lf度%s为%lf度开尔文”\n),源温度,刻度[prompt-1],[converter Kelvin值];
打破
案例4:
//最终用户选择Rankine
printf(“%lf度%s是%lf度Rankine\n”),sourceTemp,scales[prompt-1],[converter Rankine value]);
打破
}
}
}

好的,我想用printf语句提示用户,询问他们是否希望在完成第一次转换后转换另一个温度

提示将要求最终用户按0退出程序,或按1进行另一次转换

我的第一个倾向是声明一个整数变量,一旦最终用户输入了他们的选择,它将从scanf设置为0或1

然后,如果新变量==1,那么它将循环回开始,如果不是,它将退出程序

很简单吧


我只是想知道,有没有一种更有效的方法来循环这个程序,或者这是一种好方法,至少从我现在的基本知识来看。

是的,你可以把它放在一个循环中,在循环结束之前问退出问题。根据答案,您可以退出(0)。或者你可以把它整合到第一个问题中;1=华氏度,2=华氏度,0=华氏度

循环可以是
,而(1){…}
。另一种方法是在循环之前有一个变量:

int done = 0;
然后在(!done){…}时循环
。(读作“未完成时”)。在循环中,完成后设置
done=1
,然后循环将终止

(为了清楚起见:只有在完成整个
{…}
块后,它才会终止,但您会发现-如果您达到这一点,您需要阅读(/ask)关于
继续
中断


有几件事需要考虑:您的循环是否需要清理?这里

 Temperature *converter = [[Temperature alloc] init];
你可以分配一些内存。如果您只是再次循环,您将分配更多内存。以此类推:这被称为“内存泄漏”。这种情况一直持续到内存耗尽,程序就会崩溃(尽管在这种情况下需要很长时间)

所以你应该在完成转换后,通过

 [converter release];
这样就不会泄漏任何内存



另外这将是一个将程序的各个部分放在一个单独函数中的好时机,因为当它越来越大时,有点不清楚到底发生了什么。

嘿,太酷了,谢谢。我真的应该已经这样做了,我被指示这样做,但我已经忘记了xD,无论如何,有没有一个好的参考,你可以告诉我,以帮助我了解存储在不同功能的程序不同部分的概念?嗯,我不知道,这是非常基本的(几乎)任何语言。基本概念是,你给出零个或多个参数,然后得出一个值;返回值。因此,您可以尝试使
intgetoneint(char*message){printf(“%s\n”,message);…scanf…等返回i;}
,然后从用户处获取一个int,然后返回它。所以每次你需要一个int,你只要做
inta=getOneInt(“现在请输入源代码比例”)和您的主循环将不必连续三次处理这些问题。对不起,如果您的意思是向我的类文件中添加一些更常用的方法,而不是像您刚才提到的那样使用printf的重复实例,那么我已经知道您的意思。是的,我是新来的fo sho ahaha。它不需要是objective-C类,你也可以在main.C中创建一个额外的函数,就像
intmain(intargc,char**argv){…}
也是一个函数。噢,duh!啊哈,有时候我会忘记我真正在用什么编程。你是说梅因吗?我想?