精华内容
下载资源
问答
  • c语言班级通讯录

    2017-10-12 17:41:07
    d) 删除:用户可以定位到通讯录中的某条记录,并对其执行删除的操作 e) 查找:用户可以根据需要输入姓名或者号码对通讯录中的记录进行查找操作,并显示出所有符合条件的记录 f) 修改:用户定位到某条记录可对其进
  • 学生通讯录

    2018-01-16 16:54:20
    (3)学生信息删除:删除学生通讯录的学生信息,删除后无法恢复。 (4)学生信息查找:可根据学生姓名等信息查询学生通讯录中的学生信息,便于检索。 (5)学生信息分类:可根据预先设置的类别标签,对学生进行分类...
  • 简单通讯录

    2018-07-11 10:09:50
     7删除,把文件的数据读入数组中进行条件查询到后进行删除,然后覆盖性的输出文件中。 8 文件的导入,在文件读入数组中然后进行操作。 9文件的导出,数据就是在文件中进行修改的。 10退出,用for(;i==1;)...
  • d) 删除:用户可以定位到通讯录中的某条记录,并对其执行删除的操作 e) 查找:用户可以根据需要输入姓名或者号码对通讯录中的记录进行查找操作,并显示出所有符合条件的记录 f) 修改:用户定位到某条记录可对其...
  • 简易手机通讯录

    2018-12-28 18:45:21
    简易手机通讯录 一:功能模块  1.主界面,通过listview 展示所有联系人信息,并在没有联系人时给出友好提示  2.主界面.显示最近查看的某个联系人信息  3.主界面,可以长按某联系人项,弹出菜单,删除该联系人;...
  • Linux C链表完成通讯录

    2018-12-08 15:35:31
    用户输入2后显示已录入好友信息 搜索好友: 用户输入3后搜索好友姓名查询,未搜索提示,搜索显示该好友信息。 删除好友: 用户输入4后让用户输入要删除好友姓名删除,如果存在同名的多个好友,则列表处所有同名...

    通讯录功能:
    主界面:主要显示软件功能
    1)添加好友信息。
    2)列表好友信息。
    3)搜索好友。
    4)删除好友。
    添加好友:
    用户输入1后,录入信息,提示添加成功与否
    列表好友:
    用户输入2后显示已录入好友信息
    搜索好友:
    用户输入3后搜索好友姓名查询,未搜索到提示,搜索到显示该好友信息。
    删除好友:
    用户输入4后让用户输入要删除好友姓名删除,如果存在同名的多个好友,则列表处所有同名好友信息,让用户通过ID号删除。提示用户删除成功。

    头文件:LinkList.h

    #ifndef _LINKLIST_H_
    #define _LINKLIST_H_
    
    typedef int DATA;
    typedef enum{TRUE,FALSE,ERROR}BOOL;
    enum{QUIT,INSERT,DISPLAY,SEARCH,DELETE};
    typedef struct addlist
    {
    	long pertel;
    	long comtel;
    	int  id;
    	char address[20];
    	char name[20];
    }Txl;
    
    typedef struct _node
    {
    	Txl te;
    	DATA data;
    	struct _node *next;
    }Node;
    typedef struct _list
    {
    	Node *head;
    }List;
    //创建一个空链表
    List *CreateList();
    //删除链表
    void Destory(List *pList);
    //增加联系人
    BOOL Insert_Frined(List *pList);
    //显示联系人
    void Display(List *pList);
    
    
    //删除联系人
    BOOL Delete_Friend(List *pList);
    //查找联系人
    BOOL Find_Friend(List *pList);
    
    int myrand(int Rand_Max);
    #endif //_LINKLIST_H_
    

    功能函数:LinkList.c

    #include "LinkList.h"
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <time.h>
    List *CreateList()
    {
    	List *p = (List*)malloc(sizeof(List)/sizeof(char));
    	if(NULL == p)
    	{
    		return NULL;
    	}
    	p->head = (Node*)malloc(sizeof(Node)/sizeof(char));
    	p->head->next = NULL;
    	if(NULL == p->head)
    	{
    		free(p);
    		return NULL;
    	}
    	return p;
    }
    int myrand(int Rand_Max)//产生随机数
    {
    	
    	int test[100000]={0};
    	int i=0;
    	srand(time(NULL));
    	
    	int rnum=rand()%Rand_Max;
    	test[rnum] += 1;
    	for(i=10000;i<100000;i++)
    	{
    		if(test[i]>1)
    		{
    			rnum=(rand()%Rand_Max)+10000;
    		}
    	}
    	
    	return rnum;
    	
    }
    BOOL Insert_Friend(List *pList)
    {
    	if(NULL == pList)
    	{
    		return ERROR;
    		printf("添加失败\n");
    	}
    	Node *p = (Node*)malloc(sizeof(Node)/sizeof(char));
    	if(NULL == p)
    	{
    		return ERROR;
    		printf("添加失败\n");
    	}
    	
    	printf("请输入姓名:\n");
    	scanf("%s",p->te.name);
    	int ran = myrand(10000);
    	p->te.id = ran;//给每个联系人分配一个随机ID
    	printf("生成随机ID:%d\n",ran);
    	printf("请输入个人手机号码:\n");
    	scanf("%ld",&p->te.pertel);
    	printf("请输入公司手机号码:\n");
    	scanf("%ld",&p->te.comtel);
    	printf("请输入家庭住址:\n");
    	scanf("%s",p->te.address);
    	printf("添加成功!\n");	
    	
    	p->next = pList->head->next;
    	pList->head->next = p;
    	return TRUE;
    }
    
    	
    
    BOOL Delete_Friend(List *pList)//删除联系人
    {
    	if(NULL == pList)
    	{
    		return ERROR;
    	}
    	char deletename[20];//记录输入的字符串
    	printf("请输入要删除联系人的姓名:\n");
    	scanf("%s",deletename);
    	Node *tmp =pList->head;
    	DATA count = 0;//记录是否有同名的联系人
    	while(tmp->next)//第一次遍历看联系人姓名是否唯一
    	{
    		if(!(strcmp(tmp->next->te.name,deletename)))
    		{
    			count++;
    			
    		}
    		tmp = tmp->next;
    	}	
    	Node *lp = pList->head->next;
    	Node *tp = pList->head;
    	Node *mp = pList->head;
    	if(count >1)//如果不唯一
    	{
    		printf("有重名,请输入ID确认删除\n");
    		int deleteid = 0;//记录ID,通过ID删除
    		while(lp)
    		{
    			if(!(strcmp(lp->te.name,deletename)))//打印出相同姓名的联系人
    			{
    			
    				printf("ID      : %d\n",lp->te.id);
    				printf("姓名    : %s\n",lp->te.name);
    				printf("个人电话: %ld\n",lp->te.pertel);
    				printf("公司电话: %ld\n",lp->te.comtel);
    				printf("家庭住址:  %s\n",lp->te.address);
    				
    			}
    			
    			
    			lp = lp->next;
    		}
    		scanf("%d",&deleteid);//输入ID进行删除
    		while(mp->next)//通过ID删除
    		{
    			if(mp->next->te.id == deleteid)
    			{
    				Node *p = mp->next;
    				mp->next = p->next;
    				free(p);
    				printf("删除成功\n");
    				return TRUE;
    			}
    			mp = mp->next;
    		}
    	}
    	else//联系人姓名唯一,直接进行删除
    	{
    		while(tp->next)
    		{
    			if(!(strcmp(tp->next->te.name,deletename)))
    			{
    				
    				Node *p = tp->next;
    				tp->next = p->next;
    				free(p);
    				printf("删除成功\n");
    				return TRUE;
    			
    			}
    			tp = tp->next;
    		}
    	}		
    	printf("未找到,删除失败\n");
    		return FALSE;
    		
    }
    BOOL Find_Friend(List *pList)//查找联系人
    {
    	if(NULL == pList)
    	{
    		return ERROR;
    	}
    	Node *tmp =pList->head->next;
    	char searchname[20];xx1s
    	printf("请输入要查找好友姓名:\n");
    	scanf("%s",searchname);
    	
    	while(tmp!=NULL)
    	{
    		
    		if(!(strcmp(tmp->te.name,searchname)))
    		{
    			printf("ID  : %d\n",tmp->te.id);
    			printf("姓名: %s\n",tmp->te.name);
    			printf("个人电话: %ld\n",tmp->te.pertel);
    			printf("公司电话: %ld\n",tmp->te.comtel);
    			printf("家庭住址:  %s\n",tmp->te.address);
    			return TRUE;
    		}
    		tmp = tmp->next;
    	}
    	printf("未找到\n");
    		return FALSE;
    }
    
    void Destory(List *pList)//释放空间
    {
    	if(NULL==pList)
    	{
    		return ;
    	}
    	Node *tmp = pList->head;
    	while(tmp->next)
    	{
    		Node *p = tmp->next;
    		tmp->next = p->next;
    		free(p);
    	}
    	free(pList->head);
    	free(pList);
    }
    void Display(List *pList)//显示联系人
    {
    	if(NULL==pList)
    	{
    		return ;
    	}
    	
    	Node *tmp = pList->head->next;
    	while(tmp)
    	{
    		printf("ID  : %d\n",tmp->te.id);
    		printf("姓名: %s\n",tmp->te.name);
    		printf("个人电话: %ld\n",tmp->te.pertel);
    		printf("公司电话: %ld\n",tmp->te.comtel);
    		printf("家庭住址:  %s\n",tmp->te.address);
    		tmp = tmp->next;
    	}
    	printf("\n");
    }
    	
    	
    	
    

    主函数:p1.c

    #include <stdio.h>
    #include "LinkList.h"
    #include <string.h>
    int main()
    {
    	int com = 0;
    	List *l = CreateList();
    	 while(1)
    	{
    		printf("\t**************\n");
    		printf("\t*1.添加好友信息*\n");
    		printf("\t*2.列表好友信息*\n");
    		printf("\t*3.搜索好友信息*\n");
    		printf("\t*4.删除好友信息*\n");
    		printf("\t*0. 退出通讯录 *\n");
    		printf("\t**************\n");
    		scanf("%d",&com);
    		switch(com)
    		{
    			case INSERT:
    				Insert_Friend(l);
    				system("clear");
    				break;
    			case DISPLAY:
    				system("clear");
    				Display(l);
    				break;
    			case SEARCH:
    				system("clear");
    				Find_Friend(l);
    				break;
    			case DELETE:
    			system("clear");
    			Delete_Friend(l);
    				break;
    			case QUIT:
    			printf("谢谢使用!\n");
    				return ;
    			default:
    				printf("请输入正确的选项\n");
    				break;
    		}
    		
    	}
    	return 0;
    }
    
    展开全文
  • 通讯录v1.0

    2007-12-17 16:14:31
    查询联系信息 在主菜单、右键菜单、托盘右键菜单上选择查询或按CTRL+ALT+S系统热键打开查询对话框,输入中文或英文名确定后显示联系人卡片 5.显示当前信息 直接在树形分组中双击显示当前联系人卡片 6....
  • cout当前通讯录为空,请输入第一个记录的联系人姓名:"; cin>>p->name; cout请输入联系人的家庭住址:"; cin>>p->address; cout请输入联系人的手机号码:"; cin>>p->phonenum; cout朋友"; cout同学...
  • 通讯录小案例

    2017-07-24 15:45:26
    在第一个页面中,选择其中一个item向左滑动,显示删除,点击删除删除当前信息。 (3).在第一个页面中,选择其中一个item点击,则携带数据跳转第二个页面中,修改提交,更改第一个页面信息。 (4).在一个页面中...

    一、图片效果图

      (1).点击添加按钮,跳转到第二个页面,输入姓名、性别、号码,点击提交,添加到第一个页面中。

    (2).在第一个页面中,选择其中一个item向左滑动,显示删除,点击删除,删除当前信息。

    (3).在第一个页面中,选择其中一个item点击,则携带数据跳转到第二个页面中,修改后提交,更改第一个页面信息。

    (4).在一个页面中,点击发信息,则携带电话号码进入发信息界面,点击打电话,则携带电话号码进入打电话界面



    二、布局

    activity_main布局

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#8B8B83">
    
        <LinearLayout
            android:id="@+id/ll_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/colorPrimaryDark"
            android:padding="10dp">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="好友"
                android:textSize="20sp" />
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="0dp"
                android:layout_weight="1" />
    
            <TextView
                android:id="@+id/tv_add"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="添加"
                android:textSize="20sp" />
        </LinearLayout>
    
        <ListView
            android:id="@+id/lv_main"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@id/ll_title"></ListView>
    </RelativeLayout>

    activity_add布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#8B8B83"
        android:orientation="vertical">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/colorPrimaryDark"
            android:gravity="center_vertical"
            android:padding="10dp">
    
            <TextView
                android:id="@+id/cancel"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="返回"
                android:textSize="24sp" />
    
            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1" />
    
            <TextView
                android:id="@+id/confirm"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="提交"
                android:textSize="24sp" />
        </LinearLayout>
    
        <ImageView
            android:id="@+id/iv_touxiang"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginBottom="10dp"
            android:layout_marginTop="20dp"
            android:src="@mipmap/touxiang" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="5dp">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="姓名: " />
    
            <EditText
                android:id="@+id/et_name"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1" />
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:padding="5dp">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="性别: " />
    
            <RadioGroup
                android:id="@+id/rg_gender"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:padding="10dp">
    
                <RadioButton
                    android:id="@+id/rb_man"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:checked="true"
                    android:text="男" />
    
                <RadioButton
                    android:id="@+id/rb_wom"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="女" />
            </RadioGroup>
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="5dp">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="号码: " />
    
            <EditText
                android:id="@+id/et_number"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1" />
        </LinearLayout>
    </LinearLayout>

    item_main布局

    <?xml version="1.0" encoding="utf-8"?>
    <com.atguigu.listviewadapter.util.SlideLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="70dp">
    
        <include
            android:id="@+id/item_content"
            layout="@layout/item_adapter" />
    
        <include
            android:id="@+id/item_delete"
            layout="@layout/item_delete" />
    
    </com.atguigu.listviewadapter.util.SlideLayout>

    item_adapter布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:layout_centerVertical="true"
        android:orientation="horizontal"
        android:gravity="center_vertical"
        android:padding="5dp">
    
        <ImageView
            android:id="@+id/item_touxiang"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="10dp"
            android:src="@mipmap/touxiang" />
    
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_gravity="center_vertical"
            android:gravity="center_vertical"
            android:orientation="vertical">
    
            <TextView
                android:id="@+id/item_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="name" />
    
            <TextView
                android:id="@+id/item_gender"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="gender" />
    
            <TextView
                android:id="@+id/item_number"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="number" />
        </LinearLayout>
    
        <Button
            android:id="@+id/send"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:focusable="false"
            android:text="发信息" />
    
        <Button
            android:id="@+id/call"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:focusable="false"
            android:text="打电话" />
    
    </LinearLayout>

    item_delete布局

    <?xml version="1.0" encoding="utf-8"?>
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="60dp"
        android:background="#ff0000"
        android:gravity="center"
        android:text="删除"
        android:textSize="25sp"
        android:padding="5dp"
        android:textColor="#ffffff"/>
    

    三、代码

    自定义控件代码

    package com.atguigu.listviewadapter.util;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.FrameLayout;
    import android.widget.Scroller;
    
    /**
     * 自定义控件,侧滑菜单item
     */
    
    public class SlideLayout extends FrameLayout {
        private View contentView;
        private View deleteView;
    
        /**
         * 滚动器
         */
        private Scroller scroller;
        /**
         * ContentView的宽
         */
        private int contentWidth;
        private int deleteWidth;
        private int viewHeight; //他们的高都是相同的
    
        public SlideLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
            scroller = new Scroller(context);
        }
    
        /**
         * 当布局文件加载完成的时候回调这个方法
         */
        @Override
        protected void onFinishInflate() {
            super.onFinishInflate();
            contentView = getChildAt(0);
            deleteView = getChildAt(1);
        }
    
        /**
         * 在测量方法里,得到各个控件的宽和高
         *
         * @param widthMeasureSpec
         * @param heightMeasureSpec
         */
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            contentWidth = contentView.getMeasuredWidth();
            deleteWidth = deleteView.getMeasuredWidth();
            viewHeight = getMeasuredHeight();
        }
    
        @Override
        protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
            super.onLayout(changed, left, top, right, bottom);
            //指定菜单的位置
            deleteView.layout(contentWidth, 0, contentWidth + deleteWidth, viewHeight);
        }
    
        private float startX;
        private float startY;
        private float downX;//只赋值一次
        private float downY;
    
        /**
         * 解决滑动item后不能自动打开或者关闭
         * @param event
         * @return
         */
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    //1.按下记录坐标
                    downX = startX = event.getX();
                    downY = startY = event.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    //2.记录结束值
                    float endX = event.getX();
                    float endY = event.getY();
                    //3.计算偏移量
                    float distanceX = endX - startX;
    
                    int toScrollX = (int) (getScrollX() - distanceX);
    
                    //屏蔽非法值
                    if (toScrollX < 0) {
                        toScrollX = 0;
                    } else if (toScrollX > deleteWidth) {
                        toScrollX = deleteWidth;
                    }
                    scrollTo(toScrollX, getScrollY());
                    startX = event.getX();
                    startY = event.getY();
    
                    //在X轴和Y轴滑动的距离
                    float DX = Math.abs(endX - downX);
                    float DY = Math.abs(endY - downY);
                    //解决item滑动后不能自动打开和关闭
                    if (DX > DY && DX > 8) {
                        //水平方向滑动
                        //响应侧滑
                        //反拦截,事件给SlideLayout
                        getParent().requestDisallowInterceptTouchEvent(true);
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    int totalScrollX = getScrollX();//偏移量
                    if (totalScrollX < deleteWidth / 2) {
                        //关闭delete按钮
                        closeDelete();
                    } else {
                        //打开delete按钮
                        openDelete();
                    }
                    break;
            }
            return true;
        }
    
        /**
         * true:拦截孩子的事件,但会执行当前控件的onTouchEvent()方法
         * false:不拦截孩子的事件,事件继续传递
         *
         * @param event
         * @return
         */
        @Override
        public boolean onInterceptTouchEvent(MotionEvent event) {
            boolean intercept = false;
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    //1.按下记录坐标
                    downX = startX = event.getX();
                    downY = startY = event.getY();
                    if(onStateChangeListenter != null){
                        onStateChangeListenter.onDown(this);
                    }
                    break;
                case MotionEvent.ACTION_MOVE:
                    //2.记录结束值
                    float endX = event.getX();
                    //3.计算偏移量
                    startX = event.getX();
    
                    //在X轴和Y轴滑动的距离
                    float DX = Math.abs(endX - downX);
                    //解决item滑动后不能自动打开和关闭
                    if (DX > 8) {
                        intercept = true;
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    break;
            }
            return intercept;
        }
    
        /**
         * 关闭delete按钮
         */
        public void closeDelete() {
            //目标位置 --> 0
            int distanceX = 0 - getScrollX();
            scroller.startScroll(getScrollX(), getScrollY(), distanceX, getScrollY());
            invalidate();//强制刷新
            if(onStateChangeListenter != null){
                onStateChangeListenter.onClose(this);
            }
        }
    
        /**
         * 打开delete按钮
         */
        public void openDelete() {
            //目标位置 --> deleteWidth
            int distanceX = deleteWidth - getScrollX();
            scroller.startScroll(getScrollX(), getScrollY(), distanceX, getScrollY());
            invalidate();//强制刷新
            if(onStateChangeListenter != null){
                onStateChangeListenter.onOpen(this);
            }
        }
    
        /**
         * 调用invalidate()时自动调用此方法
         */
        @Override
        public void computeScroll() {
            super.computeScroll();
            if (scroller.computeScrollOffset()) {
                scrollTo(scroller.getCurrX(), scroller.getCurrY());
                invalidate();
            }
        }
    
        /**
         * 监听SlideLayout状态的改变
         * 限制只能打开一个item
         */
        public interface OnStateChangeListenter{
            void onClose(SlideLayout layout);
            void onDown(SlideLayout layout);
            void onOpen(SlideLayout layout);
        }
    
        private OnStateChangeListenter onStateChangeListenter;
    
        public void setOnStateChangeListenter(OnStateChangeListenter onStateChangeListenter){
            this.onStateChangeListenter = onStateChangeListenter;
        }
    }
    

    数据库帮助类代码

    package com.atguigu.listviewadapter.db;
    
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    
    /**
     * Created by YY on 2017/7/6.
     */
    
    public class PersonOpenHelper extends SQLiteOpenHelper {
    
        /**
         * Person建表语句
         */
        public static final String CREATE_PERSON = "create table Person(id integer primary key autoincrement,personId integer,name text,gender text,number text)";
    
        public PersonOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_PERSON);//创建Person表
    
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
    }
    

    数据库操作类代码

    package com.atguigu.listviewadapter.model;
    
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    
    import com.atguigu.listviewadapter.Person;
    import com.atguigu.listviewadapter.db.PersonOpenHelper;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Created by YY on 2017/7/6.
     */
    
    public class PersonDB {
        /**
         * 数据库名
         */
        public static final String DB_NAME = "listview_adapter";
    
        /**
         * 数据库版本
         */
        public static final int VERSION = 1;
    
        private static PersonDB personDB;
    
        private SQLiteDatabase db;
    
    
        /**
         * 将构造方法私有化
         */
        private PersonDB(Context context) {
            PersonOpenHelper dbHelper = new PersonOpenHelper(context, DB_NAME, null, VERSION);
            db = dbHelper.getWritableDatabase();
        }
    
        /**
         * 获取PersonDB的实例
         */
        public synchronized static PersonDB getInstance(Context context) {
            if (personDB == null) {
                personDB = new PersonDB(context);
            }
            return personDB;
        }
    
        public void savePerson(Person person) {
            if (person != null) {
                ContentValues values = new ContentValues();
                values.put("name", person.getName());
                values.put("gender", person.getGender());
                values.put("number", person.getNamber());
                db.insert("Person", null, values);
            }
        }
    
        /**
         * 从数据库中读取人的信息
         */
        public List<Person> showPerson() {
            List<Person> list = new ArrayList<Person>();
            Cursor cursor = db.query("Person", null, null, null, null, null, null);
            if (cursor.moveToFirst()) {
                do {
                    Person person = new Person();
                    person.setPersonId(cursor.getInt(cursor.getColumnIndex("id")));
                    person.setName(cursor.getString(cursor.getColumnIndex("name")));
                    person.setGender(cursor.getString(cursor.getColumnIndex("gender")));
                    person.setNamber(cursor.getString(cursor.getColumnIndex("number")));
                    list.add(person);
                } while (cursor.moveToNext());
            }
            if (cursor != null) {
                cursor.close();
            }
            return list;
        }
    
        /**
         * 从数据库中删除人的信息
         */
        public void deletePerson(int personId) {
    
            db.delete("Person", "id=?", new String[]{personId + ""});
        }
    
        /**
         * 从数据库中更新人的信息
         */
        public void updatePerson(Person person) {
            ContentValues contentValues = new ContentValues();
            contentValues.put("name", person.getName());
            contentValues.put("gender", person.getGender());
            contentValues.put("number", person.getNamber());
            db.update("Person", contentValues, "id=?", new String[]{person.getPersonId() + ""});
        }
    }
    

    Person类代码

    package com.atguigu.listviewadapter;
    
    import android.graphics.drawable.Drawable;
    
    import java.io.Serializable;
    
    /**
     * Created by YY on 2017/7/6.
     */
    
    public class Person implements Serializable {
        private int personId;
        private String name;
        private String gender;
        private String namber;
    
    
        public Person() {
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            this.gender = gender;
        }
    
        public String getNamber() {
            return namber;
        }
    
        public void setNamber(String namber) {
            this.namber = namber;
        }
    
        public Person(int personId, String name, String gender, String namber) {
    
            this.name = name;
            this.gender = gender;
            this.namber = namber;
        }
    
        public int getPersonId() {
            return personId;
        }
    
        public void setPersonId(int personId) {
            this.personId = personId;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "personId=" + personId +
                    ", name='" + name + '\'' +
                    ", gender='" + gender + '\'' +
                    ", namber='" + namber + '\'' +
                    '}';
        }
    }
    

    MainActivity类代码

    package com.atguigu.listviewadapter;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.net.Uri;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.Window;
    import android.widget.BaseAdapter;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.ListView;
    import android.widget.TextView;
    
    import com.atguigu.listviewadapter.model.PersonDB;
    import com.atguigu.listviewadapter.util.SlideLayout;
    
    import java.util.List;
    
    
    public class MainActivity extends Activity {
    
        private TextView tv_add;
        private ListView lv_main;
        private MyAdapter myAdapter;
    
        private List<Person> list;
        private int requestCode = 2;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_main);
            tv_add = (TextView) findViewById(R.id.tv_add);
            lv_main = (ListView) findViewById(R.id.lv_main);
    
            tv_add.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, AddActivity.class);
    
                    startActivityForResult(intent, requestCode);
                }
            });
            //添加数据
            PersonDB personDB = PersonDB.getInstance(this);
            list = personDB.showPerson();
            //设置BaseAdapter
            myAdapter = new MyAdapter();
            //添加到lv_main中
            lv_main.setAdapter(myAdapter);
    
        }
    
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == 2) {
                if (resultCode == 3) {
                    // 从data中取出数据
                    Person person = (Person) data.getSerializableExtra("person_data");
                    list.add(person);
                }
            }
            if (requestCode == 5) {
                if (resultCode == 4) {
                    Log.e("onActivityResult", "onActivityResult");
                    list.clear();
                    PersonDB personDB = PersonDB.getInstance(this);
                    list = personDB.showPerson();
                }
            }
            myAdapter.notifyDataSetChanged();
    
        }
    
        public class MyAdapter extends BaseAdapter {
            @Override
            public int getCount() {
                return list.size();
            }
    
            @Override
            public Object getItem(int position) {
                return null;
            }
    
            @Override
            public long getItemId(int position) {
                return 0;
            }
    
            @Override
            public View getView(final int position, View convertView, ViewGroup parent) {
                ViewHolder viewHolder;
                if (convertView == null) {
                    convertView = View.inflate(MainActivity.this, R.layout.item_main, null);
                    viewHolder = new ViewHolder();
                    //得到当前行的数据对象
                    viewHolder.item_delete = (TextView) convertView.findViewById(R.id.item_delete);
                    viewHolder.item_content = (LinearLayout) convertView.findViewById(R.id.item_content);
                    viewHolder.imageView = (ImageView) viewHolder.item_content.findViewById(R.id.item_touxiang);
                    viewHolder.nameTV = (TextView) viewHolder.item_content.findViewById(R.id.item_name);
                    viewHolder.genderTV = (TextView) viewHolder.item_content.findViewById(R.id.item_gender);
                    viewHolder.numberTV = (TextView) viewHolder.item_content.findViewById(R.id.item_number);
                    viewHolder.send = (Button) viewHolder.item_content.findViewById(R.id.send);
                    viewHolder.call = (Button) viewHolder.item_content.findViewById(R.id.call);
                    convertView.setTag(viewHolder);
                } else {
                    viewHolder = (ViewHolder) convertView.getTag();
                }
                final Person person = list.get(position);
                //设置数据
                viewHolder.nameTV.setText(person.getName());
                viewHolder.genderTV.setText(person.getGender());
                viewHolder.numberTV.setText(person.getNamber());
    
                final String number = list.get(position).getNamber();
    
                /**
                 * 点击发信息,携带电话号码进入发信息界面
                 */
                viewHolder.send.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        String actionSend = Intent.ACTION_SENDTO;
                        Intent intentSend = new Intent(actionSend);
                        intentSend.setData(Uri.parse("smsto:" + number));
                        startActivity(intentSend);
    
                    }
                });
    
                /**
                 * 点击打电话,携带电话号码进入打电话界面
                 */
                viewHolder.call.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        String actionCall = Intent.ACTION_DIAL;
                        Intent intentCall = new Intent(actionCall);
                        intentCall.setData(Uri.parse("tel:" + number));
                        startActivity(intentCall);
                    }
                });
    
                /**
                 * 给每一个item_content设置监听,跳转到AddActivity界面,用于更新数据
                 */
                viewHolder.item_content.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Person person = list.get(position);
                        Intent intent = new Intent(MainActivity.this, AddActivity.class);
                        intent.putExtra("onClick_item", true);
                        intent.putExtra("person", person);
                        int requestCode2 = 5;
                        startActivityForResult(intent, requestCode2);
                    }
                });
    
                /**
                 * 点击删除按钮,删除数据库中的数据和删除列表中的数据,并更新列表
                 */
                viewHolder.item_delete.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Person personDelete = list.get(position);
                        PersonDB personDB = PersonDB.getInstance(MainActivity.this);
                        personDB.deletePerson(personDelete.getPersonId());
                        list.remove(position);
    
                        SlideLayout slideLayout = (SlideLayout) v.getParent();
                        slideLayout.closeDelete();
    
                        myAdapter.notifyDataSetChanged();
                    }
                });
                SlideLayout slideLayout = (SlideLayout) convertView;
                slideLayout.setOnStateChangeListenter(new MyOnStateChangeListenter());
    
                return convertView;
    
            }
        }
    
        private SlideLayout slideLayout;
    
        class MyOnStateChangeListenter implements SlideLayout.OnStateChangeListenter {
    
            @Override
            public void onClose(SlideLayout layout) {
                if (slideLayout == layout) {
                    slideLayout = null;
                }
            }
    
            @Override
            public void onDown(SlideLayout layout) {
                if (slideLayout != null && slideLayout != layout) {
                    slideLayout.closeDelete();
                }
            }
    
            @Override
            public void onOpen(SlideLayout layout) {
                slideLayout = layout;
            }
        }
    
        private static class ViewHolder {
            TextView item_delete;
            LinearLayout item_content;
            ImageView imageView;
            TextView nameTV;
            TextView genderTV;
            TextView numberTV;
            Button send;
            Button call;
        }
    
    
    }
    


    AddActivity代码

    package com.atguigu.listviewadapter;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.Window;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.RadioButton;
    import android.widget.RadioGroup;
    import android.widget.TextView;
    
    import com.atguigu.listviewadapter.model.PersonDB;
    
    public class AddActivity extends Activity implements View.OnClickListener {
    
        private TextView cancel;
        private TextView confirm;
    
        private ImageView iv_touxiang;
        private EditText et_name;
        private RadioGroup rg_gender;
        private EditText et_number;
        private String gender = "男";
    
        /**
         * 是否是点击onItemClick跳转过来的
         */
        private boolean isFromItem;
    
        /**
         * 记录更新的person
         */
        private Person itemPerson;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_add);
            cancel = (TextView) findViewById(R.id.cancel);
            confirm = (TextView) findViewById(R.id.confirm);
            iv_touxiang = (ImageView) findViewById(R.id.iv_touxiang);
            et_name = (EditText) findViewById(R.id.et_name);
            rg_gender = (RadioGroup) findViewById(R.id.rg_gender);
            et_number = (EditText) findViewById(R.id.et_number);
    
            //如果是从Item中跳转过来,设置数据
    
            isFromItem = getIntent().getBooleanExtra("onClick_item", false);
            itemPerson = (Person) getIntent().getSerializableExtra("person");
            if (isFromItem) {
                et_name.setText(itemPerson.getName());
                String gender_item = itemPerson.getGender();
                if (gender_item.equals(gender)) {
                    rg_gender.check(R.id.rb_man);
                } else {
                    rg_gender.check(R.id.rb_wom);
                }
                et_number.setText(itemPerson.getNamber());
            }
    
    
            rg_gender.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(RadioGroup group, int checkedId) {
                    RadioButton checked = (RadioButton) findViewById(checkedId);
                    gender = checked.getText().toString();
                }
            });
    
            cancel.setOnClickListener(this);
            confirm.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.cancel:
                    finish();
                    break;
                case R.id.confirm:
                    String name = et_name.getText().toString();
                    String number = et_number.getText().toString();
    
                    if (!isFromItem) {
                        Person person = new Person();
                        person.setName(name);
                        person.setGender(gender);
                        person.setNamber(number);
                        PersonDB personDB = PersonDB.getInstance(this);
                        personDB.savePerson(person);
                        Intent intent = new Intent();
                        intent.putExtra("person_data", person);
                        int resultCode = 3;
                        setResult(resultCode, intent);
                    } else {
                        PersonDB personDB = PersonDB.getInstance(this);
                        itemPerson.setName(name);
                        itemPerson.setGender(gender);
                        itemPerson.setNamber(number);
                        personDB.updatePerson(itemPerson);
                        Intent intent = new Intent();
                        int resultCode = 4;
                        setResult(resultCode, intent);
                    }
    
                    finish();
                    break;
            }
        }
    }
    


    展开全文
  • 电话通讯录C语言

    2013-05-29 23:10:54
    2、 查询记录模块:主要完成在结构体数组中查找满足相关条件的记录,如可以按照联系人的姓名、联系人的电话号码等项目进行查询,查了,将相关信息显示在屏幕上,否则显示没找到。 3、 更新记录模块:主要完成对...
  • 从集合里面将当前编号的联系人删除 并在cmd里面显示删除成功 如果集合里面没有该编号对应的联系人 cmd里面显示:对不起 没有该编码对应的联系人 修改联系人 如果用户选择的是E: 输入校验: 修改之后的姓名...
  • 程序运行显示一个操作界面,用户可选择“添加删除、查找、排序(按学号或按姓名)和列表输出”等功能,用户选择某一功能,程序或者提示下一步输入(添加删除、查找),或者输出结果(排序(按学号或按...
  • 而且在删除成功跳转的页面也是从第一页开始,所以感觉一点都不舒服,总想试一次性的删除很多个数据,就是选中的数据,然后再跳转到删除的那个页面,这样的话效果要好得多,今天在学习和做通讯录的时候终于掌握...
    我们在做很多项目的时候,总会要删除很多的数据,以前在删除数据的时候只会删除一个,而且在删除成功后跳转到的页面也是从第一页开始,所以感觉到一点都不舒服,总想试一次性的删除很多个数据,就是选中的数据,然后再跳转到删除的那个页面,这样的话效果要好得多,今天在学习和做通讯录的时候终于掌握了该方法,获得很大的收获。其中思路如下:
    1.首先在显示信息页面添加一个操作烈,该列是一个复选框,可以支持多选,反选,清空的功能,该功能是用JavaScript进行控制,主要方法如下:
    全选功能:
    function all1(){
    var arr = document.getElementsByName("ids");
    var size = arr.length;
    for(var i = 0 ; i < size ; i++ ){
    arr[i].checked=true;

    }
    }
    反选功能:
    function reselected(){
    var arr = document.getElementsByName("ids");
    var size = arr.length;
    for(var i = 0 ; i < size ; i++ ){
    arr[i].checked= !arr[i].checked;
    }

    }
    清空功能:
    function clear1(){
    var arr = document.getElementsByName("ids");
    var size = arr.length;
    for(var i = 0 ; i < size ; i++ ){
    arr[i].checked=false;

    }

    }
    然后获取它的id:
    function $(id){
    return document.getElementById(id);
    }
    function delForm(){
    var f = $("delForm");
    f.submit();
    }
    提交到servlet页面上进行处理和控制:
    servlet的页面控制代码可以获取要删除的数据,把它存到一个数组里面,然后调用java方法进行统一的删除。其中java方法的代码如下:
    public void removeLinkManById(String[] ids) {
    if(ids == null)return;
    StringBuffer sb = new StringBuffer();
    for(String id : ids){
    sb.append(id+",");
    }
    String sb1 = sb.substring(0, sb.length()-1);
    String sql = "delete from t_linkman where id in ("+sb1+")";
    SQLHelper.update(sql,null);
    }

    在servlet页面中进行调用和页面跳转,实现跳到当前页面:
    //获取要是删除的数据
    String [] ids = request.getParameterValues("ids");
    //调用删除方法
    LinkManService.getInstance().removeLinkManById(ids);
    //获取http头,就是获取当前的路径
    String path = request.getHeader("Referer");
    //该方法是如果当前页全部删除了就不能再跳,要跳到前一页,该方法一会将介绍
    String path1 = PageNoConvert.convert(path);
    //request.getRequestDispatcher("main1.jsp").forward(request, response);
    //重定向转到当前页面,在此不能使用转发,转发将会出错
    response.sendRedirect(path1);

    PageNoConvert类:(主要功能是为了防止用户全部删除页面后,返回到的页是空的,所以要做相应的处理,转向前一页,达到一定的效果),该类的代码如下:
    public final class PageNoConvert {


    /**该类完全都是运用字符串的处理方式
    * pageNo=3 如果3没在内容跳到pageNo = 2;
    * @param url
    * @return
    */
    public static String convert(String url){
    if(url == null)return null;

    //必须 4 位置
    int index = url.indexOf("pageNo")+7;
    //pageNo = 4
    String pageNo = url.substring(index);

    if(pageNo == null)return null;
    int page = Integer.parseInt(pageNo);

    boolean exists = LinkManService.getInstance().isExistsByPageNo(page);

    //这一页己经不存在内容
    if(exists == false){
    page = page - 1;
    }
    if(page < 1){
    page = 1;
    }

    String nurl = url.replaceAll(pageNo,Integer.toString(page));

    return nurl;

    }
    这样的方法并不是很好,但是对于初学者来说是一种进步,在未来的工作当中,将会很有用处!
    展开全文
  • c++课程设计之通讯录

    2008-10-28 17:31:19
    将编辑框内的信息按姓名顺序加入通讯录,然后显示第一个记录;如果重名,则不添加并弹出提示。 3.修改记录: 修改当前记录,显示当前记录。姓名字段为关键字,不允许修改。 4.删除记录: 删除当前记录,然后...
  • 实现一个通讯录通讯录可以用来存储人的信息,每个人的信息包括: 姓名、性别、年龄、电话、住址 ...在第一次写通讯录时 , 设置了人数上限一千 , 并且不可保存 , 程序退出后添加的联系人就失效了 , 但是搭建...

    实现一个通讯录;
    通讯录可以用来存储人的信息,每个人的信息包括:
    姓名、性别、年龄、电话、住址
    提供方法:

    1. 添加联系人信息
    2. 删除指定联系人信息
    3. 查找指定联系人信息
    4. 修改指定联系人信息
    5. 显示所有联系人信息
    6. 清空所有联系人
    7. 以名字排序所有联系人
    8. 保存联系人到文件并退出程序
    9. 加载联系人

    在第一次写通讯录时 , 设置了人数上限一千 , 并且不可保存 , 程序退出后添加的联系人就失效了 , 但是搭建起来的通讯录框架为后续功能提供了很好的基础

    #include <stdio.h>
    #include <string.h>
    
    #define MAX_PERSON_INFO_SIZE 1000
    #define MAX_DATA_SIZE 1024
    
    typedef struct PersonInfo{
        char name[MAX_DATA_SIZE];
        char phone[MAX_DATA_SIZE];
        char sex[MAX_DATA_SIZE];
        char age[MAX_DATA_SIZE];
        char address[MAX_DATA_SIZE];
    }PersonInfo;
    
    typedef struct AddressBook{
        PersonInfo person [MAX_PERSON_INFO_SIZE];
        //[0,size)
        int size;
    }AddressBook;
    
    AddressBook g_address_book;//g表示全局变量
    
    void Init(){
        for (int i = 0; i <MAX_PERSON_INFO_SIZE ; ++i) {
            g_address_book.person[i].name[0]='\0';
            g_address_book.person[i].phone[0]='\0';
            g_address_book.person[i].sex[0]='\0';
            g_address_book.person[i].age[0]='\0';
            g_address_book.person[i].address[0]='\0';
        }
    }
    
    int Menu(){
        printf("==========================\n");
        printf("1.新增联系人\n");
        printf("2.删除联系人\n");
        printf("3.查找联系人\n");
        printf("4.更新联系人信息\n");
        printf("5.打印全部联系人\n");
        printf("6.排序联系人\n");
        printf("7.清空联系人\n");
        printf("0.退出\n");
        printf("==========================\n");
        printf("请输入您的选择:");
        int choice=0;
        scanf("%d",&choice);
        return choice;
    }
    
    
    void Empty(){
        //这个函数用来凑数,令编号和用户输入一致.
    }
    
    void AddPersonInfo(){
        printf("*新增联系人*\n");
        if(g_address_book.size>=MAX_PERSON_INFO_SIZE){
            printf("新增联系人失败!\n");
            return;
        }
        PersonInfo* person_info=&g_address_book.person[g_address_book.size];
        printf("请输入联系人姓名:");
        //必须获取到一个指针,修改的内容是一个预期的内容(否则person_info只是一份拷贝,无法修改)
        scanf("%s",person_info->name);
        printf("请输入联系人电话:");
        scanf("%s",person_info->phone);
        printf("请输入联系人性别(male 男,female 女,unknow 未知):");
        scanf("%s",person_info->sex);
        printf("请输入联系人年龄:");
        scanf("%s",person_info->age);
        printf("请输入联系人地址:");
        scanf("%s",person_info->address);
        ++g_address_book.size;
        printf("新增联系人成功!\n");
    }
    
    void DelPersonInfo(){//交换要删除的联系人和最后一个联系人,然后执行删除最后一个联系人的操作
        printf("*删除联系人*\n");
        if(g_address_book.size<=0){
            printf("删除失败,通讯录为空!\n");
            return;
        }
        printf("请输入要删除的序号:");
        int id =0;
        scanf("%d",&id);
        if(id<0||id>=g_address_book.size){
            printf("删除失败!序号有误!\n");
            return;
        }
        g_address_book.person[id]=g_address_book.person[g_address_book.size - 1];//结构体之间赋值
        --g_address_book.size;
        printf("删除联系人成功!\n");
    }
    
    void FindPersonInfo(){
        printf("*查找联系人*\n");
        if(g_address_book.size<=0){
            printf("通讯录为空,无法查找联系人!\n");
            return;
        }
        printf("请输入要查找的姓名:");
        char name[MAX_DATA_SIZE]={0};
        scanf("%s",name);
        for (int i = 0; i <g_address_book.size ; ++i) {
            PersonInfo* info= &g_address_book.person[i];
            if(strcmp(info->name,name)==0){
                printf("[%d] %s\t%s\n",i,info->name,info->phone);
            }else{
                printf("联系人列表查无此人!\n");
                return;
            }
        }
        printf("查找联系人成功!\n");
    }
    
    void UpdatePersonInfo(){
        printf("*更新联系人信息*\n");
        if(g_address_book.size<=0){
            printf("通讯录为空,无法更新联系人!\n");
            return;
        }
        printf("请输入要更新的联系人序号:");
        int id=0;
        scanf("%d",&id);
        if(id<0||id>=g_address_book.size){
            printf("序号有误,修改失败!\n");
            return;
        }
        PersonInfo* info=&g_address_book.person[id];
        printf("旧的姓名为:(%s),请输入新的姓名(若不修改请输入*):\n",info->name);
        char name[MAX_DATA_SIZE]={0};
        scanf("%s",name);
        if(strcmp(name,"*")!=0){
            strcpy(info->name,name);
        }
        char phone[MAX_DATA_SIZE]={0};
        printf("旧的号码为:(%s),请输入新的电话(若不修改请输入*):\n",info->phone);
        scanf("%s",phone);
        if(strcmp(phone,"*")!=0){
            strcpy(info->phone,phone);
        }
        printf("旧的性别为:(%s),请输入新的性别(若不修改请输入*):\n",info->sex);
        char sex[MAX_DATA_SIZE]={0};
        scanf("%s",sex);
        if(strcmp(sex,"*")!=0){
            strcpy(info->sex,sex);
        }
        printf("旧的年龄为:(%s),请输入新的年龄(若不修改请输入*):\n",info->age);
        char age[MAX_DATA_SIZE]={0};
        scanf("%s",age);
        if(strcmp(age,"*")!=0){
            strcpy(info->age,age);
        }
        printf("旧的地址为:(%s),请输入新的地址(若不修改请输入*):\n",info->address);
        char address[MAX_DATA_SIZE]={0};
        scanf("%s",address);
        if(strcmp(address,"*")!=0){
            strcpy(info->address,address);
        }
        printf("成功更新联系人信息!\n");
    }
    
    void PrintAllPersonInfo(){
        printf("*打印全部联系人*\n");
        for (int i = 0; i <g_address_book.size ; ++i) {
            PersonInfo* info =&g_address_book.person[i];//结构体变量触发拷贝,要定义一个指针
            printf("[%d]姓名:%s\t电话:%s\t性别:%s\t年龄:%s\t地址:%s\n",
                    i,info->name,info->phone,info->sex,info->age,info->address);
        }
        printf("共打印了%d条数据!\n",g_address_book.size);
        printf("打印全部联系人成功!\n");
    }
    
    void SortPersonInfo(){//strcmp 姓名字典序
        if(g_address_book.size<=0){
            printf("通讯录为空,无法排序联系人!\n");
            return;
        }
        for (int bound = 0; bound < g_address_book.size ; ++bound) {
            for (int cur = (g_address_book.size)-1; cur >bound ; --cur) {
                PersonInfo* latter=&g_address_book.person[cur];
                PersonInfo* former=&g_address_book.person[cur - 1];
                if(strcmp(latter->name, former->name) < 0){
                    ++g_address_book.size;
                    g_address_book.person[g_address_book.size-1]=g_address_book.person[cur];
                    g_address_book.person[cur]=g_address_book.person[cur-1];
                    g_address_book.person[cur-1]=g_address_book.person[g_address_book.size-1];
                    --g_address_book.size;
                }
            }
        }
        printf("联系人排序成功!\n");
    }
    
    void ClearPersonInfo(){
        printf("*清空联系人*\n");
        if(g_address_book.size<=0){
            printf("通讯录已为空!\n");
            return;
        }
        printf("!-------警告-------!\n");
        printf("您真的要清空所有数据吗???\n");
        printf("是的!(Y) 不是!(N)\n");
        printf("!-------警告-------!\n");
        char choice[1024]={0};
        scanf("%s",choice);
        if(strcmp(choice,"Y")==0){
            g_address_book.size=0;
            printf("成功清除全部联系人数据!\n");
        }else{
            printf("清空操作取消\n");
        }
    }
    
    typedef  void(*Func)();
    
    int main(){
        Func arr[]={
                Empty,
                AddPersonInfo,
                DelPersonInfo,
                FindPersonInfo,
                UpdatePersonInfo,
                PrintAllPersonInfo,
                SortPersonInfo,
                ClearPersonInfo
        };
    
        Init();
    
        while (1){
            int choice =Menu();
            if(choice<0||choice>= sizeof(arr)/ sizeof(arr[0])){
                printf("您的输入有误!\n");
                continue;
            }
            if(choice==0){
                printf("goodbye!\n");
                break;
            }
            arr[choice]();//借助转移表调用各个函数,转移表:函数指针数组
        }
        return 0;
    }
    

    然后遇到了第一个要加入的功能 , 将通讯录的大小改为动态 , 得到了一些提示后发现这并不困难 , 只修改了两个部分的代码 , 就实现了动态通讯录.

    typedef struct AddressBook{
        PersonInfo* person;
        int size;
        int capacity;
    }AddressBook;
    
    void Init(){
        assert(&g_address_book != NULL);
        g_address_book.size=0;
        g_address_book.capacity=1;
        g_address_book.person=(PersonInfo*)malloc(sizeof(PersonInfo)*g_address_book.capacity);
    
        for (int i = 0; i <g_address_book.capacity ; ++i) {
            memset(g_address_book.person[i].name,0,MAX_DATA_SIZE);
            memset(g_address_book.person[i].phone,0,MAX_DATA_SIZE);
            memset(g_address_book.person[i].sex,0,MAX_DATA_SIZE);
            memset(g_address_book.person[i].age,0,MAX_DATA_SIZE);
            memset(g_address_book.person[i].address,0,MAX_DATA_SIZE);
        }
    }
    

    将原来的person上限1000去掉 , 新增一个容量capacity作为通讯录可容纳的容量 . 然后用malloc函数开辟动态内存空间存储联系人 . 再在后面的新增联系人部分当人数达到上限时的报错功能改为自动扩容即可.
    很关键的一点是在扩容时要先将原有的联系人保存下来扩容后再加载回去.

    void AddPersonInfo(){
        assert(&g_address_book != NULL);
        printf("*新增联系人*\n");
        if(g_address_book.size>=g_address_book.capacity){
            //扩容
            printf("扩容中...\n");
            g_address_book.capacity+=10;
    
            //先将结构体中的联系人保存到文件再进行释放
            printf("*保存联系人*\n");
            FILE* fp=fopen("d:/test.txt","w");
            for (int i = 0; i <g_address_book.size ; ++i) {
                fwrite(g_address_book.person,1, sizeof(PersonInfo),fp);
            }
            free(g_address_book.person);
            g_address_book.person=NULL;
            printf("保存联系人成功!\n");
    
            free(g_address_book.person);
            g_address_book.person=(PersonInfo*)malloc(sizeof(PersonInfo)*g_address_book.capacity);
            printf("扩容成功!\n");
    
            FILE* fp1=fopen("D:/test.txt","r");
            if(fp1==NULL){
                perror("读取联系人结果:\n");
                return;
            }
            PersonInfo tmp={0};
            int count=0;
            while(fread(&tmp,1, sizeof(PersonInfo),fp1)){
                ++count;
                printf("正在读取第%d条联系人信息...\n",count);
                g_address_book.capacity+=10;
                free(g_address_book.person);
                g_address_book.person=(PersonInfo*)malloc(sizeof(PersonInfo)*g_address_book.capacity);
    
                g_address_book.person[g_address_book.size]=tmp;
                ++g_address_book.size;
            }
            fclose(fp1);
            fp1=NULL;
            printf("读取联系人成功!\n");
    
        }
    

    然后保存联系人功能合并到退出当中,退出时保存联系人,直接关闭程序则无法保存联系人

    完整代码:

    #include <stdio.h>
    #include <string.h>
    #include <assert.h>
    #include <stdlib.h>
    
    //#define MAX_PERSON_INFO_SIZE 1000
    #define MAX_DATA_SIZE 1024
    
    typedef struct PersonInfo{
        char name[MAX_DATA_SIZE];
        char phone[MAX_DATA_SIZE];
        char sex[MAX_DATA_SIZE];
        char age[MAX_DATA_SIZE];
        char address[MAX_DATA_SIZE];
    }PersonInfo;
    
    typedef struct AddressBook{
        PersonInfo* person;
        int size;
        int capacity;
    }AddressBook;
    
    AddressBook g_address_book;//g表示全局变量
    
    
    void Init(){
        g_address_book.size=0;
        g_address_book.capacity=1;
        g_address_book.person=(PersonInfo*)malloc(sizeof(PersonInfo)*g_address_book.capacity);
    
        for (int i = 0; i <g_address_book.capacity ; ++i) {
            memset(g_address_book.person[i].name,0,MAX_DATA_SIZE);
            memset(g_address_book.person[i].phone,0,MAX_DATA_SIZE);
            memset(g_address_book.person[i].sex,0,MAX_DATA_SIZE);
            memset(g_address_book.person[i].age,0,MAX_DATA_SIZE);
            memset(g_address_book.person[i].address,0,MAX_DATA_SIZE);
        }
    }
    
    int Menu(){
        printf("==========================\n");
        printf("1.新增联系人\n");
        printf("2.删除联系人\n");
        printf("3.查找联系人\n");
        printf("4.更新联系人信息\n");
        printf("5.打印全部联系人\n");
        printf("6.排序联系人\n");
        printf("7.清空联系人\n");
        printf("0.保存联系人并退出\n");
        printf("==========================\n");
        printf("请输入您的选择:");
        int choice=0;
        scanf("%d",&choice);
        return choice;
    }
    
    void ReadPersonInfo(){
        FILE* fp=fopen("D:/test.txt","r");
        if(fp==NULL){
            perror("读取联系人结果:\n");
            return;
        }
        PersonInfo tmp={0};
        int count=0;
        while(fread(&tmp,1, sizeof(PersonInfo),fp)){
            ++count;
            printf("正在读取第%d条联系人信息...\n",count);
            g_address_book.capacity+=10;
            free(g_address_book.person);
            g_address_book.person=(PersonInfo*)malloc(sizeof(PersonInfo)*g_address_book.capacity);
    
            g_address_book.person[g_address_book.size]=tmp;
            ++g_address_book.size;
        }
        fclose(fp);
        fp=NULL;
        printf("读取联系人成功!\n");
    }
    
    void SavePersonInfo(){
        assert(&g_address_book != NULL);
        printf("*保存联系人*\n");
        FILE* fp=fopen("d:/test.txt","w");
        for (int i = 0; i <g_address_book.size ; ++i) {
            fwrite(g_address_book.person,1, sizeof(PersonInfo),fp);
        }
        free(g_address_book.person);
        g_address_book.person=NULL;
        printf("保存联系人成功!\n");
    }
    
    
    void Empty(){
        //这个函数用来凑数,令编号和用户输入一致.
    }
    
    void AddPersonInfo(){
        assert(&g_address_book != NULL);
        printf("*新增联系人*\n");
        if(g_address_book.size>=g_address_book.capacity){
            //扩容
            printf("扩容中...\n");
            g_address_book.capacity+=10;
    
            //先将结构体中的联系人保存到文件再进行释放
           SavePersonInfo();
    
            free(g_address_book.person);
            g_address_book.person=(PersonInfo*)malloc(sizeof(PersonInfo)*g_address_book.capacity);
            printf("扩容成功!\n");
    
            ReadPersonInfo();
    
        }
        PersonInfo* person_info=&g_address_book.person[g_address_book.size];
        printf("请输入联系人姓名:");
        //必须获取到一个指针,修改的内容是一个预期的内容(否则person_info只是一份拷贝,无法修改)
        scanf("%s",person_info->name);
        printf("请输入联系人电话:");
        scanf("%s",person_info->phone);
        printf("请输入联系人性别(male 男,female 女,unknow 未知):");
        scanf("%s",person_info->sex);
        printf("请输入联系人年龄:");
        scanf("%s",person_info->age);
        printf("请输入联系人地址:");
        scanf("%s",person_info->address);
        ++g_address_book.size;
    
        printf("新增联系人成功!\n");
    }
    
    void DelPersonInfo(){//交换要删除的联系人和最后一个联系人,然后执行删除最后一个联系人的操作
        assert(&g_address_book != NULL);
        printf("*删除联系人*\n");
        if(g_address_book.size<=0){
            printf("删除失败,通讯录为空!\n");
            return;
        }
        printf("请输入要删除的序号:");
        int id =0;
        scanf("%d",&id);
        if(id<0||id>=g_address_book.size){
            printf("删除失败!序号有误!\n");
            return;
        }
        g_address_book.person[id]=g_address_book.person[g_address_book.size - 1];//结构体之间赋值
        --g_address_book.size;
        printf("删除联系人成功!\n");
    }
    
    void FindPersonInfo(){
        assert(&g_address_book != NULL);
        printf("*查找联系人*\n");
        if(g_address_book.size<=0){
            printf("通讯录为空,无法查找联系人!\n");
            return;
        }
        printf("请输入要查找的姓名:");
        char name[MAX_DATA_SIZE]={0};
        scanf("%s",name);
        for (int i = 0; i <g_address_book.size ; ++i) {
            PersonInfo* info= &g_address_book.person[i];
            if(strcmp(info->name,name)==0){
                printf("[%d] %s\t%s\n",i,info->name,info->phone);
            }else{
                printf("联系人列表查无此人!\n");
                return;
            }
        }
        printf("查找联系人成功!\n");
    }
    
    void UpdatePersonInfo(){
        assert(&g_address_book != NULL);
        printf("*更新联系人信息*\n");
        if(g_address_book.size<=0){
            printf("通讯录为空,无法更新联系人!\n");
            return;
        }
        printf("请输入要更新的联系人序号:");
        int id=0;
        scanf("%d",&id);
        if(id<0||id>=g_address_book.size){
            printf("序号有误,修改失败!\n");
            return;
        }
        PersonInfo* info=&g_address_book.person[id];
        printf("旧的姓名为:(%s),请输入新的姓名(若不修改请输入*):\n",info->name);
        char name[MAX_DATA_SIZE]={0};
        scanf("%s",name);
        if(strcmp(name,"*")!=0){
            strcpy(info->name,name);
        }
        char phone[MAX_DATA_SIZE]={0};
        printf("旧的号码为:(%s),请输入新的电话(若不修改请输入*):\n",info->phone);
        scanf("%s",phone);
        if(strcmp(phone,"*")!=0){
            strcpy(info->phone,phone);
        }
        printf("旧的性别为:(%s),请输入新的性别(若不修改请输入*):\n",info->sex);
        char sex[MAX_DATA_SIZE]={0};
        scanf("%s",sex);
        if(strcmp(sex,"*")!=0){
            strcpy(info->sex,sex);
        }
        printf("旧的年龄为:(%s),请输入新的年龄(若不修改请输入*):\n",info->age);
        char age[MAX_DATA_SIZE]={0};
        scanf("%s",age);
        if(strcmp(age,"*")!=0){
            strcpy(info->age,age);
        }
        printf("旧的地址为:(%s),请输入新的地址(若不修改请输入*):\n",info->address);
        char address[MAX_DATA_SIZE]={0};
        scanf("%s",address);
        if(strcmp(address,"*")!=0){
            strcpy(info->address,address);
        }
        printf("成功更新联系人信息!\n");
    }
    
    void PrintAllPersonInfo(){
        assert(&g_address_book != NULL);
        printf("*打印全部联系人*\n");
        for (int i = 0; i <g_address_book.size ; ++i) {
            PersonInfo* info =&g_address_book.person[i];//结构体变量触发拷贝,要定义一个指针
            printf("[%d]姓名:%s 电话:%s 性别:%s 年龄:%s 地址:%s\n",
                   i,info->name,info->phone,info->sex,info->age,info->address);
        }
        printf("共打印了%d条数据!\n",g_address_book.size);
        printf("打印全部联系人成功!\n");
    }
    
    void SortPersonInfo(){//strcmp 姓名字典序
        assert(&g_address_book != NULL);
        if(g_address_book.size<=0){
            printf("通讯录为空,无法排序联系人!\n");
            return;
        }
        for (int bound = 0; bound < g_address_book.size ; ++bound) {
            for (int cur = (g_address_book.size)-1; cur >bound ; --cur) {
                PersonInfo* latter=&g_address_book.person[cur];
                PersonInfo* former=&g_address_book.person[cur - 1];
                if(strcmp(latter->name, former->name) < 0){
                    ++g_address_book.size;
                    g_address_book.person[g_address_book.size-1]=g_address_book.person[cur];
                    g_address_book.person[cur]=g_address_book.person[cur-1];
                    g_address_book.person[cur-1]=g_address_book.person[g_address_book.size-1];
                    --g_address_book.size;
                }
            }
        }
        printf("联系人排序成功!\n");
    }
    
    void ClearPersonInfo(){
        assert(&g_address_book != NULL);
        printf("*清空联系人*\n");
        if(g_address_book.size<=0){
            printf("通讯录已为空!\n");
            return;
        }
        printf("!-------警告-------!\n");
        printf("您真的要清空所有数据吗???\n");
        printf("是的!(Y) 不是!(N)\n");
        printf("!-------警告-------!\n");
        char choice[1024]={0};
        scanf("%s",choice);
        if(strcmp(choice,"Y")==0){
            g_address_book.size=0;
            printf("成功清除全部联系人数据!\n");
        }else{
            printf("清空操作取消\n");
        }
    }
    
    
    typedef  void(*Func)();
    
    int main(){
        Func arr[]={
                Empty,
                AddPersonInfo,
                DelPersonInfo,
                FindPersonInfo,
                UpdatePersonInfo,
                PrintAllPersonInfo,
                SortPersonInfo,
                ClearPersonInfo,
        };
    
        Init();
        printf("读取联系人\n");
        ReadPersonInfo();
    
        while (1){
            int choice =Menu();
            if(choice<0||choice>= sizeof(arr)/ sizeof(arr[0])){
                printf("您的输入有误!\n");
                continue;
            }
            if(choice==0){
                if(g_address_book.size<=0){
                    SavePersonInfo();
                    printf("通讯录已为空无需保存!\n");
                    printf("goodbye!\n");
                    break;
                }else{
                    SavePersonInfo();
                    printf("goodbye!\n");
                    break;
                }
            }
            arr[choice]();//借助转移表调用各个函数,转移表:函数指针数组
        }
        return 0;
    }
    
    
    展开全文
  • 还没写完,目前只写了显示菜单(及主框框)、添加联系人、显示联系人、推出通讯录的功能。可为什么我在调试的时候发现,无论添加联系人时输入的是1还是2,显示出来的性别都是“女”,而且住址添加不进去。...
  • 还没写完,目前只写了显示菜单(及主框框)、添加联系人、显示联系人、推出通讯录的功能。可为什么我在调试的时候发现,无论添加联系人时输入的是1还是2,显示出来的性别都是“女”,而且住址添加不进去。...
  • 一个综合示例:通讯录管理系统

    千次阅读 2017-11-28 21:38:18
    本示例充分利用前期所学一些C语言编程知识,主要...程序运行显示一个主菜单:  1、添加联系人  2、删除联系人  3、显示所有联系人  4、保存联系人条目文件  5、从文件读取联系人条目  6、
  • //将JPanel面板jp添加到顶级容器c中 setSize(600,150); setTitle("*通 讯 录 管 理 系 统*"); setVisible(true); setResizable(false);//窗体大小由程序员决定,用户不能自由改变大小 ...
  • 本程序的功能是为用户提供简单的通讯录进行管理,通过该程序存储联系人信息,提供关键字(只能是英文关键字进行查找)查找功能,可以对数据进行修改、删除添加等操作。 各按钮的功能如下: 查找记录:以姓名为...
  • C语言实现简单的电子通讯录

    千次阅读 2017-07-27 00:04:37
    如果搜索显示处该好友信息 D)用户输入DELETE命令,让用户输入将要删除好友姓名删除,如果存在同 名的多个好友,则列表出,所有同名的好友信息,让用户通过输入ID号删除 提示用户删除成功。
  • 子菜单的添加是直接将一个子菜单添加到母菜单中,而分隔符的添加只需要将分隔符作为菜单项添加到菜单中。 */ JMenuBar bar=new JMenuBar(); JMenu edit=new JMenu("编辑"); JMenuItem edit1=new JMenuItem(...
  • 该资源由eclipse开发 附带SQL数据库 PPT 素材等 其中最主要技术运用servlet 和MVC模式 方便...2.登录显示出与当前用户相关的联系人名单 3.添加新联系人 4.删除联系人 5.根据联系人类型查找联系人信息。。
  • 当在输入了一个新的部门时,会自动添加到部门列表中。  例如:可把部门/分组名称输入为 "高中同学录" 或 "大学同学录",这样可根据部门/分组名称 进行快速切换。 六。所有通讯录的数据都保存在 AddressBook....
  • 出现的问题:在测试时中,添加联系人,选择显示联系人,年龄为乱码,其余各项信息均未显示。 出现以下三个警告,并未报错 警告 C26495 未初始化变量 people::p_age。始终初始化成员变量(type.6)。 ...
  • 从正文文件中批量添加数据库表中) (7)Write to a Text File(将库表中数据写入正文文件) (8)Sort(排序) (9)Set Password (设置密码) 用户选择该选项是可以设置一个密码,改密码保存在addrilist....
  • C语言编写的通讯录管理程序设计 #include"stdio.h" #include"stdlib.h" #include"string.h" #include"conio.h" #define HEADER1"------------------------------------------MESSAGE MENU--------------------------...
  • printf(" 4、删除信息 #\n"); printf(" # 5、修改信息 "); printf(" 6、打开通讯录 #\n"); printf(" # 7、添加信息 "); printf(" 8、 保存 #\n"); printf(" # 9、清屏 "); printf(" 0、退出 #...
  • 4.9 动态添加/删除的Spinner菜单 4.10 心爱小宝贝相片集 4.11 快速地搜索手机文件引擎 4.12 按钮也能随单击变换 4.13 具自动提示功能的菜单 4.14 数字及模拟小时钟设计 4.15 动态输入日期与时间 4.16 猜猜红桃A在...
  • 且对删空子节点的父节点左右两边处理逻辑有差异:当授权时既然要在右边出现,必然需要左侧父节点,而删除授权时,移除子权限并不代表想移除父权限 32 renderAfterExpand 是否在第一次展开某个树节点才渲染其子...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 152
精华内容 60
关键字:

删除后显示添加到通讯录