用OC语言完成简易通讯录(实现增删改查)功能.

(注:使用MRC)

一、功能描述:

main函数中通过使用Person类和AddressBook类,创建对象、调用方法,实现以下8个功能:

1).使用便利构造器创建四个Person类的实例(联系人).

姓名:Lucy 性别:女 电话:123 年龄:21

姓名:Joe 性别:男 电话:456 年龄:17

姓名:Baby 性别:女 电话:789 年龄:27

姓名:Linda 性别:女 电话:000 年龄:21

2).创建一个AddressBook类的实例对象(通讯录).

3).使用AddressBook类中定义的方法实现:添加联系人,将四个联系人添加到通讯录中.

4).使用AddressBook类中定义的方法实现:根据电话查找联系人,并打印(查找电话:456);

5).使用AddressBook类中定义的方法实现:根据性别查找联系人,并将查到的联系人按照年龄升序排序,并打印(查找性别:女)

6).使用AddressBook类中定义的方法实现:根据姓名,更改联系人信息.(修改Linda的信息: 性别:女 电话:012 年龄:25);

7).使用AddressBook类中定义的方法实现:按照姓名删除联系人,并展示通信录中所有人信息.(删除联系人:Baby)

8).使用AddressBook类中定义的方法实现:删除一个分组,并展示通信录中所有人信息.(删除L组)

9).使用AddressBook类中定义的方法实现:实现3~8之间每个功能后,输出通讯录中所有联系人信息。

二、功能实现提示:

1、功能一

定义Person类

1)声明属性:姓名,年龄,性别,电话,分组。注:年龄是int类型,其余属性时NSString类型;分组是姓名首字母(大写),使用提供的类目:NSString+Characters中的方法获取。(3分)

2)重写description方法,输出Person对象的信息。例如: “姓名:张三   性别:男   年龄:22   电话:123456789”.(2分)

3)定义Person类的便利构造器方法,方法包含参数:姓名、年龄、性别、电话.(5分)

2、功能二

定义AddressBook类.

1)声明属性:allPersonDic(字典类型)。使用声明的字典作为容器,分组管理通讯录中所有联系人;字典的Key值为分组名(姓名首字母,大写),value值为数组,数组中存放联系人(Person实例).(5分)

2)在AddressBook的初始化方法中,初始化allPersonDic。(5分)

3)重写dealloc方法,在dealloc方法中实现AddressBook类的内存管理。(5分)

3、功能三

添加联系人.要求(15分)

a.在AddressBook类中定义方法:

- (BOOL)addPerson:(Person *)aPerson;

b.判断姓名和电话不能为空否则添加失败.

c.判断是否已经存在分组,存在直接存储.不存在创建分组后再存储.(注:联系人不能有重名).

d.添加成功返回YES,姓名为空或者有重名的添加失败返回NO.

e.数据使用Person存储.

4、功能四

根据电话查找某个联系人.(10分)

a:在AddressBook类中定义方法:

-(Person *)findPersonWithPhoneNum:(NSString *)aPhoneNum;

b:如果找到返回该联系人,否则返回nil.

c.忽略电话重复问题,只返回第一个查找到的联系人。

5、功能五

根据性别查找联系人,并将查到的联系人按照年龄升序排序(15分)

a:在AddressBook类中定义方法:

-(NSArray *)findPersonsWithSex:(NSString *)aSex;

b:查找到联系人放入数组,排序的时候使用block.

6、功能六

根据姓名,更改联系人信息.(10分)

a:在AddressBook类中定义方法:

-(BOOL)changePersonWithName:(NSString *)name phoneNum:(NSString *)aNum sex:(NSString *)aSex age:(NSUInteger) aAge;

b:找到该联系人并修改该成功返回YES,否则返回NO

c.修改电话、性别、年龄,参数不能为空。

7、功能七

按照姓名删除联系人.(15分)

a.在AddressBook类中定义方法:

- (BOOL)deletePersonWithName:(NSString*)aPersonName;

b.删除成功返回YES,否则返回NO;

c.当删除联系人后分组为空时,需要删除该分组。

8、功能八

删除一个分组.(5分)

a.在AddressBook类中定义方法:

- (BOOL)deleteGroup:(NSString *)aGroupName;

