Цель C: не могу понять логику зацикливания - PullRequest
1 голос
/ 14 апреля 2011

Я новичок в Задаче C. В настоящее время я пробую некоторые примеры в Задаче C. Я не получаю правильный вывод. Я не мог понять логику правильного вывода, который я включил сюда.

main.m

#import <Foundation/Foundation.h>
#import "BudObj.h"
#import "Transaction.h"

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

        Budget* europeBudget=[Budget new];
        NSMutableArray *transactions=[[NSMutableArray alloc] initWithCapacity:10];

        [europeBudget createBudget:1000.00 withExchangeRate:1.2500];

        Transaction* aTransaction;
        aTransaction = [Transaction new];
        for(int n=1;n<2;n++){

                [aTransaction createTransaction:n*100 ofType:credit];
                [transactions addObject:aTransaction];

        }

        int n=1;
        while (n<3) {

                [aTransaction createTransaction:n*100 ofType:cash];
                [transactions addObject:aTransaction];
                n++;
        }

        do{
                [aTransaction createTransaction:n*100 ofType:credit];
                [transactions addObject:aTransaction];
                n++;
        }while (n<=3);



        for(Transaction *aaTransaction in transactions){
         switch ([aTransaction returnType]) {
                case cash:
                    [europeBudget spendDollars:[aaTransaction returnAmount]];
                    break;
                case credit:
                    [europeBudget changeForeignCurrency:[aaTransaction returnAmount]];
                    break;
                default:
                    break;
         }
        }


        return 0;
}

BudObj.m

#import <Foundation/Foundation.h>
#import "BudObj.h"
#import "Transaction.h"

@implementation Budget

- (void) createBudget: (double) aBudget withExchangeRate: (float) anExchangeRate{
        budget = aBudget;
        exchangeRate = anExchangeRate;
}


- (void) spendDollars:(double)dollars{
    budget = budget - dollars;
        NSLog(@"Converting %0.2f US Dollars into Foreign Currency leaves $%0.2f",dollars,budget);
}

- (void) changeForeignCurrency:(double)foreignCurrency{
    exchangeTransaction = foreignCurrency * exchangeRate;
        budget = budget - exchangeTransaction;
        NSLog(@"Charging %0.2f in Foreign Currency leaves $%0.2f",foreignCurrency,budget);
}

@end

BudObj.h

#import <Foundation/Foundation.h>

@interface 
Budget : NSObject {

        float  exchangeRate;
        double budget;
        double exchangeTransaction;

}

- (void) createBudget: (double) aBudget withExchangeRate: (float) anExchangeRate;
- (void) spendDollars: (double) dollars;
- (void) changeForeignCurrency: (double) foreignCurrency;

@end

Transaction.h

#import <Cocoa/Cocoa.h>

typedef enum{cash,credit} transactionType;

@interface Transaction : NSObject {

        transactionType type;
        double amount;

}

-(void)createTransaction:(double)theAmount ofType:(transactionType)theType;
-(double)returnAmount;
-(transactionType)returnType;

@end

Transaction.m

#import "Transaction.h"

@implementation Transaction

-(void)createTransaction:(double)theAmount ofType:(transactionType)theType{

        type=theType;
        amount=theAmount;

}

-(double)returnAmount{

        return amount;

}

-(transactionType)returnType{

        return type;

}

@end

ВЫВОД:

2011-04-10 17:31:28.717 BudObj.m[3751:a0f] Charging 300.00 in Foreign Currency leaves $625.00
2011-04-10 17:31:28.719 BudObj.m[3751:a0f] Charging 300.00 in Foreign Currency leaves $250.00
2011-04-10 17:31:28.720 BudObj.m[3751:a0f] Charging 300.00 in Foreign Currency leaves $-125.00
2011-04-10 17:31:28.720 BudObj.m[3751:a0f] Charging 300.00 in Foreign Currency leaves $-500.00

Но ожидаемый результат -

Converting 100.00 US dollars into foreign currency leaves $900.00
Charging 100.00 in foreign currency leaves $775.00
Charging 200.00 in foreign currency leaves $525.00
Charging 300.00 in foreign currency leaves $150.00
Converting 100.00 US dollars into foreign currency leaves $1900.00
Charging 100.00 in foreign currency leaves $1750.00

1 Ответ

1 голос
/ 14 апреля 2011

Ваша главная проблема - вы используете один и тот же объект транзакции.Вы устанавливаете aTransaction один раз в этой строке и никогда не устанавливаете его где-либо еще.Я вижу из ваших комментариев, что когда-то это было правильно.

Transaction* aTransaction;
aTransaction = [Transaction new];

Когда вы добавляете транзакцию в массив, все они указывают на один и тот же объект, и то, что вы когда-либо вносили в то, что вы думаете, это1 aTransaction действительно меняет их всех.Поэтому, когда приходит время печатать, у вас есть несколько ссылок на одну и ту же транзакцию, все типа кредита, и вы продолжаете посылать одну и ту же сумму возврата.

Также помните, что индексы обычно основаны на 0, и int n = 1; может не дать вамправильные числовые элементы, которые вы ищете.

Чтобы получить ожидаемый результат с максимально близким к вашему оригинальному коду, как я могу попробовать это.(возможно, потребуется некоторая настройка)

#import <Foundation/Foundation.h>
#import "BudObj.h"
#import "Transaction.h"

int main(int argc, char *argv[]) {
        Budget* europeBudget=[[Budget alloc] init];

        [europeBudget createBudget:1000.00 withExchangeRate:1.2500];

        Transaction* aTransaction;
        for(int n=1;n<2;n++){

                aTransaction = [[Transaction alloc] init];
                [aTransaction createTransaction:n*100 ofType:cash];
                [transactions addObject:aTransaction];
                [aTransaction release];
        }

        int n=0;
        while (n<3) {
                aTransaction = [[Transaction alloc] init];
                [aTransaction createTransaction:n*100 ofType:credit];
                [transactions addObject:aTransaction];
                [aTransaction release];
                n++;
        }
        //n = 3 at this point
        do{
                aTransaction = [[Transaction alloc] init];
                [aTransaction createTransaction:n*100 ofType:cash];
                [transactions addObject:aTransaction];
                [aTransaction release];
                n++;
        }while (n<=3);

        //n = 4 at this point
        aTransaction = [[Transaction alloc] init];
        [aTransaction createTransaction:n*100 ofType:credit];
        [transactions addObject:aTransaction];
        [aTransaction release];

        for(Transaction *aaTransaction in transactions){
         switch ([aTransaction returnType]) {
                case cash:
                        [europeBudget spendDollars:[aaTransaction returnAmount]];
                        break;
                case credit:
                        [europeBudget changeForeignCurrency:[aaTransaction returnAmount]];
                        break;
                default:
                        break;
         }
        }
        [transactions release];
        [europeBudget release];
        return 0;
}

Теперь я не проверял, правильны ли суммы в долларах, но это должно вывести правильный порядок конвертации / зарядки.Я также не предполагал, что была сборка мусора, поэтому я просто добавил все релизы.

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