初识Objective-C之[简单业务逻辑]

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

//
//  main.m
//  to 
//
//  Created by  的MACPro on 14-8-25.
//  Copyright (c) 2014年  的MACPro. All rights reserved.
//

#import <Foundation/Foundation.h>
#include <stdio.h>

/**习题12:
 自动售货机售货,机器检查纸币或者硬币的特点,有效的硬币是一元,五角,有效纸币是十元,五元,其它货币都认为是假币,将其从退币口退出。当机器接到有效的硬币后,把货币放入到储藏箱中
 
 自动货机装有物品分配器,每个物品分配器,包含了零个或多个价格相同的物品,顾客通过选择物品分配器来选择
 商品,如果物品分配其中有商品,而顾客支付的货币部小于该商品的价格,则商品将被分配到商品传送孔传送给顾客,
 并将零钱返回到退币孔。如果分配器是空的或者机器内没有足够的硬币找零,则和顾客支付的货币值相等的硬币将被从
 退币孔中退回。如果顾客支付的货币值小于所选择的分配器中的商品价格,机器将等待顾客投进更多的货币。如果顾客
 决定不买选择的商品,则和顾客支付的货币值相等的硬币从退币孔退回。
 */


//对象 1.ATM 2.钱 3.商品

//钱对象
@interface Money : NSObject{
@public
    int five;
    int ten;
    int one;
    float _50cents;
@private
    float total;
}
-(BOOL) isIllegal;
-(void) setTotal:(float) fen;
-(float) getTotal;
@end

//货物对象
@interface Goods : NSObject {
@public
    NSString *_goods_name;
    int _price;
    int _amounts;
}
@end

//自动售货机
@interface ATM : NSObject{
@public
    Goods *_cococola;
    Money *_money;
    int temp;
    BOOL isDone;
}
-(void) getMoney:(Money *) inCome;
-(void) transaction;
-(void) run:(Money *) m : (Goods *) g;
@end

//--------------ipm--------------
@implementation Money : NSObject
-(BOOL) isIllegal{
    BOOL isright = YES;
    //要求参数传一个浮点数 直接计算出是否能被4中货币整除 是则返回YES 否则返回NO
    if (five%5!=0||ten%10!=0) {
        isright = NO;
    }
    return isright;
}

-(float) getTotal{
    return _50cents+five+ten+one;
}

-(void) setTotal:(float)p1 {
    total = p1;
}

@end

@implementation Goods : NSObject

@end

@implementation ATM : NSObject
// 收钱
-(void) getMoney:(Money *)inCome{
    if([inCome isIllegal])
        temp = [inCome getTotal];
    else
    NSLog(@"对不起 不支持您的货币类型 : 只能支付1元(硬币),5分(硬币),5元(纸币),10元(纸币)");
}

// 完成交易流程
-(void) transaction{
    NSLog (@"请输入您要购买的商品类型 目前只有可乐 3块钱一瓶 爱买不买,哼~");
    NSLog(@"要几瓶?");
    int t = 0;
    scanf("%d",&t);
    
    if ((t * _cococola->_price) <= temp && _cococola->_amounts >= t) {
        NSLog(@"本次交易收入%i元,购买可乐%i瓶,单价为[%i]元一瓶,开始出货.....",temp,t,
              _cococola->_price);
        int leftMony = temp - (_cococola->_price * t);
        temp = leftMony;
        if(isDone) [_money setTotal:temp - leftMony];
        _cococola->_amounts -= t;
        
        NSLog(@"交易完成 实收[%i]元 ",t*_cococola->_price);
        NSLog(@"找零[%i]元...",leftMony);
        
    }else if (_cococola->_amounts < t){
        NSLog(@"对不起,库存不足,请重新选择.....");
        return;
    }else if(temp < _cococola->_price * t){
        NSLog(@"对不起 您的钱不够...");
        NSLog(@"交易完成 找零[%i]元",temp);
    }else
        NSLog(@"输入错误....");
    
    if (isDone) temp = 0;
}

-(void) run:(Money *) m : (Goods *) g{
    _cococola = g;
    
    isDone = NO;
    [self getMoney: m];
    while( !isDone ){
        printf("temp = %d\n",temp);
        if( temp < _cococola->_price ) {
            isDone = YES;
            NSLog(@"交易结束 请走人");
        }
        if( _cococola->_amounts == 0 ) {
            isDone = YES;
            NSLog(@"不好意思卖光了 请走人");
        }
    
        [self transaction];
        NSLog(@"\n\n\n-----------你好 欢迎来到 同学的ATM量贩机 请投币....-----------");
    }
}
@end

//-------------主函数----------------
int main(int argc, const char * argv[])
{
    Money *m1 = [Money new];
    printf("\n%p 顾客给的钱的地址\n",&m1);
    m1->_50cents = 0.5;
    m1->five = 20;
    m1->ten = 0;
    m1->one = 0;
    
    Money *base = [Money new];
    printf("\n%p ATM机找补本金的地址\n",&base);
    base->_50cents = 20.0;
    base->five = 100;
    base->ten = 10;
    base->one = 100;
    
    Goods *g1 = [Goods new];
    g1->_price = 3; //3元一瓶 屌丝福音...
    g1->_amounts = 20;//放20瓶可乐进去...
    g1->_goods_name = @"1.可口可乐";
    
    ATM *atm = [ATM new];
    atm->_money = base;
    atm->isDone = NO;
    printf("\n 事实上是这个地址:%p \n",&(atm->_money));
    
    NSString *AboutATMClass = [atm description];
    NSLog(@"ATM对象->[%@]",AboutATMClass);
    NSLog(@"%@",atm->_money);
    [atm run:m1 :g1]; //给2个对象到ATM机器 开始跑 一直出货到钱花完为止...
    return 0;
}