导航:首页 > 源码编译 > 安卓实现通讯录的增删改查源码

安卓实现通讯录的增删改查源码

发布时间:2024-03-15 13:33:00

1. 在android中对数据库做增删改查有两种方式分别是sqlitedatabase这个类中的哪几个

一、使用嵌入式关系型SQLite数据库存储数据
在Android平台上,集成了一个嵌入式关系型数据库——SQLite,SQLite3支持NULL、INTEGER、REAL(浮点数字)、 TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、 char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。 但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。 另外,在编写CREATE TABLE 语句时,你可以省略跟在字段名称后面的数据类型信息,如下面语句你可以省略name字段的类型信息:
CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))
SQLite可以解析大部分标准SQL语句,如:
复制代码 代码如下:

查询语句:select * from 表名 where 条件子句 group by 分组字句 having ... order by 排序子句
如: select * from person
select * from person order by id desc
select name from person group by name having count(*)>1
分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录
select * from Account limit 5 offset 3 或者 select * from Account limit 3,5
插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(‘传智',3)
更新语句:update 表名 set 字段名=值 where 条件子句。如:update person set name=‘传智‘ where id=10
删除语句:delete from 表名 where 条件子句。如:delete from person where id=10

二、使用SQLiteOpenHelper对数据库进行版本管理
我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建出应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数据表结构进行更新。那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手机上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工方式创建数据库表吧?因为这种需求是每个数据库应用都要面临的,所以在Android系统,为我们提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库版本进行管理来实现前面提出的需求。

为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结构。当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2(有同学问设置为3行不行?当然可以,如果你愿意,设置为100也行),并且在 onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。

getWritableDatabase()和 getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但 getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
注意:getWritableDatabase(),getReadableDatabase的区别是当数据库写满时,调用前者会报错,调用后者不会,所以如果不是更新数据库的话,最好调用后者来获得数据库连接。
代码:
复制代码 代码如下:

public class DatabaseHelper extends SQLiteOpenHelper {
//类没有实例化,是不能用作父类构造器的参数,必须声明为静态
private static final String name = "ljqdb"; //数据库名称
private static final int version = 1; //数据库版本
public DatabaseHelper(Context context) {
//第三个参数CursorFactory指定在执行查询时获得一个游标实例的工厂类,设置为null,代表使用系统默认的工厂类
super(context, name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS person (
personid integer primary key autoincrement, name varchar(20), age INTEGER)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(" ALTER TABLE person ADD phone VARCHAR(12) NULL "); //往表中增加一列
// DROP TABLE IF EXISTS person 删除表
}
}

在实际项目开发中,当数据库表结构发生更新时,应该避免用户存放于数据库中的数据丢失。
三、使用SQLiteDatabase操作SQLite数据库
Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。对SQLiteDatabase的学习,我们应该重点掌握execSQL()和rawQuery()方法。execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句; rawQuery()方法用于执行select语句。
execSQL()方法的使用例子:
复制代码 代码如下:

SQLiteDatabase db = ....;
db.execSQL("insert into person(name, age) values('林计钦', 24)");
db.close();

执行上面SQL语句会往person表中添加进一条记录,在实际应用中, 语句中的“林计钦”这些参数值会由用户输入界面提供,如果把用户输入的内容原样组拼到上面的insert语句, 当用户输入的内容含有单引号时,组拼出来的SQL语句就会存在语法错误。要解决这个问题需要对单引号进行转义,也就是把单引号转换成两个单引号。有些时候用户往往还会输入像“ & ”这些特殊SQL符号,为保证组拼好的SQL语句语法正确,必须对SQL语句中的这些特殊SQL符号都进行转义,显然,对每条SQL语句都做这样的处理工作是比较烦琐的。 SQLiteDatabase类提供了一个重载后的execSQL(String sql, Object[] bindArgs)方法,使用这个方法可以解决前面提到的问题,因为这个方法支持使用占位符参数(?)。使用例子如下:
复制代码 代码如下:

SQLiteDatabase db = ....;
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"传智播客", 4});
db.close();

