目标C:无法理解循环的逻辑

如何解决目标C:无法理解循环的逻辑

| 我是Objective C的新手。目前,我正在尝试Objective C中的一些示例。我没有得到正确的输出。我无法理解此处包含的正确输出背后的逻辑。 主目录
#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
    

解决方法

最终的问题是您正在使用同一事务对象。您只需在此行上设置一次交易,就永远不会在其他任何地方设置它。我确实从您的评论中看到曾经是正确的。
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;
}
现在,我没有检查您的美元金额是否正确,但这应该可以打印出正确的转换/收费顺序。我也没有假设有垃圾收集,所以我只添加了所有发行版。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?