b.删除成功返回YES,否则返回NO;

9、功能九

展示通讯录中的所有联系人信息(5分)

a:在AddressBook类中定义方法:

-(void)showAll;

b.通过重写description方法展示联系人信息 。

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject

//声明属性
@property (nonatomic , retain) NSString *name;
@property (nonatomic , retain)NSString *gender;
@property (nonatomic , assign)int age;
@property (nonatomic , retain)
    NSString *phoneNumber;
@property (nonatomic , retain)NSString *groupName;

//声明初始化方法

- (id)initWithPersonName:(NSString *)name
                     age:(int)age
                  gender:(NSString *)gender
             phoneNumber:(NSString *)phoneNumber
               groupName:(NSString *)groupName;
//便利构造器
+ (id)personWithName:(NSString *)name
                 age:(int)age
              gender:(NSString *)gender
         phoneNumber:(NSString *)phoneNumber
           groupName:(NSString *)groupName;

@end

Person.m

#import "Person.h"

@implementation Person

- (id)initWithPersonName:(NSString *)name age:(int)age gender:(NSString *)gender phoneNumber:(NSString *)phoneNumber groupName:(NSString *)groupName{
    
    if (self = [super init]) {
        self.name = name;
        self.age = age;
        self.phoneNumber = phoneNumber;
        self.gender = gender;
        self.groupName = groupName;
    }
    return self;
}

+ (id)personWithName:(NSString *)name
                 age:(int)age
              gender:(NSString *)gender
         phoneNumber:(NSString *)phoneNumber
           groupName:(NSString *)groupName{
    
    Person *person = [[[Person alloc]initWithPersonName:name age:age gender:gender phoneNumber:phoneNumber groupName:groupName] autorelease];
    return person;
    
}

//重写父类的方法,默认情况是打印对象的地址。
- (NSString *)description{
    
    return [NSString stringWithFormat:@"  姓名:%@ ,性别:%@ , 年龄:%d  , 电话:%@ , 分组名:%@    ", _name , _gender  , _age, _phoneNumber , _groupName ];
}

- (void)dealloc{
    NSLog(@"%s" , __FUNCTION__);
    [_name release];
    [_gender release];
    [_phoneNumber release];
    [_groupName release];
    [super dealloc];
}

@end

AddressBook.h

#import <Foundation/Foundation.h>
#import "Person.h"

@interface AddressBook : NSObject
//声明一个字典,用来存储联系人
@property (nonatomic , retain) NSMutableDictionary *allPersonDic;

//初始化方法
- (id)initWithMutableDic:(NSMutableDictionary *)dic;

//声明方法,添加联系人
- (BOOL)addPerson:(Person *)aPerson;
//按照电话查找某个联系人
- (Person *)findPersonWithPhoneNumber:(NSString *)aPhoneNumber;

//按性别查找,并且排序
- (NSArray *)findPersonWithSex:(NSString *)sex;

//根据姓名,来修改联系人的信息
- (BOOL)changePersonWithName:(NSString *)name
                 phoneNumber:(NSString *)phoneNumber
                         sex:(NSString *)sex
                         age:(int)age;
//删除联系人
- (BOOL)deletePersonWithName:(NSString *)name;

//删除分组
- (BOOL)deleteGroupName:(NSString *)aGroupname;

//打印所有的人
- (void)showAll;

@end

AddressBook.m

#import "AddressBook.h"
#import "NSString+Character.h"
@implementation AddressBook

- (id)initWithMutableDic:(NSMutableDictionary *)dic{
    if (self = [super init]) {
        _allPersonDic = dic;
    }
    return self;
}

- (void)dealloc{
    [_allPersonDic release];
    [super dealloc];
}

