用这几天学的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 父子级

    package com.hanqi; //父类 public class Father { // public Father() // { // // } // public Father(Strin ...

  2. android 解析json数据格式(转)

    json数据格式解析我自己分为两种: 一种是普通的,一种是带有数组形式的: 普通形式的:服务器端返回的json数据格式如下: {"userbean":{"Uid" ...

  3. java学习之(接口)

    使用接口 接口不能用于创建实例,但接口可以用于声明引用类型变量.当使用接口来声明引用类型变量时,这个引用类型变量必须引用到其实现类的对象.除此之外,接口的主要用途就是被实现类实现.归纳起来,接口主要有 ...

  4. 使用JS对HTML标签进行增删改查

    以下为通过JS对li标签进行简单的增删改查: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" ...

  5. [前端 2]常用的JQuery和Dom页面取值与赋值

    导读:书到用时方恨少,需要基础知识的时候,才悔恨自己没有总结学习好.前段时间调了好长时间的页面,突然发现自己之前不怎么在意的取值和赋值,真的是自己一个很薄弱的地方,有时候查半天都找不到一个对的,现在用 ...

  6. 【MySQL】InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

    参考:http://my.oschina.net/sansom/blog/179116 参考:http://www.jb51.net/article/43282.htm 注意!此方法只适用于innod ...

  7. 关于enum的那些事儿

    自从当年明月的<明朝的那些事儿>爆红之后,以***那些事儿命名的文章便层出不穷.个人认为,这样的命名通俗但具有吸引力,容易接地气.哈哈,所以我也写了几篇以<***那些事儿>的文 ...

  8. Linux下yum安装MPlayer 或 LVC视频播放器

    添加第三方源 su -c 'rpm -ivh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noar ...

  9. PayPal 开发详解(七):运行REST API SAMPLE

    1.编译成功,修改配置文件 sdk_config.properties ,使用我们申请的测试帐号执行收款测试,clientId 和 clientSecret 参见 PayPal 开发详解(五) 2.将 ...

  10. Print a PeopleSoft Page with JavaScript

    1.  You will need a Long character field to hold the HTML string. You can use the delivered field HT ...