execSQL(String sql, Object[] bindArgs)方法的第一个参数为SQL语句,第二个参数为SQL语句中占位符参数的值,参数值在数组中的顺序要和占位符的位置对应。
SQLiteDatabase的rawQuery()用于执行select语句,使用例子如下:
复制代码 代码如下:

SQLiteDatabase db = ....;
Cursor cursor = db.rawQuery("select * from person", null);
while (cursor.moveToNext()) {
int personid = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始
String name = cursor.getString(1);//获取第二列的值
int age = cursor.getInt(2);//获取第三列的值
}
cursor.close();
db.close();

rawQuery()方法的第一个参数为select语句;第二个参数为select语句中占位符参数的值,如果select语句没有使用占位符,该参数可以设置为null。带占位符参数的select语句使用例子如下:
复制代码 代码如下:

Cursor cursor = db.rawQuery("select * from person where name like ? and age=?", new String[]{"%林计钦%", "4"});

Cursor是结果集游标,用于对结果集进行随机访问,如果大家熟悉jdbc, 其实Cursor与JDBC中的ResultSet作用很相似。使用moveToNext()方法可以将游标从当前行移动到下一行,如果已经移过了结果集的最后一行,返回结果为false,否则为true。另外Cursor 还有常用的moveToPrevious()方法(用于将游标从当前行移动到上一行,如果已经移过了结果集的第一行,返回值为false,否则为true )、moveToFirst()方法(用于将游标移动到结果集的第一行,如果结果集为空,返回值为false,否则为true )和moveToLast()方法(用于将游标移动到结果集的最后一行,如果结果集为空,返回值为false,否则为true ) 。

除了前面给大家介绍的execSQL()和rawQuery()方法, SQLiteDatabase还专门提供了对应于添加、删除、更新、查询的操作方法: insert()、delete()、update()和query() 。这些方法实际上是给那些不太了解SQL语法的菜鸟使用的,对于熟悉SQL语法的程序员而言,直接使用execSQL()和rawQuery()方法执行SQL语句就能完成数据的添加、删除、更新、查询操作。

2. C语言,编写一个简单的通讯录管理系统

#include <string.h>

#include <stdio.h>

#include<stdlib.h>

int cntAddr=0,i,j;

char in[12];

const char * strFmt=" %d %s %s %s %s ";

typedef struct ADDRESSD {

int ID;

char name[12];

char workPlace[12];

char teleOff[12];

char teleHome[12];

}ADDRESS;

ADDRESS addrTmp[100],adTmp;

int load(ADDRESS adr[]){

FILE *fp;

if((fp=fopen("c:\txl.txt","r"))!=NULL){

cntAddr=0;

while(!feof(fp)){

fscanf(fp,"%d %s %s %s %s ",&(adr[cntAddr].ID),adr[cntAddr].name,adr[cntAddr].workPlace,adr[cntAddr].teleOff,adr[cntAddr].teleHome);

++cntAddr;

}

}

fclose(fp);

return cntAddr;

};

void list(ADDRESS addr[],int length){

for(i=0;i<length;++i)printf(strFmt,addr[i].ID,addr[i].name,addr[i].workPlace,addr[i].teleOff,addr[i].teleHome);

}

void display(ADDRESS addr[]){

for(i=0;i<cntAddr;++i)addrTmp[i]=addr[i];

for(i=0;i<cntAddr-1;++i)for(j=i+1;j<cntAddr;++j)if(addrTmp[i].ID>addrTmp[j].ID){adTmp=addrTmp[i];addrTmp[i]=addrTmp[j];addrTmp[j]=adTmp;}

for(i=0;i<cntAddr;++i)printf(strFmt,addrTmp[i].ID,addrTmp[i].name,addrTmp[i].workPlace,addrTmp[i].teleOff,addrTmp[i].teleHome);

}

