简单的Objective-C(适用于C)控制台程序将华氏温度转换为摄氏温度,反之亦然

时间:2010-08-09 05:10:50

标签: c objective-c

我正在Objective-C中编写一个简单的控制台应用程序,但我听说这个编码可能会松散地应用于某些C,所以我想说清楚。

我遇到了一个小问题,但是当我从Xcode中的调试器运行时,出于某种原因,我的程序不会等待用户输入,它只是直接滚动,显示字符串并自动转换数字。 / p>

有这种情况吗?

我是否在if else语句中没有指明正确的内容?

这是我的代码:

//Simple program to convert Fahrenheit to Celsius and Celsius to Fahrenheit

#import <stdio.h>

@interface Converter: NSObject
{
//Instance variable which stores converting formula for objects
double formula;
}

//Declare instance method for setting instance variable
-(double) convert: (double) expression;

//Declare instance method for getting instance variable
-(double) formula;

@end


@implementation Converter;

//Define instance method to set the argument (expression) equal to the instance variable
-(double) convert: (double) expression
{
formula = expression;
}

//Define instance method for returning instance variable, formula
-(double) formula
{
return formula;
}

@end

int main (int argc, char *argv[])
{

//Point two new objects, one for the Fahrenheit conversions and the other for the Celsius conversions, to the Converter class
Converter *fahrenheitConversion = [[Converter alloc] init];
Converter *celsiusConversion = [[Converter alloc] init];

//Declare two double variables holding the user-inputted data, and one integer variable for the if else statement   
double fahrenheit, celsius;
int prompt;

NSLog(@"Please press 0 to convert Celsius to Fahrenheit, or 1 to convert Fahrenheit to Celsius\n ");
scanf("%i", &prompt);
if(prompt == 0) {
    NSLog(@"Please enter a temperature in Celsius to be converted into Fahrenheit!:\n");
    scanf("%lf", &celsius);
    [fahrenheitConversion convert: ((celsius*(9/5)) + 32)];
    NSLog(@"%lf degrees Celsius is %lf Fahrenheit", celsius, [fahrenheitConversion formula]);
}

else {
    NSLog(@"Please enter a temperature in Fahrenheit to be converted into Celsius!:\n");
    [celsiusConversion convert: ((fahrenheit - 32)*(5/9))];
    NSLog(@"%lf degrees Fahrenheit is %lf Celsius", fahrenheit, [celsiusConversion formula]);
}

return 0;
}

更新

看起来Xcode调试器中的控制台没有等待我输入的原因是因为我把它设置为iPhone应用程序,而不是Mac OS X Cocoa,我甚至不记得为什么我这样做了。我真正应该做的只是制作一个没有模板的项目,所以它没有任何期待......

我仍然非常感激并乐于接受像dreamlax这样的建议,而我正在尝试实施你的代码建议,但它比预期的要困难一些,因为我还是很新。

2 个答案:

答案 0 :(得分:2)

当您致电scanf时,请务必检查返回值。然而,它将返回成功扫描的许多项目。在您的应用程序中,您只提供一个参数,因此如果scanf成功,那么它应该返回1.它可以返回另外两个值:

  1. 如果读取输入时出错,或者在成功扫描所有格式说明之前输入已结束,scanf可能会返回EOF
  2. 如果没有与所提供的格式描述相匹配的输入,scanf可能会返回0(如果用户提供了字母字符而不是数字,或者如果用户只是按下输入而没有输入任何内容,则可能会发生这种情况,等)
  3. 您应该检查每个scanf来电的结果并妥善处理。

    int result = scanf("%i", &prompt);
    
    if (result == EOF || result == 0)
    {
        NSLog (@"There was an error reading your choice.");
        exit(1);
    }
    else
    {
        // result should be 1 here, continue onwards doing work
    }
    

    为什么scanf在运行调试器时可能无法返回1,这可能有很多原因,这里有一些我能想到的:

      由于某种原因
    1. stdin已关闭,因此从stdin阅读将始终失败。
    2. 可能会有一些数据通过管道传输到您应用的stdin流中。我不确定这可能来自哪里。
    3. 一些进一步的建议

      如果仅使用一个刻度将温度保存在班级中可能会更好。例如:

      @interface Temperature : NSObject
      {
          double celsius; // only store one temperature
      }
      
      - (id) initWithFahrenheit:(double) f;
      - (id) initWithCelsius:(double) c;
      
      - (double) fahrenheitValue;
      - (double) celsiusValue;
      @end
      
      @implementation Temperature
       - (id) initWithFahrenheit:(double) f
      {
          self = [super init];
          if (!self) return nil;
          celsius = (f - 32)*(5/9);
          return self;
      }
      
      - (id) initWithCelsius:(double) c
      {
          self = [super init];
          if (!self) return nil;
          celsius = c;
          return self;
      }
      
      - (double) fahrenheitValue
      {
          return (celsius*(9/5)) + 32);
      }
      
       - (double) celsiusValue
      {
          return celsius;
      }
      
      @end
      

      然后,如果你有一个fahrenheight值,你可以这样做:

       Temperature *myTemp = [[Temperature alloc] initWithFahrenheit:f];
       double celsius = [myTemp celsiusValue];
      

      看看你是否也可以实施其他温标,例如Kelvin和Rankine!

答案 1 :(得分:0)

您应该在scanf的格式中使用"%d"而不是"%i"

scanf("%d", &prompt);