简单通讯录(结构体指针数组)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlite3.h>
#define MAX_LEN 1000//宏定义
#define NAME_LEN 20
#define NODE     "\e[0m"
#define BLACK    "\e[0;30m"
#define L_BLACK  "\e[1;30m"
#define RED      "\e[0;31m"
#define L_RED    "\e[1;31m"
enum HUANSHU  //枚举类型,避免case语句中出现幻数,从第一个值依次累加
{
	QUIT=0,
	ADD,
    DISPLAY,//逗号
	SEARCH,
    DELETE,
	MODIFY,
};
struct student 
{
    char name[NAME_LEN];
	int age;
    char sex;
};
typedef struct student STU;
int person = 0;

int get_result(void *para, int column_count, char *column_value[], char *column_name[])
{
    /*int num = *((int*)para);
	printf("num = %d",num);*/
    int i;
    for(i = 0; i < column_count; i ++)
	{
	    printf("%s|",column_name[i]);
	}
	printf("\n");

	for(i = 0; i < column_count; i ++)
    {
	    printf("%s   |",column_value[i]);
	}
	printf("\n");
	return 0;
}


void menu()//菜单
{
    printf("---------------------------------------------------\n");
    printf("-------------------\033[0;34m通讯录\033[0m------------------------\n");
	printf("\n************\033[1;34m1、添加联系人信息\033[0m****************\n\n"); 
	printf("\n\n************\033[1;34m2、查看所有联系人\033[0m****************\n\n");
	printf("\n\n************\033[1;34m3、搜索联系人信息\033[0m****************\n\n");
	printf("\n\n************\033[1;34m4、删除联系人信息\033[0m****************\n\n");
	printf("\n\n************\033[1;34m5、修改联系人信息\033[0m****************\n\n");
    printf("\n\n------------\033[1;34m0、退出\033[0m----------------------------\n");
    printf("-----------------------------------------------\n");
}

void modify(STU *str[])//修改信息
{
    int i;
    char arry[NAME_LEN];
    printf("请输入要修改的联系人的名字:\n");
    scanf("%s",arry);
    for(i=0;i<person;i++)
    {
	    if(strcmp(str[i]->name,arry)==0)
		{
	        printf("联系人信息: name       age     sex\n");
	        printf("             -------------------------\n");
	        printf("              %s         %d       %c\n",str[i]->name,str[i]->age,str[i]->sex);
	        printf("             -------------------------\n");
		    printf("请输入更改后此人的信息:\n");
            printf("age:");//不加'\n',scanf接在后面输入,没有换行
			scanf("%d",&(str[i]->age));
			printf("sex:");
			getchar();
			scanf("%c",&(str[i]->sex));
			printf("\033[0;32m修改成功!\033[0m\n");
			return;
		}
	}
	printf("\033[0;31m修改失败!不存在该联系人\033[5m");//   \033[0;31m红色
	printf("\033[0m\n");//关闭颜色
	return;
}
//添加联系人
void add(STU *str[])//指针数组
{
	int num;
	char ch;
    printf("please input information:\n");
	while(1)
	{
	    str[person] = (STU *)malloc(sizeof(STU));
		printf("姓名:");
		scanf("%s",str[person]->name);
		printf("年龄:");
		scanf("%d",&(str[person]->age));
		getchar();
		printf("性别:");
		scanf("%c",&(str[person]->sex));
		if(str[person]->sex != 'm'&& str[person]->sex != 'f')
		{
		    free(str[person]);
		    printf("\033[0;31m[输入信息有误,请重新输入!]\033[0m\n");
		    continue;
        }
		
		sqlite3 *db;
		char *errmsg;
		//打开数据库
		if(sqlite3_open("test.db",&db) != SQLITE_OK)
		{
		    printf("open db error!\n");
		    exit(1);
		}
		//数据库,创建表和插入数据
		char sql[100] = "create table student(name text primary key,age integer,sex text)";
        sqlite3_exec(db,sql,NULL,NULL,&errmsg);//执行sql语句
		memset(sql,0,sizeof(sql));

        sprintf(sql,"insert into student(name,age,sex) values('%s',%d,'%c')",str[person]->name,str[person]->age,str[person]->sex);
        sqlite3_exec(db,sql,NULL,NULL,&errmsg);//执行语句
		memset(sql,0,sizeof(sql));
        sqlite3_close(db);//关闭数据库

		person ++;
		getchar();
		printf("\033[0;34m提示:[q键+回车 退出][回车 继续输入]\033[0m\n");
		if((ch = getchar()) == 'q')//用if语句判断,跳出外层while循环,退回主函数
		    break;
	}
}
void display(STU *str[])//查看所有信息
{
    /*int i;
	int j;
	STU *p;//中间变量
	for(i = 0;i < person - 1;i++)// 冒泡排序
	{
	    for(j = 0; j < person - i - 1; j++)
        {
	       if(strcmp(str[j]->name,str[j + 1]->name) > 0)//按名字排序
		   {
		        p = str[j + 1];
				str[j + 1] = str[j];
				str[j] = p;
		   }   
		}
	}
	printf("联系人信息如下:\n");
    printf("\n name     age     sex\n");
	printf("-------------------------\n");
	for(i = 0; i < person; i++)
	{
		printf(" %s        %d       %c\n",str[i]->name,str[i]->age,str[i]->sex);
        printf("-------------------------\n");
	}
	printf("\033[0;34m[以上排名不分先后,按姓氏拼音排序]\033[0m\n");*/
    
	sqlite3 *db;
	char *errmsg;
    if(sqlite3_open("test.db",&db) != SQLITE_OK)
	{
	    printf("open db error!\n");
	    exit(1);
	}
	sqlite3_exec(db,"select * from student",get_result,NULL,&errmsg);
    sqlite3_close(db);
}

