用这几天学的OC的知识,写了一个实现简单功能的通讯录管理系统,在这里分享给大家:

通讯录管理系统
 *  需求:
 1、定义联系人类Contact。实例变量:姓名(拼音,首字母大写)、性别、电话号码、住址、分组名称、年龄。方法:自定义初始化方法(姓名、电话号码)、显示联系人信息
 
 
 2、定义AddressBook类,定义字典,分组管理所有联系人。分组名为26个大写的英文字母。
 
 
 3、可以添加联系人对象,如果姓名或电话号码为空,添加失败。添加联系人到匹配的分组。
 
 
 4、获取某个分组名称下所有联系人,并且按照姓名升序排列。
 
 
 5、从通讯录中根据电话号码搜索联系人。
 
 
 6、获取所有女性的联系人,并且按照年龄的降序排列。
 
 
 7、根据姓名删除某个联系人。
 
 
 8、删除某个分组的全部联系人。

Contact.h文件

#import <Foundation/Foundation.h>

@interface Contact : NSObject

@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *gender;
@property (nonatomic, retain) NSString * phoneNum;
@property (nonatomic, retain) NSString *address;
@property (nonatomic, retain) NSString *groupName;
@property (nonatomic, assign) NSInteger age;

// 初始化方法
- (instancetype)initWithName:(NSString *)name
                      gender:(NSString *)gender
                    phoneNum:(NSString *)phoneNum
                         age:(NSInteger)age;

// 构造器
+(instancetype)contactWithName:(NSString *)name
                        gender:(NSString *)gender
                      phoneNum:(NSString *)phoneNum
                           age:(NSInteger)age;

// 显示联系人信息
- (void)showInformation;

@end

Contact.m文件

#import "Contact.h"

@implementation Contact
// 初始化方法
- (instancetype)initWithName:(NSString *)name
                      gender:(NSString *)gender
                    phoneNum:(NSString *)phoneNum
                         age:(NSInteger)age {
    self = [super init];
    if (self) {
        _name = name;
        _gender = gender;
        _phoneNum = phoneNum;
        _age = age;
    }
    return self;
}

// 构造器
+(instancetype)contactWithName:(NSString *)name
                        gender:(NSString *)gender
                      phoneNum:(NSString *)phoneNum
                           age:(NSInteger)age {
    return [[Contact alloc] initWithName:name gender:gender phoneNum:phoneNum age:age];
}

// 显示联系人信息
- (void)showInformation {
    NSLog(@"name = %@, gender = %@, phoneNum = %@, age = %ld", _name, _gender, _phoneNum, _age);
}

- (NSString *)description
{
    return [NSString stringWithFormat:@"name = %@, gender = %@, phoneNum = %@, age = %ld", _name, _gender, _phoneNum, _age];
}
@end

AddressBook.h文件

#import <Foundation/Foundation.h>
@class Contact;
@interface AddressBook : NSObject

@property (nonatomic, retain)NSMutableDictionary *addressBook;

// 添加联系人对象
- (void)addContact:(Contact *)contact;

// 获取某个分组名称下所有联系人,并且按照姓名升序排列
- (void)groupContactsByNameSortDes:(NSString *)groupName;

// 从通讯录中根据电话号码搜索联系人
- (void)findContactByPhoneNum:(NSString *)phoneNum;

// 获取所有女性的联系人,并且按照年龄的降序排列
- (void)womanContactsByAgeSortAsc:(NSString *)gender;

// 根据姓名删除某个联系人。
- (void)deleteContactByName:(NSString *)name;

// 删除某个分组全部联系人
- (void)deleteAllContactByGroup:(NSString *)groupName;

// 打印联系人
- (void)printContacts;
@end

AddressBook.m文件

#import "AddressBook.h"
#import "Contact.h"
@implementation AddressBook

// 初始化
- (instancetype)init
{
    self = [super init];
    if (self) {
        _addressBook = [[NSMutableDictionary alloc] init];
        ; i < ; i++) {
            char c = i;
            // 为字典添加键值对
            NSString *strKey = [NSString stringWithFormat:@"%c", c];
            [_addressBook setObject:[NSMutableArray array] forKey:strKey];
        }
    }
    return self;
}

// 添加联系人对象
- (void)addContact:(Contact *)contact {
    // 如果姓名或电话号码为空,添加失败
    if ([contact.name isEqualToString:@""] || [contact.phoneNum isEqualToString:@""]) {
        NSLog(@"添加失败");
        return;
    }
    // 添加联系人到匹配的分组,以联系人姓名首字母当做分组方式。
    contact.groupName = [[contact.name capitalizedString] substringToIndex:];
    // 联系人分组即为键值,通过键值得到字典的值传入数组
    NSMutableArray *arrContact = [_addressBook objectForKey:contact.groupName];
    // 将联系人信息传入数组
    [arrContact addObject:contact];
    NSLog(@"添加成功!");

}

