如何解决目标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 举报,一经查实,本站将立刻删除。