void namesort(ADDRESS addr[],int length){

for(i=0;i<length;++i)addrTmp[i]=addr[i];

for(i=0;i<length-1;++i)for(j=i+1;j<length;++j)if(strcmp(addrTmp[i].name,addrTmp[j].name)>0){adTmp=addrTmp[i];addrTmp[i]=addrTmp[j];addrTmp[j]=adTmp;}

for(i=0;i<length;++i)printf(strFmt,addrTmp[i].ID,addrTmp[i].name,addrTmp[i].workPlace,addrTmp[i].teleOff,addrTmp[i].teleHome);

};

void save(ADDRESS adr[],int length){

FILE *fp;

fp=fopen("c:\txl.txt","w");

for(i=0;i<cntAddr;++i)fprintf(fp,"%d %s %s %s %s ",adr[i].ID,adr[i].name,adr[i].workPlace,adr[i].teleOff,adr[i].teleHome);

fclose(fp);

};

void unitssort(ADDRESS addr[],int length){

for(i=0;i<length;++i)addrTmp[i]=addr[i];

for(i=0;i<length-1;++i)for(j=i+1;j<length;++j)if(strcmp(addrTmp[i].workPlace,addrTmp[j].workPlace)>0){adTmp=addrTmp[i];addrTmp[i]=addrTmp[j];addrTmp[j]=adTmp;}

for(i=0;i<length;++i)printf(strFmt,addrTmp[i].ID,addrTmp[i].name,addrTmp[i].workPlace,addrTmp[i].teleOff,addrTmp[i].teleHome);

};

void namesearch(ADDRESS addr[],int length){

printf("请输入姓名: ");

scanf("%s",&in);

for(i=0;i<length;++i)if(strcmp(addr[i].name,in)==0)printf(strFmt,addr[i].ID,addr[i].name,addr[i].workPlace,addr[i].teleOff,addr[i].teleHome);

};

void unitssearch(ADDRESS adr[],int length){

printf("请输入工作单位: ");

scanf("%s",&in);

for(i=0;i<length;++i)if(strcmp(adr[i].workPlace,in)==0)printf(strFmt,adr[i].ID,adr[i].name,adr[i].workPlace,adr[i].teleOff,adr[i].teleHome);

};

void officenumbersearch(ADDRESS adr[],int length){

printf("请输入办公电话: ");

scanf("%s",&in);

for(i=0;i<length;++i)if(strcmp(adr[i].teleOff,in)==0)printf(strFmt,adr[i].ID,adr[i].name,adr[i].workPlace,adr[i].teleOff,adr[i].teleHome);

};

void homenumbersearch(ADDRESS adr[],int length){

printf("请输入家庭电话: ");

scanf("%s",&in);

for(i=0;i<length;++i)if(strcmp(adr[i].teleHome,in)==0)printf(strFmt,adr[i].ID,adr[i].name,adr[i].workPlace,adr[i].teleOff,adr[i].teleHome);

};

int delet(ADDRESS adr[],int length){

printf("要修改第几条记录: ");

scanf("%d",&j);

for(i=j;i<length-1;++i)adr[i]=adr[i+1];

return --length;

};

void rewrite(ADDRESS adr[],int length){

printf("要修改第几条记录: ");

scanf("%d",&j);

printf("请输入ID: ");

scanf("%d",&i);

adr[j].ID=i;

printf("请输入姓名: ");

scanf("%s",in);

strcpy(adr[j].name,in);

printf("请输入工作单位: ");

scanf("%s",in);

strcpy(adr[j].workPlace,in);

printf("请输入办公电话: ");

scanf("%s",in);

strcpy(adr[j].teleOff,in);

printf("请输入家庭电话: ");

scanf("%s",in);

strcpy(adr[j].teleHome,in);

};

int add(ADDRESS adr[],int length){

printf("请输入ID: ");

scanf("%d",&i);

adr[length].ID=i;

printf("请输入姓名: ");

scanf("%s",in);

strcpy(adr[length].name,in);

printf("请输入工作单位: ");

scanf("%s",in);

strcpy(adr[length].workPlace,in);

printf("请输入办公电话: ");

scanf("%s",in);

strcpy(adr[length].teleOff,in);

printf("请输入家庭电话: ");

scanf("%s",in);

strcpy(adr[length].teleHome,in);

return ++cntAddr;

};

