首页IT科技c语言编写通讯录程序的框架(C 语言实现一个简单通讯录)

c语言编写通讯录程序的框架(C 语言实现一个简单通讯录)

时间2025-05-22 17:37:38分类IT科技浏览3209
导读:前言 回顾下C语言基础知识,通过实现一个简单小...

前言

回顾下C语言基础知识,通过实现一个简单小项目

达到复习指针、动态内存、文件操作

等基本知识

内容

文件结构

main.c concat.h concat.c

入口文件main.c

#include "concat.c" void initMemu() { printf("*****************************************\n\n"); printf("\t0 : exit \n"); printf("\t1 : add \n"); printf("\t2 : delete \n"); printf("\t3 : update \n"); printf("\t4 : search \n"); printf("\t5 : show \n"); printf("\t6 : sort \n"); printf("\t7 : save \n"); printf("\n*****************************************\n"); printf("input a number for select your operation: "); } int main() { Data data; // 初始化菜单 init(&data); int num; do{ initMemu(); scanf("%d",&num); switch(num){ case EXIT: saveConcat(&data); destory(&data); break; case ADD: addConcat(&data); break; case DELETE: deleteConcat(&data); break; case UPDATE: updateConcat(&data); break; case SEARCH: searchConcat(&data); break; case SHOW: showConcat(&data); break; case SORT: break; case SAVE: saveConcat(&data); break; default: printf("place input sure menu number !\n"); break; } } while(num); printf("exit success! %s\n",__TIME__); return 0; }

头文件 Concat.h

#include <stdio.h> #include <string.h> #include <stdlib.h> #define CONCAT_MAX 3 #define OPCITY 3 #define DEFAULT_OPCITY 3 #define NAME_MAX 20 #define ADDRESS_MAX 30 #define SEX_MAX 4 #define TEL_MAX 20 typedef struct Concat { char name[NAME_MAX]; char sex[SEX_MAX]; char tel[TEL_MAX]; char address[ADDRESS_MAX]; } Concat; typedef struct Data { int size; int opcity; struct Concat *con; } Data; enum Operation { EXIT = 0, ADD = 1, DELETE = 2, UPDATE = 3, SEARCH = 4, SHOW = 5, SORT = 6, SAVE = 7 };

主要源文件concat.c

#include "concat.h" void init(Data* data); // 声明函数 // 添加 void addConcat(Data *data); // 查看 void showConcat(const Data *data); // 删除 void deleteConcat( Data *data); // 修改 void updateConcat( Data *data); // 查找 void searchConcat(const Data *data); // 排序 void sortConcat(const Data *data); // 根据名称查找 int findConcatByName(const Data *data); // 打印头 void printHeader(); // 打印用户 void printBody(const Data *data,int index); // 打印结果 void printResult(const Data *data,int index); // 动态规划 void check( Data *data); // 内存销毁 void destory( Data *data); // 保存文件 void saveConcat( Data *data); // 从文件中读取内容 void readConcat( Data *data); void init(Data* data) { data->size = 0; data->opcity = OPCITY; // 开辟空间 Concat* pt = (Concat*)malloc(sizeof(Concat)*OPCITY); if( pt == NULL ) { return; } data->con = pt; // 读取文件内容 readConcat(data); } void check( Data *data) { // 容量是否 if( data->size == data->opcity ) { // 每次开辟3个容量空间 data->opcity += DEFAULT_OPCITY; // 使用 realloc 在原来基础上开辟空间 Concat *pt = realloc(data->con,data->opcity*sizeof(Concat)); if( pt != NULL) { data->con = pt; } } } void readConcat( Data *data) { // 读取文件 FILE *fp = NULL; fp = fopen("db.txt","rb"); if( fp == NULL ){ //create file fp = fopen("db.txt", "w"); printf("file is not exist! create file db.txt!\n"); } while(fread(&(data->con[data->size]),sizeof(Concat),1,fp)) { data->size++; // 检查容量 check(data); } // 文件关闭 fclose(fp); fp = NULL; } void saveConcat( Data *data) { FILE *fp = NULL; fp = fopen("db.txt","wb"); if( fp == NULL ){ printf("db.txt is not exist!\n"); return; } // 写入文件 for(int i = 0; i<data->size;i++){ fwrite(&(data->con[i]),sizeof(Concat),1,fp); } // 文件关闭 fclose(fp); fp = NULL; printf("save success!\n"); } void destory( Data *data) { if ( data->con != NULL ) { free(data->con); data->con = NULL; } } void addConcat(Data *data) { check(data); printf("name:>"); scanf("%s", (data->con+data->size)->name); printf("sex:>"); scanf("%s", (data->con+data->size)->sex); printf("address:>"); scanf("%s", (data->con+data->size)->address); printf("phone:>"); scanf("%s", (data->con+data->size)->tel); printf("\n add %s success ! \n",(data->con+data->size)->name); data->size++; } void showConcat(const Data *data) { if (data->size == 0) { printf("NO any data! \n"); } else { printHeader(); for (int i = 0; i < data->size; ++i) { printBody(data,i); } } } void deleteConcat(Data *data) { int result = findConcatByName(data); if (result != -1) { printResult(data,result); // 删除方法,将当前索引值不变,后面数组对应的索引值向前移动一位,最后结束的时候 size--; for(int i = result;i<data->size;i++) { data->con[i] = data->con[i+1]; } data->size--; printf("\n delete success\n"); } } void updateConcat( Data *data) { int result = findConcatByName(data); if (result != -1) { char name[NAME_MAX]; char sex[SEX_MAX]; char tel[TEL_MAX]; char address[ADDRESS_MAX]; const char NO = 0; printResult(data,result); printf("\n*********update ( input -1 not update!)******\n"); printf("name :>"); scanf("%s", name); printf("sex:>"); scanf("%s", sex); printf("address:>"); scanf("%s", address); printf("tel:>"); scanf("%s", tel); if( name[0] != NO) { strcpy((data->con+result)->name,name); } if( sex[0] != NO) { strcpy((data->con+result)->sex,sex); } if( tel[0] != NO) { strcpy((data->con+result)->tel,tel); } if( address[0] != NO) { strcpy((data->con+result)->address,address); } printf("\n %s info update success!\n",name); } } void searchConcat(const Data *data) { int result = findConcatByName(data); if (result != -1) { printResult(data,result); } } int findConcatByName(const Data *data) { char name[NAME_MAX]; printf("input name>:"); scanf("%s", name); for (int i = 0; i < data->size; ++i) { if ((strcmp(name, (data->con+i)->name) == 0)) { return i; } } printf("\n %s is not exist\n",name); return -1; } void printHeader() { printf("%-10s %-10s %-20s %-20s \n", "name", "sex", "tel", "address"); } void printBody(const Data* data,int index) { printf("%-10s %-10s %-20s %-20s \n", (data->con+index)->name, (data->con+index)->sex, (data->con+index)->tel, (data->con+index)->address ); } void printResult(const Data* data,int index) { printHeader(); printBody(data,index); }

结语

排序功能没有实现,不过可以自己尝试实现下。

编译与执行

windows

gcc main.c

Linux:

gcc main.c -std=c99

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
网站站内优化方案(网站优化内容)