// 获取某个分组名称下所有联系人,并且按照姓名升序排列
- (void)groupContactsByNameSortDes:(NSString *)groupName {
    NSMutableArray *arrGroup = [_addressBook objectForKey:groupName];
    NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    [arrGroup sortedArrayUsingDescriptors:@[sortByName]];
    NSLog(@"姓名升序排序成功!");
    NSLog(@"%@", arrGroup);
}

// 从通讯录中根据电话号码搜索联系人
- (void)findContactByPhoneNum:(NSString *)phoneNum {
    for (NSArray *key in _addressBook) {
        NSMutableArray *findArray = _addressBook[key];
        for (Contact *targetContact in findArray) {
            if ([targetContact.phoneNum isEqualToString:phoneNum]) {
                NSLog(@"搜索成功!");
                NSLog(@"%@", targetContact);          return;     }   } }  NSLog(@"无此联系人!");
}

// 获取所有女性的联系人,并且按照年龄的降序排列
- (void)womanContactsByAgeSortAsc:(NSString *)gender {
    NSMutableArray *arrGender = [NSMutableArray array];
    for (NSArray *woman in _addressBook) {
        NSMutableArray *womanArray = _addressBook[woman];
        for (Contact *womanContact in womanArray) {
            if ([womanContact.gender isEqualToString:gender]) {
                [arrGender addObject:womanContact];
            }
        }
    }
    NSSortDescriptor *sortByAge = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:NO];
    [arrGender sortedArrayUsingDescriptors:@[sortByAge]];
    NSLog(@"年龄的降序排序成功");
    NSLog(@"%@", arrGender);
}

// 根据姓名删除某个联系人。
- (void)deleteContactByName:(NSString *)name {
    for (NSArray *delete in _addressBook) {
        NSMutableArray *arrayDelete = _addressBook[delete];
        for (Contact *deleteContact in arrayDelete) {
            if ([deleteContact.name isEqualToString:name]) {
                [arrayDelete removeObject:deleteContact];
            }
        }
    }
    NSLog(@"移除成功");
}

// 删除某个分组全部联系人
- (void)deleteContactByName:(NSString *)name {
    for (NSArray *delete in _addressBook) {
        NSMutableArray *arrayDelete = _addressBook[delete];
        // for...in不能通过添加或删除对象这类方式来改变集合容器的元素个数
        ; i < arrayDelete.count; i++) {
            Contact *deleteContact = arrayDelete[i];
            if ([deleteContact.name isEqualToString:name]) {
                [arrayDelete removeObject:deleteContact];
            }
        }
    }
    NSLog(@"移除成功");
}

// 打印联系人
- (void)printContacts {
    NSLog(@"%@", _addressBook);
}

@end

main.m文件

