Простая консольная программа Objective-C (относится к C) для преобразования Фаренгейта в Цельсий и наоборот - PullRequest
0 голосов
/ 09 августа 2010

Я пишу простое консольное приложение в Objective-C, но я слышал, что это кодирование может быть свободно применено и к некоторым C, поэтому я хотел прояснить это.

У меня небольшоепроблема, однако, когда я по какой-то причине запускаю из отладчика в Xcode, моя программа не ждет ввода пользователя, она просто прокручивается, выводит строки и автоматически конвертирует число.

Есть лислучай для этого?

Разве я не указал что-то правильное в своем операторе 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 ]

2 голосов
/ 09 августа 2010

Когда вы звоните scanf, всегда проверяйте возвращаемое значение.Он вернет, однако многие элементы были успешно отсканированы.В вашем приложении вы предоставляете только один аргумент, поэтому, если scanf был успешным, то он должен вернуть 1. Он может возвращать два других значения:

  1. Если произошла ошибка чтения ввода, или есливвод завершился до успешного сканирования всех описаний формата, scanf может вернуть EOF.
  2. Если не было ввода, соответствующего предоставленному описанию формата, scanf может вернуть 0 (это может произойти, если пользовательпредоставил буквенный символ вместо числа, или, если пользователь только что нажал ввод, ничего не печатая и т. д.)

Вы должны проверять результат каждого вызова 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 вашего приложения.Я не уверен, откуда это могло прийти.

Несколько дополнительных советов

Может быть, лучше хранить температуру в своем классе, используя только одну шкалу.Например:

@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

Затем, если у вас есть значение в градусах Фаренгейта, вы можете сделать:

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

Посмотрите, можете ли вы реализовать другие температурные шкалы, такие как Кельвин, иРенкина!

0 голосов
/ 09 августа 2010

Вы должны использовать "%d" в формате для scanf вместо "%i":

scanf("%d", &prompt);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...