//实现添加联系人的方法
- (BOOL)addPerson:(Person *)aPerson{
  //第一步,先判断名字和电话
    if ((aPerson.name == nil || aPerson.phoneNumber == nil ) || ([aPerson.name isEqualToString:@""] || [aPerson.phoneNumber isEqualToString:@""])) {
        
        
        NSLog(@"信息不完整,添加失败");
        return NO;
    }
    
    //获取名字的首字母,并且大写。当作字典的key(键)
    NSString *keyStr = [aPerson.name  uppercaseFirstLetter];
    //通过键来查找数组
    NSMutableArray *tempArray =    [_allPersonDic objectForKey:keyStr];
    if (! tempArray) {
        //给数组分配空间
        tempArray = [[NSMutableArray alloc]init];
        //创建键值对
        [_allPersonDic setObject:tempArray forKey:keyStr];
    }
    //检查一下是否有重名的
    for (int i = 0; i < [tempArray count]; i ++) {
        if ([aPerson.name isEqualToString:[tempArray[i] name]]) {
            NSLog(@"有重名的,添加失败");
            return NO;
        }
    }
    //把联系人加进创建好的数组里面

    [tempArray addObject:aPerson];
    
    
    return YES;
}

//实现按照号码找人的方法
- (Person *)findPersonWithPhoneNumber:(NSString *)aPhoneNumber{
    //第一步,把字典里面的键拿出来,通过键来取值
    for (NSString *keyStr in _allPersonDic) {
        //通过objectForKey: 这个方法,把字典里面的数组拿出来
        NSMutableArray *tempArray = [_allPersonDic objectForKey:keyStr];
        //遍历拿出来的数组,让数组里面每一个人的号码,和 形参的值进行比较。
        for (Person *p in tempArray) {
            
            if ([p.phoneNumber isEqualToString:aPhoneNumber]) {
                
                NSLog(@"人找到了");
                return p;
            }
        }
    }
    
    NSLog(@"没有找到该联系人");
    return nil;
}

//实现方法
- (NSArray *)findPersonWithSex:(NSString *)sex{
   //声明数组,用来储存性别相同的人
    NSMutableArray *mutableArray = [[NSMutableArray alloc]init];
    
    //然后再开始,遍历字典,拿到键值,遍历数组
    
    for (NSString *keyStr in _allPersonDic) {
        NSMutableArray *array = [_allPersonDic objectForKey:keyStr];
        for (Person *person in array) {
            //跟上一方法不同的地方
            if ([person.gender isEqualToString:sex]) {
                
                [mutableArray addObject:person];
                
            }
        }
    }
    
    [mutableArray sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {

        Person *per1 = (Person *)obj1;
        Person *per2 = (Person *)obj2;
        
        if ( per1.age  > per2.age ) {
            return NSOrderedDescending;
        }
        else if (per1.age < per2.age){
        return NSOrderedAscending;
        }
        return NSOrderedSame;
    }];
    
  //  [mutableArray sortUsingSelector:@selector(compare:)];
    
    return mutableArray;
}

//实现修改方法
- (BOOL)changePersonWithName:(NSString *)name phoneNumber:(NSString *)phoneNumber sex:(NSString *)sex age:(int)age{
    //第一步,先遍历
    
    for (NSString *keyStr  in _allPersonDic) {
        //通过key来取值
        NSMutableArray *tempArray = [_allPersonDic objectForKey:keyStr];
        
        //开始遍历数组
        for (Person *person in tempArray) {
            if ([person.name isEqualToString:name]) {
                //找到人后,开始修改,把传进来的新的信息赋值给这个人
                person.phoneNumber = phoneNumber;
                person.gender = sex;
                person.age = age;
                
                NSLog(@"赋值成功");
                return YES;
                
            }
        }
        
    }
    
    
    return NO;
    
}

- (BOOL)deletePersonWithName:(NSString *)name{
    
    for (NSString *keyStr in _allPersonDic) {
        
        NSMutableArray *tempArray = [_allPersonDic objectForKey:keyStr];
        
        //遍历数组
        for (Person *person in tempArray) {
            if ([person.name isEqualToString:name]) {
                [tempArray removeObject:person];
                NSLog(@"找到要删除的人了");
                //如果这个人,是分组里面最后一个,就把分组也删除
                if ([tempArray count] == 0) {
                    //在字典里面删除键值对
                    [_allPersonDic removeObjectForKey:keyStr];
                    NSLog(@"数组已经被删除");
                }
                
                
                return YES;
                
            }
        }
    }
    NSLog(@"没有找到");
    return NO;
    
}

