Назначение 1 из CS193p - PullRequest
       23

Назначение 1 из CS193p

1 голос
/ 04 февраля 2012

Я недавно начал посещать онлайн-курс по разработке iPhone для Стэнфордского университета в iTunes U.

Сейчас я пытаюсь выполнить домашние задания для первой пары лекций. Я прошел через пошаговое руководство, где я построил базовый калькулятор, но сейчас я пытаюсь выполнить первое задание и, похоже, не могу его решить. Возникли некоторые проблемы:

Попытка реализовать это:

Add the following 4 operation buttons:
• sin : calculates the sine of the top operand on the stack.
• cos : calculates the cosine of the top operand on the stack.
• sqrt : calculates the square root of the top operand on the stack.
• π: calculates (well, conjures up) the value of π. Examples: 3 π * should put
three times the value of π into the display on your calculator, so should 3 Enter π *, 
so should π 3 *. Perhaps unexpectedly, π Enter 3 * + would result in 4 times π being 
shown. You should understand why this is the case. NOTE: This required task is to add π as 
an operation (an operation which takes no arguments off of the operand stack), not a new
way of entering an operand into the display.

Мой код для executeOperation такой:

-(double)performOperation:(NSString *)operation
{
    double result = 0;
    double result1 = 0;
    if ([operation isEqualToString:@"+"]){
        result = [self popOperand] + [self popOperand];
    }else if ([@"*" isEqualToString:operation]){
        result = [self popOperand] * [self popOperand];
    }
    else if ([@"/" isEqualToString:operation]){
        result = [self popOperand] / [self popOperand];
    }
    else if ([@"-" isEqualToString:operation]){
        result = [self popOperand] - [self popOperand];
    }
    else if ([@"C" isEqualToString:operation])
    {
        [self.operandStack removeAllObjects];
        result = 0;
    }
    else if ([@"sin" isEqualToString:operation])
    {
       result1 = [self popOperand];
        result = sin(result1); 
    }
    else if ([@"cos" isEqualToString:operation])
    {
        result1 = [self popOperand];
        result = cos(result1);
    }
    else if ([@"sqrt" isEqualToString:operation])
    {
        result1 = [self popOperand];
        result = sqrt(result1);
    }

    [self pushOperand:result];
    return result;
}

Столкнувшись с некоторыми проблемами, такими как:

  1. я получаю инфу, когда набираю 5 введите 3 /
  2. также не уверен, что мой код для sin, cos и sprt верен?

Ответы [ 3 ]

3 голосов
/ 05 февраля 2012

Поскольку я также изучаю класс в iTunesU, возможно, это поможет.

Первое, что сказал Арно, - правда.

Первый операнд, который вы выберете, должен находиться в знаменателетак что сначала вам придется хранить его в стороне.(также, поскольку это знаменатель, вы должны убедиться, что он не = от 0.) Вы также должны посмотреть на свое вычитание, чтобы убедиться, что порядок операций там правильный.

получая инфу от 5, введите 3 /говорит мне, что ты пропустил одну вещь от прогулки до конца.В работеPressed: в вашем CalculatorViewController вы отправляете enterPressed, если мы находимся в процессе ввода числа?

- (IBAction)operationPressed:(UIButton *)sender {
    if (self.userIsInTheMiddleOfEnteringANumber) {
        [self enterPressed];
    }
    double result = [self.brain performOperation:sender.currentTitle];
    NSString *resultString = [NSString stringWithFormat:@"%g",result];
    self.display.text = resultString;
    self.history.text = [CalculatorBrain descriptionOfProgram:self.brain.program];
}
2 голосов
/ 04 февраля 2012

В вашем подразделении есть одна ошибка.

Если вы введете сейчас «2, введите 4, введите /», вы получите 2 (4/2) в качестве ответа. Должно быть 0,5 (2/4).

Может быть, этот намек поможет.

Вы можете сократить ваши функции до 'result = sin ([self popOperand]); " например.

В любом случае, когда вы застряли, попробуйте использовать NSLog () и вывести интересные значения в консоли. Действительно полезно при отладке.

2 голосов
/ 04 февраля 2012

Я думаю, что вам не хватает вот этой точки:

"Это обязательное задание - добавить π как операцию"

Рассмотрим следующий случай - 3π* должен дать 9,42 в качестве ответа.Согласно вашей executeOperation: при обнаружении '*' стек операнда должен иметь вид

  • 3.14
  • 3

Требуемая задача - это выдобавить π как операцию.Так что, что нужно сделать π-операции, это поместить соответствующее значение в стек и ничего более.Что касается других функций, попробуйте и проверьте с помощью научного калькулятора, чтобы убедиться, что вы реализовали это правильно.

...