简单的图书馆系统 LibrarySystem(OC模拟)

环境:
OS开发环境 MRC模式

1/5. 类Library.h中:

#import <Foundation/Foundation.h>
@class Book;

@interface Library : NSObject

// 1) 声明属性
@property (nonatomic,retain)NSMutableArray *array;//为什么不能用copy

// 2) Library类的初始化重写init方法为数组分配空间
- (instancetype)init;

// 功能三添加书籍
- (BOOL)addBook: (Book *)book;

// 功能四删除书籍
- (BOOL)removeBook: (Book *)book;
// 功能四拓展:根据书名删除
- (void)removeBookWithName: (NSString *)bookName;

// 功能五展示所有书籍
- (void)showAllBooks;

// 功能六根据书籍名称修改书籍价格
- (void)lookForBook: (NSString *)bookName;

// 功能七根据书籍价格进行升序排序
- (void)sortBookByPrice;

// 功能八根据书籍名称进行升序排序
- (void)sortBookByName;

// 功能九记录同名书籍个数
- (void)repeatBook: (NSString *)bookName;

@end

2/5. 类Library.m中:

#import "Library.h"
#import "Book.h"

@implementation Library

// 重写dealloc
- (void)dealloc
{
    [_array release];
    [super dealloc];
}

// Library类的初始化
- (instancetype)init{
    self = [super init];
    if (self) {
        self.array = [NSMutableArray arrayWithCapacity:1];
    }
    return self;
}


// 功能三 添加书籍
- (BOOL)addBook: (Book *)book{
    if (book.name.length == 0) {
        return NO;
    }

    [self.array addObject:book];

    return YES;

}

// 功能四 删除书籍
- (BOOL)removeBook: (Book *)book{
    NSInteger len = self.array.count;
    [self.array removeObject:book];
    NSInteger len2 = self.array.count;

    return len = len2 + 1? YES: NO;
}

// 功能四拓展: 根据书名删除
- (void)removeBookWithName: (NSString *)bookName{
    Book *book2 = [[Book alloc] init];
    for (Book *book in self.array) {
        if (bookName == book.name) {
            book2 = book;
        }
    }
    [self removeBook:book2];
}


// 功能五 展示所有书籍
- (void)showAllBooks{
    NSLog(@"所有书籍:");
    for (int i = 0; i < self.array.count; i++) {
        NSLog(@"%@", self.array[i]);
    }
}

// 功能六 根据书籍名称修改书籍价格
- (void)lookForBook: (NSString *)bookName{
    if (bookName.length == 0) {
        NSLog(@"请输入正确的书名");
        return;
    }
    for (Book *book in self.array) {
        if (bookName == book.name) {
            [book setValue:@"1000" forKey:@"price"];
            NSLog(@"%@", book);
        }
    }

}

// 功能七 根据书籍价格进行升序排序
- (void)sortBookByPrice{

    // 1> 创建排序描述符
    NSSortDescriptor *descriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"price" ascending:YES];
    // 2> 将描述符放入数组
    NSArray *sortDescriptor = [NSArray arrayWithObject:descriptor1];
    // 3> 数组按照排序符排序
    [self.array sortUsingDescriptors:sortDescriptor];
    [self showAllBooks];

}

// 功能八 根据书籍名称进行升序排序
- (void)sortBookByName{

    // 1> 创建排序描述符
    NSSortDescriptor *descriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
    // 2> 将描述符放入数组
    NSArray *sortDescriptor = [NSArray arrayWithObject:descriptor1];
    // 3> 数组按照排序符排序
    [self.array sortUsingDescriptors:sortDescriptor];
    [self showAllBooks];

}

// 功能九 记录同名书籍个数
- (void)repeatBook: (NSString *)bookName{
    int count = 0;
    for (Book *book in self.array) {
        if (bookName == book.name) {
            count++;
        }
    }
    NSLog(@"<<%@>>共有%d本", bookName, count);
}

@end

3/5. 类Book.h中:

#import <Foundation/Foundation.h>

@interface Book : NSObject

// 1) 声明属性
@property (nonatomic, copy)NSString *name;
@property (nonatomic, assign)NSInteger price;

// 3) 重写Book类的初始化方法
- (id)initWithName: (NSString *)name
               price: (NSInteger)price;

+ (id)bookWithName: (NSString *)name
             price: (NSInteger)price;


// 4) 重写set方法
- (void)setName: (NSString *)name;
- (void)setPrice: (NSInteger)price;

@end

4/5. 类Book.m中:

#import "Book.h"

@implementation Book

// 5) 重写dealloc方法
- (void)dealloc
{
    // [_name release];
    self.name = nil;// 更安全的做法: 包含[_name release];与 _name = nil;
    [super dealloc];
}// 对象内存销毁, 是否意味着其_name也被回收?

// 3) 重写Book类的初始化方法
- (id)initWithName: (NSString *)name
             price: (NSInteger)price{
    self = [super init];
    if (self) {
        self.name = name;// 安全持有对象类型数据, 需要访问setter方法, 对赋值的对象类型数据引用计数+1.
        self.price = price;
    }
    return self;
}

+ (id)bookWithName: (NSString *)name
             price: (NSInteger)price{
    return [[[Book alloc] initWithName:name price:price] autorelease];
}


#pragma mark -- 重写的set方法
// 4) 重写set方法
- (void)setName: (NSString *)name{
    if (_name != name) {
        [_name release];
        _name = [name copy];// 此处不可变字符串拷贝是浅拷贝.
    }
}
- (void)setPrice: (NSInteger)price{
    if (_price != price) {
        _price = price;
    }
}

// 2) 重写description方法:
- (NSString *)description
{
    return [NSString stringWithFormat:@"书名是:%@,价格是:%ld", self.name, self.price];
}

@end

5/5.类main.m中:

#import <Foundation/Foundation.h>
#import "Book.h"
#import "Library.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 1)
        Book *b1 = [[Book alloc] initWithName:@"C语言基础" price:100];
        Book *b2 = [[Book alloc] initWithName:@"OC之如何与水杯相处" price:1000];
        Book *b3 = [[Book alloc] initWithName:@"UI之东游记白骨精的爱情故事" price:400];
        Book *b4 = [[Book alloc] initWithName:@"Java之为何你还是单身" price:30];

        // 2)
        Library *lib = [[Library alloc] init];

        // 3)
        BOOL isSuc = [lib addBook:b1];
        NSLog(@"添加%@", isSuc ? @"成功": @"失败");
        isSuc = [lib addBook:b2];
        NSLog(@"添加%@", isSuc ? @"成功": @"失败");
        isSuc = [lib addBook:b3];
        NSLog(@"添加%@", isSuc ? @"成功": @"失败");
        isSuc = [lib addBook:b4];
        NSLog(@"添加%@", isSuc ? @"成功": @"失败");
        [lib showAllBooks];

        // 4)
        [lib lookForBook:@"C语言基础"];

        // 5)
        [lib removeBookWithName: @"OC之如何与水杯相处"];

        // 6)
        [lib showAllBooks];

        // 8)
        [lib sortBookByPrice];

        // 7)
        [lib sortBookByName];

        // 9)
        [lib addBook:b1];
        [lib addBook:b1];
        [lib repeatBook:@"C语言基础"];

        [b1 release];
        [b2 release];
        [b3 release];
        [b4 release];
        [lib release];

    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值