//实现删除分组的方法
- (BOOL)deleteGroupName:(NSString *)aGroupname{
    
    //先判断,有么有这个分组
    for (NSString *keyStr in _allPersonDic) {
        if ([keyStr isEqualToString:aGroupname]) {
            
            
            //先通过传进来的键,来获取字典里面的值(数组)
            NSMutableArray *tempArray = [_allPersonDic objectForKey:aGroupname];
            //删完这个数组里面的所有元素
            [tempArray removeAllObjects];
            //删除字典里面的键值对,通过键来删除
            [_allPersonDic removeObjectForKey:aGroupname];

            NSLog(@"找到分组,删除成功");
            return YES;
            
            
        }
    }
    
    
    
    NSLog(@"没有这个分组");
    return NO;
    
    
}

//打印所有人
- (void)showAll{
    for (NSString *key in _allPersonDic) {
        
        NSMutableArray *array = [_allPersonDic objectForKey:key];
        
        for (Person *person in array) {
            NSLog(@"%@" , person);
        }
        
        
    }
    
}

@end

NSString+Character.h

#import <Foundation/Foundation.h>

@interface NSString (Character)

- (NSString *)uppercaseFirstLetter;

@end

NSString+Character.m

@implementation NSString (Character)

- (NSString *)uppercaseFirstLetter{
    
    return [[self uppercaseString] substringToIndex:1];
    
}

@end

main.m

#import <Foundation/Foundation.h>
#import "Person.h"
#import "AddressBook.h"

int main(int argc, const char * argv[]) {
    
    // 创建三个对象,就是三个人啊
        Person *person = [[Person alloc]initWithPersonName:@"Auroua" age:21 gender:@"girl" phoneNumber:@"1352345678" groupName:@"friend"];
         NSLog(@"%@" , person);
        Person *person1 = [[Person alloc]initWithPersonName:@"Lily" age:18 gender:@"girl" phoneNumber:@"18638520107" groupName:@"firend"];
        Person *person4 = [[Person alloc]initWithPersonName:@"DaShi" age:18 gender:@"boy" phoneNumber:@"110" groupName:@"fff"];

    //声明完容器类之后,一定给它开辟空间。
    AddressBook *addressBook = [[AddressBook alloc]initWithMutableDic:[NSMutableDictionary dictionary]];
    //判断person对象是否加进字典里面
    BOOL result = [addressBook addPerson:person];
    NSLog(@"result = %@" , result ? @"YES" : @"NO" );
    
    //判断person1对象是否加进字典里面
     BOOL result1 = [addressBook addPerson:person1];
    NSLog(@"result1 =%@" , result1 ? @"YES" : @"NO" );
    
    //判断person11对象是否加进字典里面
    BOOL result11 = [addressBook addPerson:person4];
    NSLog(@"result11 =%@" , result11 ? @"YES" : @"NO" );

    //查找联系人
    Person *tempPerson = [addressBook findPersonWithPhoneNumber:@"18638520107"];
    NSLog(@"%@" , tempPerson);
    
    //接收排序结束后的数组
    NSArray *array = [addressBook findPersonWithSex:@"girl"];
    NSLog(@"排序后的结果");
    for (Person *per in array) {
        NSLog(@"%@" , per);
    }
    
    //改变联系人信息,判断是否改变成功
   BOOL result2 = [addressBook changePersonWithName:@"Lily" phoneNumber:@"123" sex:@"boy" age:40];
    NSLog(@"%@" , result2 ? @"YES" : @"NO");
    
    //按名字删除一个联系人,删除了Lily
    BOOL result3 = [addressBook deletePersonWithName:@"Lily"];
    NSLog(@"%@" , result3 ? @"YES" : @"NO");
    
    //刚刚删除了Lily,现在把Lily加进来
    [addressBook addPerson:person1];
    
    //删除某一个分组
  BOOL result5 =   [addressBook deleteGroupName:@"D"];
    NSLog(@"%@" , result5 ? @"YES" : @"NO");
    
    //展示分组里面的所有的信息
    [addressBook showAll];
    
    
  
    
    
    return 0;
}
时间: 2024-08-07 21:20:42

用OC语言完成简易通讯录(实现增删改查)功能.的相关文章

SQLite实现基本的增删改查功能

