相信大家都见识过通讯录,通讯录里面一般有的内容为姓名,联系方式,年龄等信息。通讯录的主要功能有:增加、删除、查找、排序、修改、展示等操作。
那么具体应该用C语言怎么实现这个呢?接下来我们大家一起来看一下,一起用前一段时间所学习的C语言相关知识来看看
主函数
列个枚举变量,简单的swich语句实现选择要使用的功能,代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "contact.h"
#include <stdlib.h>
enum OPTION
{
EXCIT,
ADD,
DEL,
SEA,
MOD,
SHOW,
SORT,
LOAD,
SAVE
};
void menu(){
printf("====================0:excit 1:add 2: del================\n");
printf("====================3:search 4:modify 5: show============\n");
printf("====================6:sort 7:load 8:save==============\n");
void testContact(){
contact ct;
int option;
InitContact(&ct);
do
{
menu();
scanf("%d", &option);
switch (option)
{
case EXCIT:
break;
case ADD:
AddContact(&ct);
break;
case DEL:
DelContact(&ct);
break;
case SEA:
SearchContact(&ct);
break;
case MOD:
ModifyContact(&ct);
break;
case SHOW:
ShowContact(&ct);
break;
case SORT:
SortContact(&ct);
break;
case LOAD:
LoadContact(&ct);
break;
case SAVE:
SaveContact(&ct);
break;
default:
printf("您的输入有误\n");
break;
}
} while (option);
}
}
int main(){
testContact();
system("pause");
return 0;
}
contact的头文件
配置几个接口,简单实现增删查改的内容以及读写文件的功能
#pragma once
#define NAME_MAX 100
#define GENDER_MAX 10
#define TELE_MAX 12
#define ADDR_MAX 100
#define MAX 200
#define DEFAULT 1
typedef struct info{
char name [NAME_MAX] ;
char gender [GENDER_MAX];
int age;
char tele [TELE_MAX];
char addr [ADDR_MAX];
}info;
//typedef struct contact{
// info data[MAX];
// int size;
//}contact,*pContact;
typedef struct contact{
info* data;
int size;
int capacity;//当前空间的大小
}contact, *pContact;
void InitContact(pContact pc);
int CheckCapacity(pContact pc);
void AddContact(pContact pc);
void DelContact(pContact pc);
void SearchContact(pContact pc);
int FindContact(pContact pc, char* name);
void ModifyContact(pContact pc);
void SortContact(pContact pc);
void ShowContact(pContact pc);
void LoadContact(pContact pc);
void SaveContact(pContact pc);
contact具体函数功能的实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include "contact.h"
#include <malloc.h>
void InitContact(pContact pc){
pc->size = 0;
pc->data = (info*)malloc(sizeof(info)*DEFAULT);
pc->capacity = DEFAULT;
}
int CheckCapacity(pContact pc){
if (pc->size == pc->capacity){
//pc->data = (info*)realloc(pc->data, sizeof(info)*(pc->capacity + 10));
info* tmp = (info*)malloc(sizeof(info)*(pc->capacity + 10));
if (tmp == NULL){
return 0;
}
memcpy(tmp, pc->data, sizeof(info)*pc->size);
free(pc->data);
pc->data = tmp;
pc->capacity += 10;
}
return 1;
}
void AddContact(pContact pc){
info curInfo;
if (CheckCapacity(pc)==0){
printf("通讯录已满,添加失败!\n");
return;
}
printf("请输入姓名:\n");
scanf("%s", curInfo.name);
printf("请输入性别:\n");
scanf("%s", curInfo.gender);
printf("请输入年龄:\n");
scanf("%d", &curInfo.age);
printf("请输入电话号码:\n");
scanf("%s", curInfo.tele);
printf("请输入地址:\n");
scanf("%s", curInfo.addr);
pc->data[pc->size] = curInfo;
pc->size++;
}
void DelContact(pContact pc){
char name[NAME_MAX];
printf("请输入被删除人的姓名\n");
scanf("%s", name);
int pos = FindContact(pc, name);
if (pos==-1){
printf("此人不存在,删除失败!\n");
return;
}
for (int i = pos; i < pc->size - 1; ++i){
pc->data[i] = pc->data[i + 1];
}
pc->size--;
printf("删除成功\n");
}
void SearchContact(pContact pc){
char name[NAME_MAX];
printf("请输入要查找的人:\n");
scanf("%s", name);
int pos = FindContact(pc, name);
if (pos == -1){
printf("此人不存在,删除失败!\n");
return;
}
printf("==========================\n");
printf("姓名:%s", pc->data[pos].name);
printf("性别:%s", pc->data[pos].gender);
printf("年龄:%d", pc->data[pos].age);
printf("电话:%s", pc->data[pos].tele);
printf("地址:%s", pc->data[pos].addr);
printf("==========================\n");
}
void ModifyContact(pContact pc){
char name[NAME_MAX];
printf("请输入要修改的人的姓名:\n");
scanf("%s", name);
int pos = FindContact(pc, name);
if (pos == -1){
printf("此人不存在,修改失败!\n");
return;
}
printf("请输入姓名:\n");
scanf("%s", pc->data[pos].name);
printf("请输入性别:\n");
scanf("%s", pc->data[pos].gender);
printf("请输入年龄:\n");
scanf("%d", &pc->data[pos].age);
printf("请输入电话号码:\n");
scanf("%s", pc->data[pos].tele);
printf("请输入地址:\n");
scanf("%s", pc->data[pos].addr);
printf("修改成功\n");
}
void SortContact(pContact pc){
//按姓名升序排序
//第一层循环:待排序的元素个数
//第二层循环:找到当前区间的最大值的数,放在区间的最后一个位置
for (int sz = pc->size; sz > 0; --sz){
for (int i = 1; i < sz; ++i){
if (strcmp(pc->data[i - 1].name, pc->data[i].name)>0){
info tmp = pc->data[i - 1];
pc->data[i - 1] = pc->data[i];
pc->data[i] = tmp;
}
}
}
}
int FindContact(pContact pc, char* name){
for (int i = 0; i < pc->size; ++i){
if (strcmp(pc->data[i].name, name) == 0){
return i;
}
}
return -1;
}
void ShowContact(pContact pc){
for (int i = 0; i < pc->size; ++i){
printf("============第%d个人=============\n",i);
printf("姓名:%s\n", pc->data[i].name);
printf("性别:%s\n", pc->data[i].gender);
printf("年龄:%d\n", pc->data[i].age);
printf("电话:%s\n", pc->data[i].tele);
printf("地址:%s\n", pc->data[i].addr);
printf("================================\n");
}
}
//读取文件的内容
void LoadContact(pContact pc){
FILE* pF = fopen("contact.dat", "rb");
if (pF==NULL){
printf("文件打开失败\n");
return;
}
//读取文件内容
info CurInfo;
while (fread(&CurInfo, sizeof(info), 1, pF)){
if (CheckCapacity(pc)){
pc->data[pc->size] = CurInfo;
pc->size++;
}
}
fclose(pF);
}
//保存内容,相当于写
void SaveContact(pContact pc){
FILE* pF = fopen("contact.dat", "wb");
if (pF == NULL){
printf("打开文件失败\n");
return;
}
for (int i = 0; i < pc->size; ++i){
fwrite(pc->data + i, sizeof(info), 1, pF);
}
fclose(pF);
}
通过这次通讯录小项目的实现,深深地明白了函数名一定要有具体含义,不然到最后代码太多看的很乱。也明白了自己的不足之处以及薄弱的知识点,希望自己以后要越来越强。