首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在目标-c中第一次创建程序循环

在目标-c中第一次创建程序循环
EN

Stack Overflow用户
提问于 2010-08-11 01:34:15
回答 1查看 619关注 0票数 2

我试图添加一些“回放值”,如果你愿意的话,我的温标转换控制台程序在Objective中添加了一个简单的循环。

下面是我当前main.m文件的代码:

代码语言:javascript
复制
#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。

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

很简单吧?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-11 01:48:13

是的,你可以把它放在一个循环中,然后在循环结束之前问出口问题。根据答案,您只需使用exit(0)即可。或者您可以在第一个问题中集成它;1=Fahrenheit,2=.,0= Exit。

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

代码语言:javascript
复制
int done = 0;

然后在while ( !done ) { ... }上循环。(将此理解为“未完成时”)。在循环中,在完成后设置done=1,然后循环将终止。

(为了清楚起见:只有在完成整个{ ... }块之后,它才会终止,但您会发现这一点-如果您到了这一点,就需要阅读(/ask)关于continuebreak的内容)。

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

代码语言:javascript
复制
 Temperature *converter = [[Temperature alloc] init];

你分配了一些内存。如果您再次循环,您将分配一些更多的内存。以此类推:这被称为“内存泄漏”。这种情况一直持续到内存耗尽,程序崩溃(虽然在这种情况下需要很长时间)。

所以你真的应该释放转换器,当你完成它,通过

代码语言:javascript
复制
 [converter release];

这样你就不会泄露任何记忆。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3454704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档