SQLite实现基本的增删改查功能 还是向之前一样,先介绍功能,再介绍所用知识点,然后贴下代码. 一,SQLite简介: SQLite,是一款轻型的数据库,是遵守ACID(原子性.一致性.隔离性.持久性)的关联式数据库管理系统,多用于嵌入式开发中.   SQLite的数据类型:Typelessness(无类型), 可以保存任何类型的数据到你所想要保存的任何表的任何列中. 但它又支持常见的类型比如: NULL, VARCHAR, TEXT, INTEGER, BLOB, CLOB...等. 唯一的

使用MVC5+Entity Framework6的Code First模式创建数据库并实现增删改查功能

此处采用VS2017+SqlServer数据库 一.创建项目并引用dll: 1.创建一个MVC项目 2.采用Nuget安装EF6.1.3 二.创建Model 在models文件夹中,建立相应的model文件,这里建立的class名,就是数据库里表的名字.        在这里面,可以建立表之间的关系,本次将建立Course(课程).Student(学生).StuCourse(课程学生关系)来作为一个Demo [Table("t_course")]   //可以通过Attribute的形

java H2数据库使用并实现增删改查功能

原文:java H2数据库使用并实现增删改查功能 代码下载地址:http://www.zuidaima.com/share/1550463278058496.htm package com.zuidaima.h2sql.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.St

JavaScript之实现基本的增删改查功能

开心一笑 听说这两天,全国都很冷.福建人说1度好冷,北京人笑了:我们这零下17度.黑龙江人也笑了:我们这零下33度.呼伦贝尔人听到哈哈大笑:我们这零下43度.福建人听完冷笑一声:我说的是室内,室内,室内 提出问题 如何利用原生的js实现基本的增删改查功能 解决问题 包含两个文件(index.jsp 和 index.js) <%@ page language="java" contentType="text/html; charset=UTF-8" pageEn

js + bootstrap 实现基本的增删改查功能 -- 兰

描述:利用原生js + bootstrap 实现基本的增删改查功能:包含两个文件(index.jsp 和 index.js) <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN

JavaWeb 增删改查功能

1.今天来写一个简单的增删改查功能,这个项目还是接着在昨天写的 --JavaWeb实现简单登录注册-- 来写的. 登录成功进来后对学生信息的增删改查 好了,直接贴上今天写的代码 src文件下的代码: jsp页面: 数据库创建语句: 1 CREATE TABLE nanfeng.student ( 2 stu_id INT NOT NULL AUTO_INCREMENT, 3 stu_name varchar(100) NULL, 4 stu_sex varchar(100) NULL, 5 st

3.创建Manager类,演示对TestUser进行增删改查功能

接上一篇文章 创建NHibernateHelper帮助类,生成sessionFactory http://www.cnblogs.com/fzxiaoyi/p/8443587.html 创建个新的类Manager,演示对TestUser进行增删改查功能 编写代码如下: using MySQLDateBase.Model; using System; using System.Collections.Generic; using System.Linq; using System.Text; us

SpringBoot快速上手——《二》:SpringBoot集成SSM,实现增删改查功能

SpringBoot集成SSM,实现增删改查功能 github源码:https://github.com/xivinChen/SpringBoot 一.先介绍创建模块的另一种方式 1.点击Maven -> 勾选Create from archetype -> 选择 maven-archetype-quickstart 有时会需要点击 自动导入 2.工程目录 可以看到,这样创建的模块是相对干净的,需要我们手动的编写程序启动入口类.需要配置时还得创建配置文件.下一步见证. 3.完善模块 添加依赖,

MySQL初步理解,简易单表增删改查

什么是数据库? 存储数据的仓库,本质是一个文件系统,封装了算法和文件之前数据的存储模式 阶段1:集合 数组 变量 缺点:数据存储在内存中,不能实现数据的持久化存储 阶段2:IO流 结合文件 .txt .xml.... 优点:数据存储在磁盘上,数据可以实现持久化存储 缺点:数据操作时,算法必须自己实现,但是相当一部分算法实现重复 阶段3:数据库 优点:使用专门的程序封装了算法部分 数据库与IO比较:算法 + 文件存储数据数据库结构: 算法部分:.exe程序 lib文件夹下 文件存储部分:以文件和文