void (){

FILE *fp,*fc;

printf("请输入新文件名(路径中的反斜杠用\表示) ");

scanf("%s",&in);

if((fp=fopen("c:\txl.txt","r"))!=NULL){

fc=fopen(in,"w");

while(!feof(fp)){

fscanf(fp,"%d %s %s %s %s ",&(adTmp.ID),adTmp.name,adTmp.workPlace,adTmp.teleOff,adTmp.teleHome);

fprintf(fc,"%d %s %s %s %s ",adTmp.ID,adTmp.name,adTmp.workPlace,adTmp.teleOff,adTmp.teleHome);

}

fclose(fc);

}

fclose(fp);

};

int enter(ADDRESS adr[]){

cntAddr=0;

printf("请按次序输入数据,结束按CTRL+z: ");

while(1){

printf("请输入ID: ");

if(scanf("%d",&i)==EOF)break;

adr[cntAddr].ID=i;

printf("请输入姓名: ");

if(scanf("%s",in)==EOF)break;

strcpy(adr[cntAddr].name,in);

printf("请输入工作单位: ");

if(scanf("%s",in)==EOF)break;

strcpy(adr[cntAddr].workPlace,in);

printf("请输入办公电话: ");

if(scanf("%s",in)==EOF)break;

strcpy(adr[cntAddr].teleOff,in);

printf("请输入家庭电话: ");

if(scanf("%s",in)==EOF)break;

strcpy(adr[cntAddr].teleHome,in);

++cntAddr;

}

return cntAddr;

};

void showpaixu(ADDRESS adr[],int length)

{

int choice;

menu1:

system("cls");

printf(" *************************通讯录信息管理系统************************* ");

printf(" 1. 全部显示通讯录信息 ");

printf(" 2. 按序号显示通讯录信息 ");

printf(" 3. 按姓名排序 ");

printf(" 4. 按工作单位排序 ");

printf(" 0. 返回上一级菜单 ");

printf(" ******************************************************************** ");

printf(" 请选择(0~4) ");

scanf("%d",&choice);

switch(choice)

{

case 1:

list(adr,length);

printf(" 请按任意键返回... ");

system("pause");

break; /*显示全部记录*/

case 2:

display(adr);

printf(" 请按任意键返回... ");

system("pause");break; /*按序号显示记录*/

case 3:

namesort(adr,length);

printf(" 请按任意键返回... ");

system("pause");

break; /*按姓名排序*/

case 4:

unitssort(adr,length);

printf(" 请按任意键返回... ");

system("pause");

break; /*按工作单位排序*/

case 0: return;

}

goto menu1;

}

/*通讯录信息查找功能*/

void chazhao(ADDRESS adr[],int length)

{

int choice;

menu2:

system("cls");

printf(" *************************通讯录信息管理系统************************* ");

printf(" 1. 通过姓名查找 ");

printf(" 2. 通过工作单位查找 ");

printf(" 3. 通过办公电话查找 ");

printf(" 4. 通过家庭电话查找 ");

printf(" 0. 返回上一级菜单 ");

printf(" ******************************************************************** ");

printf(" 请选择(0~4) ");

scanf("%d",&choice);

switch(choice)

{

case 1:

namesearch(adr,length);

printf(" 请按任意键返回... ");

system("pause");

break; /*按姓名查找记录*/

case 2:

unitssearch(adr,length);

printf(" 请按任意键返回... ");

system("pause");

break; /*按工作单位查找记录*/

case 3:

officenumbersearch(adr,length);

printf(" 请按任意键返回... ");

system("pause");

break; /*按办公电话查找记录*/

case 4:

homenumbersearch(adr,length);

printf(" 请按任意键返回... ");

system("pause");

break; /*按住宅电话查找记录*/

case 0: return;

}

goto menu2;

}

/*通讯录信息变更功能*/

void biangeng(ADDRESS adr[],int length)

