用c語言實現一個簡單的通訊錄
阿新 • • 發佈:2018-11-23
通訊錄的c語言實現原始碼
簡單通訊錄的實現還是包括三個原始檔,test.c(實現通訊錄主邏輯),txl.c(實現用到的各個函式),txl.h(存放txl中用到的各種標頭檔案與宣告)。
txl.h
#ifndef __TXL_H__//**txl.h** #define __TXL_H__ #include<stdio.h> #include<string.h> #include<assert.h> #include<stdlib.h> #include<errno.h> enum option { EXIT, ADD, DEL, SEARCH, MODIFY, SHOW, EMPTY, SORT }; #define MAX 1000 #define MAX_NAME 15 #define MAX_SEX 5 #define MAX_NUM 12 #define MAX_DAARESS 30 #define MAX_CAP 2 typedef struct addr { char name[MAX_NAME]; char sex[MAX_SEX]; short int age; char num[MAX_NUM]; char address[MAX_DAARESS]; }addr; typedef struct contact { addr* data; int sz; int capacity; }contact; void Initcontact(contact* pcon); void addcontact(contact* pcon); void showcontact(const contact* pcon); void delcontact(contact* pcon); void emptycontct(contact* con); void searchcontact(const contact* pcon); void xuicontact(contact* pcon); void sortcontact(contact* pcon); void checkcapacity(contact* pcon); void destorycontact(contact* pcon); void savecontact(contact* pcon); void loadcontact(contact* pcon); #endif
text.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"txl.h" void menu() { printf("***************************\n"); printf("**** 1.add 2.del ****\n"); printf("**** 3.search 4.modify ****\n"); printf("**** 5.show 6.empty ****\n"); printf("**** 7.sort 0.exit ****\n"); printf("***************************\n"); } int main() { int len = 0; int input = 0; contact con; Initcontact(&con); do { menu(); printf("請輸入你要完成的操作\n"); scanf("%d",&input); switch(input) { case ADD: addcontact(&con); break; case DEL: delcontact(&con); break; case SEARCH: searchcontact(&con); break; case MODIFY: xuicontact(&con); break; case SHOW: showcontact(&con); break; case EMPTY: emptycontct(&con); break; case SORT: sortcontact(&con); break; case EXIT: savecontact(&con); printf("儲存成功\n"); destorycontact(&con); printf("程式退出\n"); break; default: printf("輸入有誤\n"); break; } }while(input); return 0; }
txl.h
#define _CRT_SECURE_NO_WARNINGS 1 #include"txl.h" void loadcontact(contact* pcon) { addr tmp = {0}; FILE* pf = fopen("contact.text","rb"); assert(pcon != NULL); if(pf == NULL) { perror("程式出錯\n"); return ; } while(fread(&tmp , sizeof(addr),1,pf)) { checkcapacity(pcon); pcon -> data[pcon -> sz] = tmp; pcon -> sz++; } } void Initcontact(contact* pcon) { assert(pcon != NULL); pcon -> sz = 0; pcon ->capacity = MAX_CAP; pcon ->data = (addr*)malloc(pcon ->capacity*sizeof(addr)); memset(pcon->data, 0, pcon ->capacity*sizeof(addr)); loadcontact(pcon); } void addcontact(contact* pcon) { if(pcon -> sz == pcon ->capacity) { checkcapacity(pcon); } assert(pcon != NULL); printf("請輸入名字\n"); scanf("%s",pcon -> data[pcon -> sz].name); printf("請輸入性別\n"); scanf("%s",pcon -> data[pcon -> sz].sex); printf("請輸入年齡\n"); scanf("%d",&(pcon -> data[pcon -> sz].age)); printf("請輸入電話\n"); scanf("%s",pcon -> data[pcon -> sz].num); printf("請輸入住址\n"); scanf("%s",pcon -> data[pcon -> sz].address); pcon -> sz++; printf("新增成功\n"); } void savecontact(contact* pcon) { int i = 0; FILE* pf = fopen("contact.text","wb"); if(pf == NULL) { perror("程式出錯\n"); return ; } for(i = 0; i < pcon -> sz; i++) { fwrite(pcon ->data+i,sizeof(addr),1,pf); } } void destorycontact(contact* pcon) { assert(pcon != NULL); free(pcon -> data); pcon -> data = NULL; pcon -> capacity = 0; pcon -> sz = 0; } void checkcapacity(contact* pcon) { if(pcon -> sz == pcon ->capacity) { addr* ptr = realloc(pcon ->data, (pcon ->capacity+2)*sizeof(addr)); if(ptr != NULL) { pcon -> data = ptr; pcon -> capacity += 2; } printf("擴容成功\n"); } } void showcontact(const contact* pcon) { int i = 0; assert(pcon != NULL); printf("%-15s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "性別", "年齡", "電話", "地址"); for(i=0; i<pcon->sz; i++) { printf("%-15s\t%-5s\t%-5d\t%-12s\t%-20s\n", pcon->data[i].name, pcon->data[i].sex, pcon->data[i].age, pcon->data[i].num, pcon->data[i].address); } } //void showcontact(contact* pcon) //{ // int i = 0; // assert(pcon != NULL); // printf("%-15s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "性別", "年齡", "電話", "地址"); // for(i = 0; i < pcon -> sz; i++) // { // printf("%-15s\t%-5s\t%-5d\t%-12s\t%-20s\n", // pcon -> data[i].name, // pcon -> data[i].sex, // pcon -> data[i].age, // pcon -> data[i].num, // pcon -> data[i].address); // } //} static int findname(const contact* pcon ,char name[]) { int i = 0; assert(pcon != NULL); for(i = 0; i < pcon -> sz; i++) { if(strcmp(pcon -> data[i].name, name) == 0) { return i; } } return -1; } void delcontact(contact* pcon) { int pos = 0; char name[MAX_NAME]={0}; int i = 0; assert(pcon != NULL); if(pcon -> sz == 0) { printf("通訊錄為空,無法刪除\n"); } else { printf("請輸入要刪除人的姓名\n"); scanf("%s", name); pos = findname(pcon , name); if(pos == -1) { printf("要刪除的人不存在\n"); } else { for(i = pos; i < pcon -> sz-1;i++) { pcon -> data[i] = pcon -> data[i+1]; } pcon -> sz--; printf("刪除成功\n"); } } } void emptycontct(contact* pcon) { int input = 0; printf("危險操作,清空輸入1,不清空輸入0\n"); scanf("%d",&input); if(input == 1) { pcon -> sz = 0; pcon ->capacity = MAX_CAP; pcon ->data = (addr*)malloc(pcon ->capacity*sizeof(addr)); memset(pcon->data, 0, pcon ->capacity*sizeof(addr)); printf("清空成功\n"); } else { ; } } void searchcontact(const contact* pcon) { int pos = 0; char name[MAX_NAME] = {0}; assert(pcon != NULL); printf("請輸入你要查詢人的名字\n"); scanf("%s",name); pos = findname(pcon ,name); if(-1 == pos) { printf("你所要查詢的人不存在\n"); } else { printf("%-15s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "性別", "年齡", "電話", "地址"); printf("%-15s\t%-5s\t%-5d\t%-12s\t%-20s\n", pcon->data[pos].name, pcon->data[pos].sex, pcon->data[pos].age, pcon->data[pos].num, pcon->data[pos].address); } } void xuicontact(contact* pcon) { int pos = 0; char name[MAX_NAME] = {0}; assert(pcon != NULL); printf("請輸入你要修改的人的名字\n"); scanf("%s",name); pos = findname(pcon ,name); if(-1 == pos) { printf("你所要修改的人不存在\n"); } else { printf("請輸入名字\n"); scanf("%s",pcon -> data[pcon -> sz+pos-1].name); printf("請輸入性別\n"); scanf("%s",pcon -> data[pcon -> sz+pos-1].sex); printf("請輸入年齡\n"); scanf("%d",&(pcon -> data[pcon -> sz+pos-1].age)); printf("請輸入電話\n"); scanf("%s",pcon -> data[pcon -> sz+pos-1].num); printf("請輸入住址\n"); scanf("%s",pcon -> data[pcon -> sz+pos-1].address); } } int cmp_age(const void* e1,const void* e2) { return ((struct addr*)e1)->age - ((struct addr*)e2)->age; } void sortcontact(contact* pcon)//快速排序 { assert(pcon != NULL); qsort(pcon->data,pcon->sz,sizeof(addr),cmp_age); printf("排序成功\n"); } //void sortcontact(contact* pcon) //以名字排序聯絡人(氣泡排序) //{ // int flag=0; // int i=0; // int j=0; // for(i=0;i<pcon->sz-1;i++) // { // flag=0; // for(j=0;j<pcon->sz-1-i;j++) // { // if(strcmp(pcon->data[j].name,pcon->data[j+1].name) > 0) // { // addr tmp=pcon->data[j]; // pcon->data[j]=pcon->data[j+1]; // pcon->data[j+1]=tmp; // flag=1; // } // } // if(flag == 0) // // break; // // } //}