Objective C Loop - PullRequest
       10

Objective C Loop

1 голос
/ 09 октября 2011

Я пытаюсь зациклить этот код, пока yser не наберет DONE. Я использовал цикл while, но выполняются только части встроенного цикла while. Почему первая подсказка (введите имя) не выполняется в следующей программе? Спасибо

int main (int argc, char *argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int number;
    int i = 1;
    double payRate, hours, totalPay;
    NSString *name;
    NSString *amount;
    char inputBuffer[200];

    NSNumberFormatter *price = [[NSNumberFormatter alloc] init];
    [price setNumberStyle:NSNumberFormatterCurrencyStyle];
    [price setCurrencySymbol:@"$"]; 

    while(i > 0){
        NSLog (@"Enter the name:");
        scanf("%[^\n]", inputBuffer);
        name = [[NSString alloc] initWithUTF8String:inputBuffer];

        if([name isEqualToString:@"DONE"])
            break;
        else{
            NSLog (@"Enter the total number of hours: ");
            scanf ("%lf", &hours);

            NSLog (@"Enter the pay rate: ");
            scanf ("%lf", &payRate);

            if(hours <= 40)
                totalPay = hours * payRate;
            else
                totalPay = 400 + (payRate * (hours - 40) * 1.5);

            NSString *myString = [NSString stringWithFormat:@"%f",totalPay];

            NSNumber *myNumber = [NSNumber numberWithDouble:[myString doubleValue]];
            amount = [price stringFromNumber:myNumber];

            NSLog(@"Name: %@", name);
            NSLog(@"Hours:%.2lf", hours);
            NSLog(@"Pay Rate:%.2lf",payRate);
            NSLog(@"Total Pay:%@", amount);

            NSLog(@"\n");
        }

    }

    NSLog (@"DONE!");

   }

Ответы [ 2 ]

2 голосов
/ 09 октября 2011

Ваша проблема может быть связана с рядом проблем с буферизацией, таких как scanf() номера, но не со следующими переводами строки.Кроме того, я иногда нахожу, что NSLog() беспорядок буферизации stdin / stdout, если вы также используете printf() или scanf().Обычно я считаю, что лучше по возможности избегать функции scanf(), особенно когда используется язык более высокого уровня, такой как Objective-C.

Вместо использования scanf() для чтения пользовательского ввода, я написал небольшую функциюпрочитать строку из консоли и вернуть ее как NSString.Эта функция выглядит следующим образом:

NSString * readLine (FILE * input) {
    NSMutableString * string = [[NSMutableString alloc] init];
    int aChar = 0;
    while ((aChar = fgetc(input)) != EOF) {
        if (aChar != '\r') {
            if (aChar == '\n') {
                break;
            } else if (aChar > 0) {
                [string appendFormat:@"%C", aChar];
            }
        }
    }
    return [string autorelease];
}

Используя эту функцию, вы можете переписать вашу функцию main(), используя этот новый метод.В следующем коде я также убрал все операторы NSLog(), которые запрашивают у пользователя информацию, заменив их более подходящими printf() вызовами.

int main (int argc, char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    double payRate, hours, totalPay;
    NSString * name;
    NSString * amount;

    NSNumberFormatter * price = [[NSNumberFormatter alloc] init];
    [price setNumberStyle:NSNumberFormatterCurrencyStyle];
    [price setCurrencySymbol:@"$"]; 

    while (YES) {
        printf("Please, enter your name: ");
        name = readLine(stdin);

        if ([name isEqualToString:@"DONE"])
            break;
        else {
            printf("Enter the total number of hours: ");
            hours = [readLine(stdin) intValue];

            printf("Enter the pay rate: ");
            payRate = [readLine(stdin) intValue];

            if (hours <= 40)
                totalPay = hours * payRate;
            else
                totalPay = 400 + (payRate * (hours - 40) * 1.5);

            NSNumber * myNumber = [NSNumber numberWithDouble:totalPay];
            amount = [price stringFromNumber:myNumber];

            NSLog(@"Name: %@", name);
            NSLog(@"Hours: %.2lf", hours);
            NSLog(@"Pay Rate: %.2lf",payRate);
            NSLog(@"Total Pay: %@", amount);
        }
    }

    [price release];
    NSLog(@"DONE!");

    [pool drain];
}
1 голос
/ 09 октября 2011

In: scanf("%[^\n]", inputBuffer);, который ничего не читает от пользователя, вам нужно прочитать от пользователя в inputBuffer.

Также NSLog не является хорошим способом отправки текста пользователю, вероятноиспользуйте функции "C", так как вы пишете программу "C".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...