{

int choice;

menu3:

system("cls");

printf(" *************************通讯录信息管理系统************************* ");

printf(" 1. 删除记录 ");

printf(" 2. 修改记录 ");

printf(" 3. 添加记录 ");

printf(" 0. 返回上一级菜单 ");

printf(" ******************************************************************** ");

printf(" 请选择(0~3) ");

scanf("%d",&choice);

switch(choice)

{

case 1:

length=delet(adr,length);

save(adr,length);

printf(" 请按任意键返回... ");

getchar();

break; /*删除记录*/

case 2:

rewrite(adr,length);

save(adr,length);

printf(" 请按任意键返回... ");

getchar();

break; /*修改记录*/

case 3:

length=add(adr,length);

save(adr,length);

printf(" 请按任意键返回... ");

getchar();

break; /*插入记录*/

case 0: return;

}

goto menu3;

}

int wenjian(ADDRESS adr[],int length)

{

int choice;

menu4:

system("cls");

printf(" *************************通讯录信息管理系统************************* ");

printf(" 1. 导入文件到通讯录 ");

printf(" 2. 把当前文件复制到新文件上 ");

printf(" 0. 返回上一级菜单 ");

printf(" ******************************************************************** ");

printf(" 请选择(0~2) ");

scanf("%d",&choice);

switch(choice)

{

case 1: length=load(adr);

printf("您已经成功的导入文件到通讯录! ");

printf(" 请按任意键返回... ");

system("pause");break;

case 2: ();

printf("复制成功! ");

printf(" 请按任意键返回... ");

system("pause");break;

case 0: return length;

}

goto menu4;

}

/*关于*/

void about()

{

system("color 87");

system("cls");

printf(" 《通讯录信息管理系统》 ");

printf(" ***************************************** ");

printf(" 版权所有(C) 2009-2010 DIY软件 ");

printf(" 制作人:西北民族大学计算机科学与信息09级计算机3班 王元波 ");

printf(" ***************************************** ");

printf(" 请按任意键返回主菜单...");

system("pause");

}

/******主函数开始*******/

void main()

{

int choice;

int length; /*保存记录长度*/

ADDRESS adr[100] ; /*定义结构体数组*/

menu:

system("color f9");

system("cls");

printf(" *************************通讯录信息管理系统************************* ");

printf(" 请选择以下通讯录管理功能: ");

printf(" 1. 通讯录信息输入 ");

printf(" 2. 通讯录信息浏览及排序 ");

printf(" 3. 通讯录信息查询 ");

printf(" 4. 通讯录信息更改 ");

printf(" 5. 通讯录及文件操作 ");

printf(" 6. 关于通讯录信息管理系统 ");

printf(" 0. 退出通讯录管理系统 ");

printf(" ******************************************************************** ");

printf(" 请选择(0~6) ");

scanf("%d",&choice);

switch(choice)

{

case 1: length=enter(adr);

save(adr,length);

printf(" 请按任意键返回... ");

system("pause");break;/*输入记录*/

case 2: showpaixu(adr,length);break;

case 3: chazhao(adr,length);break;

case 4: biangeng(adr,length);break;

case 5: length=wenjian(adr,length);break;

case 6: about();break;/*关于*/

case 0: return; /*如返回值为则程序结束*/

}

goto menu;

}

拓展资料

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。



3. 通讯录管理系统

我这里有一个,你看看吧,满意的给分哦(在visual c++6.0上运行)
#include<stdlib.h>
#include<string.h> /*使用字符串函数*/
#include<conio.h> /*使用通过控制台进行数据输入和数据输出的函数*/
#include<stdio.h>
#include<dos.h> /*使用DOS函数*/

int i; /*定义一个全局变量i*/

struct addr /*定义通讯地址结构体*/
{ char post_num[10]; /*邮编*/
char addr[60]; /*家庭地址*/
};

struct birth /*定义出生年月结构体*/
{ int year; /*年份*/
int month; /*月份*/
int day; /*日期*/
};

struct record1 /*定义电子通讯录结构体*/
{ int number; /*序号*/
char name[20]; /*姓名*/
char sex; /*性别*/
struct birth birth; /*出生年月*/
struct addr addr; /*通信地址*/
char telephone[13]; /*联系电话*/
}records[50];