void search(STU *str[])//形参也可以写作STU **str,搜索联系人
{
    int i;
	char name[NAME_LEN];
    printf("please input the name of people you want to search:\n");
    scanf("%s",name);
    for(i = 0; i < person; i++)
	{
	    if(strcmp(str[i]->name,name) == 0)
	    {
		    printf("\033[0;32m搜索成功:\033[0m\n");
			
	        printf("联系人信息: name       age     sex\n");
	        printf("             -------------------------\n");
	        printf("              %s         %d       %c\n",str[i]->name,str[i]->age,str[i]->sex);
	        printf("             -------------------------\n");
			return;
		}
	}
	printf("\033[0;31m搜索失败,不存在该联系人!\033[0m\n");
}

void delete(STU *str[])//删除联系人
{
    int i;
	int j;
    char name[NAME_LEN];
    printf("please input the name of people you want to delete:\n");
    scanf("%s",name);
    
    for(i = 0; i < person; i++)
	{
	    
	    if(strcmp(str[i]->name,name) == 0)//依次往前移
	    {
	        printf("联系人信息: name       age     sex\n");
	        printf("             -------------------------\n");
	        printf("              %s         %d       %c\n",str[i]->name,str[i]->age,str[i]->sex);
	        printf("             -------------------------\n");
		    free(str[i]);
	        for(j = i; j < person - 1; j ++)
			{
			    str[j] = str[j + 1];
			}
			str[person - 1] = NULL;
			person --;
			printf("\033[0;32m删除成功!\033[0m\n");
			return;
		}
	}
	printf("\033[0;31m删除失败!\033[0m\n");
}
int main()
{
    STU *stu[MAX_LEN] = {0};//结构体指针数组
	int choice;
	while(1)
	{
	    menu();
	    printf("\n请输入0到5进行选择:\n");
		scanf("%d",&choice);
        printf("choice  = %d\n",choice);		
		switch(choice)
		{
		    case ADD:
			{
			    system("clear");
			    add(stu);
			    break;
			}
		    case DISPLAY: 
			{
			    system("clear");
			    display(stu);
				printf("按任意键继续...\n");
				getchar();
				getchar();
			    break;
			}
		    case SEARCH: 
			{   
			    system("clear");
			    search(stu);
				printf("按任意键继续...\n");
				getchar();
				getchar();
			    break;
			}
		    case DELETE:
			{
			    system("clear");
			    delete(stu);
				printf("按任意键继续...\n");
				getchar();
				getchar();
			    break;
		    }
			case MODIFY:
			{
			    system("clear");
			    modify(stu);
                printf("按任意键继续...\n");
				getchar();
				getchar();
			    break;
			}
			case QUIT:
			{
			    exit(1);
			    break;
			}
		}
	}
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41030848/article/details/81348182
今日推荐