#import <Foundation/Foundation.h>
#import "Contact.h"
#import "AddressBook.h"
int main(int argc, const char * argv[]) {

    @autoreleasepool {
        // 创建联系人对象
        Contact *c1 = [Contact contactWithName:];
        Contact *c2 = [Contact contactWithName:];
        Contact *c3 = [Contact contactWithName:];
        Contact *c4 = [Contact contactWithName:];
        Contact *c5 = [Contact contactWithName:];
        Contact *c6 = [Contact contactWithName:];

        // 创建字典对象
        AddressBook *addressBook = [[AddressBook alloc] init];

        // 添加联系人
        [addressBook addContact:c1];
        [addressBook addContact:c2];
        [addressBook addContact:c3];
        [addressBook addContact:c4];
        [addressBook addContact:c5];
        [addressBook addContact:c6];
        // 打印所有联系人
        [addressBook printContacts];

        // 获取某个分组名称下所有联系人,并且按照姓名升序排列
        [addressBook groupContactsByNameSortDes:@"Z"];

        // 从通讯录中根据电话号码搜索联系人
        [addressBook findContactByPhoneNum:"];

        //获取所有女性的联系人,并且按照年龄的降序排列
        [addressBook womanContactsByAgeSortAsc:@"woman"];

        //根据姓名删除某个联系人
        [addressBook deleteContactByName:@"zhangwu"];

        // 打印所有联系人
        [addressBook printContacts];

        // 删除某个分组的全部联系人
        [addressBook deleteAllContactByGroup:@"Z"];

        // 打印所有联系人
        [addressBook printContacts];

    }
    ;
}

iOS学习之Object-C语言简单的通讯录管理系统的更多相关文章

  1. ***iOS学习之Table View的简单使用和DEMO示例(共Plain普通+Grouped分组两种)

    Table View简单描述: 在iPhone和其他iOS的很多程序中都会看到Table View的出现,除了一般的表格资料展示之外,设置的属性资料往往也用到Table View,Table View ...

  2. iOS学习08之C语言内存管理

    本次主要学习和理解C语言中的内存管理 1.存储区划分 按照地址从高到低的顺序:栈区,堆区,静态区,常量区,代码区 1> 栈区:局部变量的存储区域 局部变量基本都在函数.循环.分支中定义 栈区的内 ...

  3. iOS学习07之C语言指针

    本次随笔主要是为了学习和理解C语言中的指针,指针树状图如下: 1.访问数据的两种方式 1> 直接访问:定义变量后,直接访问变量 ; printf("a = %d\n", a) ...

  4. iOS学习之Table View的简单使用

    Table View简单描述: 在iPhone和其他iOS的很多程序中都会看到Table View的出现,除了一般的表格资料展示之外,设置的属性资料往往也用到Table View,Table View ...

  5. IOS学习笔记3—Objective C—简单的内存管理

    今天简述一下简单的内存管理,在IOS5.0以后Apple增加了ARC机制(Automatic Reference Counting),给开发人员带来了不少的方便,但是为了能更好的理解IOS内存管理机制 ...

  6. 【IOS学习】【Swift语言】

    基本语法: OS X playground 引入 import Cocoa IOS playground 引入 import UIKit 基本数据类型 let 定义常量 定义完成之后无法修改 var ...

  7. ios学习之旅---c语言函数

    1.函数的概述 C源程序是由函数组成的. 尽管在前面各章的程序中大都仅仅有一个主函数main(),但有用程序往往由多个 函数组成. 函数是C源程序的基本模块,通过对函数模块的调用实现特定的功能. C语 ...

  8. iOS学习之UITableView中Cell的操作

    接着iOS学习之Table View的简单使用 这篇,这里主要讲UITableView 中的Cell的操作,包括标记.移动.删除.插入. 为了简单快捷,直接从原来那篇的代码开始,代码下载地址:http ...

  9. c语言实现通讯录管理系统(c课程设计)

    工具:Visual C++6.0 说明: 本系统基于C语言实现班级通讯录管理系统,为大一时学习C语言刚入门所做的课程设计.功能包括增.删.查.改等,非常适合初学者练手.通讯录包括的个人信息有姓名.学号 ...

随机推荐

  1. java中反射

    Person.java===>>person.class ==>>jvm中的类加载器===>>class对象:代表内存中Person.class ==>> ...

  2. Leetcode008. String to Integer (atoi)

    /* improvement on dealing with overflow accroding to this: * https://discuss.leetcode.com/topic/5745 ...

  3. Spring 注解实体类中非数据库字段属性

    解决办法:在属性的get方法上加上一段注解标识它是临时属性,不是数据库字段就OK @Transient public List<Reverts> getChildList() { retu ...

  4. cacti快速安装

    一.cacti概述 1. cacti是用php语言实现的一个软件,它的主要功能是用snmp服务获取数据,然后用rrdtool储存和更新数据,当用户需要查看数据的时候用rrdtool生成图表呈现给用户. ...

  5. python3.5在print和input上的几个变化

    1. 在python3.5中使用print,打印内容必须用括号()括起来.python2.7中可以不用括号,如果你加了括号,代码在python2.7中也是可以正常运行的. python3.5 exam ...

  6. OpenGL函数解析之glLoadIdentity()

    函数原型:void glLoadIdentity(void) 函数说明:调用glLoadIdentity()函数可以恢复初始坐标系,用一个4x4的单位矩阵来代替当前矩阵,实际上就是对当前矩阵进行初始化 ...

  7. global.autoindex dede:global.itemindex 获取子栏目自动排序序号

    {dede:channel  row='6' typeid=7 }                  [field:global.autoindex runphp='yes']             ...

  8. 实现MySQL的Replication

    实现MySQL的Replication     实现MySQL的Replication在MySQL 3.23.15版本之后,MySQL提供了数据库复制的功能,可以实现两个数据库实时同步,增强了MySQ ...

  9. dig out secrets beneath AirSig

    My sister installed AirSig last week. She is so exciting about this new techknology and she won't st ...

  10. 重温CSS:Border属性

    边界是众所周知的,有什么新的东西吗?好吧,我敢打赌,在这篇文章中,有很多你不看永远不知道的东西! 不仅可以用CSS3来创建圆角,使用原有CSS一样可以显示自定义图形.这是正确的(有待考究):在过去,没 ...