FILE *fp; /*定义指向file类型结构体的指针变量*/

void Data_Load() /*定义载入数据函数*/
{ int j;
long k;
fp=fopen("record.txt","r+t"); /*打开文件record.txt,进行读写*/
if(fp!=NULL) /*如果文件不为空*/
{ for(i=1;i<50;i++)
{ j=fgetc(fp); /*从"records.txt"文件读入整型数字*/
if(j==EOF) /*判断是否到了文件尾*/
return; /*如果到了结尾,返回*/
k=i-1;
fseek(fp,k*sizeof(struct record1),SEEK_SET); /*将位置指针移到record1结构体所含字节

的第k倍个字节处*/

fread(&records[i],sizeof(struct record1),1,fp); /*读取一条记录*/
}
}
else
{ fp=fopen("record.txt","w"); /*打开文件record.txt,只写*/
i=1;
}
}

void Data_Show(int j) /*定义显示数据函数*/
{
printf("\n\n\tNo:%3d\n",records[j].number); /*序号*/
printf("\n\tname:%2s\n",records[j].name); /*姓名*/
printf("\n\tbirthday (y/m/d):%4d%2d%2d", records[j].birth.year, records[j].birth.month,

records[j].birth.day); /*打印第j个成员的出生年月日*/
printf("\n\tpost code:%-10s",records[j].addr.post_num); /*邮编*/
printf("\n\taddress:%-40s",records[j].addr.addr); /*家庭地址*/
printf("\n\tphone%-13s",records[j].telephone); /*联系电话*/
}

void Data_Input(int j) /*定义添加数据函数*/
{
fflush(stdin); /*清空输入缓冲区*/
records[j].number=j;
printf("\n\n\n\tinputNo %d ",j);
printf("\n\tname:"); /*输入姓名*/
scanf("%s",records[j].name);
fflush(stdin); /*清空输入缓冲区*/
printf("\tsex(m/f):"); /*输入性别*/
scanf("%c",&records[j].sex);
printf("\t---birthday---"); /*输入出生年月*/
printf("\n\tyear:");
scanf("%d",&records[j].birth.year);
printf("\tmonth:");
scanf("%d",&records[j].birth.month);
printf("\tday:");
scanf("%d",&records[j].birth.day);
printf("\tpost code:"); /*输入邮编*/
scanf("%s",records[j].addr.post_num);
printf("\taddress:"); /*输入家庭地址*/
scanf("%s",records[j].addr.addr);
printf("\tphone:"); /*输入联系电话*/
scanf("%s",records[j].telephone);

}

void Data_Save() /*定义保存函数*/
{
int j;
fp=fopen("record.txt","w"); /*打开文件record.txt,只写*/
for(j=1;j<=i;j++)
{ fwrite(&records[j],sizeof(struct record1),1,fp); /*将结构体变量records的确定个数字节输

入到record.txt文件中,个数为结构体friend1所含字节数*/
}
}

