【问题标题】:Creating a program loop for the first time in objective-c在objective-c中第一次创建程序循环
【发布时间】:2010-08-11 01:34:15
【问题描述】:

如果您愿意,我正在尝试通过添加一个简单的循环向我在 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,则循环回到开头,否则退出程序。

很简单吧?

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

【问题讨论】:

    标签: c objective-c loops


    【解决方案1】:

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

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

    int done = 0;
    

    然后循环遍历while ( !done ) { ... }。 (读作“未完成”)。在循环中,完成后设置done=1,然后循环将终止。

    (为了清楚起见:它只会在完成整个 { ... } 块后终止,但你会发现 - 如果你到了这一点,你需要阅读(/询问)关于 continuebreak 的信息)


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

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

    你分配了一些内存。如果你只是再次循环,你将分配更多的内存。依此类推:这称为“内存泄漏”。这种情况一直持续到内存不足并且程序崩溃(尽管在这种情况下需要很长时间)。

    所以你应该真正释放转换器,当你完成它时,这样做

     [converter release];
    

    这样你就不会泄漏任何内存。


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

    【讨论】:

    • 嘿酷,谢谢。我应该已经这样做了,我被指示这样做但我忘记了 xD 无论如何,有没有一个很好的参考你可以指点我来帮助我理解将程序的各个部分存储在不同函数中的概念?跨度>
    • 好吧,我不知道,这对(几乎)任何语言来说都是非常基础的。基本概念是您给出零个或多个参数,然后输出一个值;返回值。所以你可以尝试制作int getOneInt(char *message) { printf("%s\n",message); ...scanf...etc.. return i; },然后从用户那里得到一个int,然后返回它。因此,每当您需要一个 int 时,您只需执行 int a = getOneInt("now please enter source scale");,您的主循环就不必连续三次处理这些问题。
    • 抱歉,如果您的意思是在我的类文件中添加一些更常用的方法,而不是像您刚才提到的那样使用 printf 的重复实例,那么我已经知道您的意思了。是的,我是新来的,哈哈。
    • 不需要是objective-C类,也可以在main.c中创建一个额外的函数,就像int main(int argc, char**argv) { ... }也是一个函数一样。
    • 哦,呵呵!啊哈哈,有时我会忘记自己真正编程的内容。不过你的意思不是 main.m 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 2017-05-16
    • 2016-10-04
    相关资源
    最近更新 更多