void main() /*主函数*/
{
int j,k;
char ch;
char search_name[40]; /*定义字符串变量*/

Data_Load(); /*声明载入数据函数*/
i--;
do
{ printf("********************************* MENU ***************************************\n");
printf("------------------------! WELLCOME TO THE SYSTEM !------------------------------");
printf("\n*\tSelect Function: *");
printf("*\t1.Add New *");
printf("*\t2.View the data *");
printf("*\t3.Delete *");
printf("*\t4.Search *");
printf("*\t5.Insert *");
printf("*\t6.Save and quit *");
printf("*\t7.Quit *");
printf("\n******************************** MENU ****************************************\n");
printf("\tPlease choose the option you need:");
ch=getche(); /*输入字符*/
switch(ch)
{
case '1':
{ int p;
printf("\n\tPlease input the number of people you want to add:");
scanf("%d",&p);/*增加记录*/
printf("\tPlease press ENTER again");
while(getch()!=0x1b&&i<p)
{ i++;
Data_Input(i);
printf("Please press Enter again to continue\n");
}
if(i==p)printf("\n\tThe data is full\n");
} /*记录完后显示通讯录已满*/
break;

case '2': j=1; /*打印所有记录*/
while(getch()!=0x1b&&j<=i) Data_Show(j++); /*声明打印数据函数*/
if(j>i) printf("\n\tThe system is end\n"); /*显示记录末尾*/
break;

case '3': /*删除通讯录中的记录*/
if(i<1)
{ printf("\n\tno record\n"); /*显示无记录*/
break;
}
printf("\n\tplease input the number you want to delect:");
scanf("%d",&k);
printf("\tsucceed!\n");
for(j=k;j<i;j++) /*将删除位置后的元素顺序前移,即后一数据复制到前一位置,循环操作*/
{ strcpy(records[j].name,records[j+1].name);
records[j].sex=records[j+1].sex;
records[j].birth.year=records[j+1].birth.year;
records[j].birth.month=records[j+1].birth.month;
records[j].birth.day=records[j+1].birth.day;
strcpy(records[j].addr.post_num,records[j+1].addr.post_num);
strcpy(records[j].addr.addr,records[j+1].addr.addr);
strcpy(records[j].telephone,records[j+1].telephone);
}
i--; /*元素总数减1*/
break;
case '4': /*通讯录搜索功能*/
printf("\n\tPlease input the name:"); /*输入名字*/
scanf("%s", search_name); /*获得名字到指针型字符串变量*/
for(j=1;j<=i;j++)
{
if(strcmp(search_name,records[j].name)==0) /*比较字符串,即查看是否与记录中名字

相同*/
{ Data_Show(j);
printf("\n"); /*搜索成功,打印记录结束循环*/
break;
}
}
if(j>i) /*搜索失败*/
printf("\n\tNo Record "); /*显示无此记录*/
break;
case '5':
printf("\n\tInsert No:"); /*录入插入位置*/
scanf("%d",&k);
for(j=k+1;j<i;j++) /*将插入位置后的元素顺序后移,即将其复制到后一位置,循环操作*/
{ strcpy(records[j].name,records[j-1].name);
records[j].sex=records[j-1].sex;
records[j].birth.year=records[j-1].birth.year;
records[j].birth.month=records[j-1].birth.month;
records[j].birth.day=records[j-1].birth.day;
strcpy(records[j].addr.post_num,records[j-1].addr.post_num);
strcpy(records[j].addr.addr,records[j-1].addr.addr);
strcpy(records[j].telephone,records[j-1].telephone);
}
Data_Input(k); /*声明增加数据函数*/
i++;/*将记录数目加一*/
break;
case '6': Data_Save();
printf("\n"); /*声明保存函数*/
exit(0); break; /*保存后退出*/
case '7': printf("\n\tsave or not?:(y/n)");
ch=getch(); /*获得输入字符*/
if(ch=='y') Data_Save();
fclose(fp); /*关闭record.txt文件*/
exit(0); /*退出程序*/
default: printf("Please choose1-4\n"); /*输入的如果不是数字1-4,让其重新输入*/
}
}
while(1); /*每次都从第一个功能开始,循环操作*/
}
请采纳答案,支持我一下。

阅读全文

与安卓实现通讯录的增删改查源码相关的资料

热点内容
有pdf却打不开 浏览:460
七星彩软件app怎么下载 浏览:217
32单片机的重映射哪里改 浏览:816
为什么前端不用刷算法题 浏览:708
对称加密系统和公钥加密系统 浏览:428
历史地理pdf 浏览:606
物联网云服务器框架 浏览:648
sybaseisql命令 浏览:183
android权威编程指南pdf 浏览:663
哪些软件属于加密软件 浏览:646
文件夹75丝什么意思 浏览:470
最便宜sop8单片机 浏览:966
图解周易预测学pdf 浏览:420
c盘莫名奇妙多了几个文件夹 浏览:171
贵州花溪门票优惠app哪个好 浏览:803
如何说话不会让人有被命令的感觉 浏览:440
哪里可下载湘工惠app 浏览:265
福特python 浏览:312
pdf转换成word表格 浏览:353
无线远端服务器无响应是什么意思 浏览:672