11-1. 通讯录的录入与显示(10)

该程序设计要求实现一个通讯录管理系统,能录入包含姓名、出生日期、性别、固定电话和移动电话等信息的记录。用户输入N条记录后,可以按编号查询指定记录,输出格式为'姓名 固话 手机 性别 生日'。如果查询的记录不存在,则显示'Not Found'。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

11-1. 通讯录的录入与显示(10)

时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
作者
乔林(清华大学)

通讯录中的一条记录包含下述基本信息:朋友的姓名、出生日期、性别、固定电话号码、移动电话号码。 本题要求编写程序,录入N条记录,并且根据要求显示任意某条记录。

输入格式:

输入在第1行给出正整数N(<=10);随后N行,每行按照格式“姓名 生日 性别 固话 手机”给出一条记录。其中“姓名”是不超过10个字符、不包含空格的非空字符串;生日按“yyyy/mm/dd”的格式给出年月日;性别用“M”表示“男”、“F”表示“女”;“固话”和“手机”均为不超过15位的连续数字,前面有可能出现“+”。

在通讯录记录

<think>嗯,用户想知道如何用C语言实现通讯录录入显示功能。首先,我需要回忆一下C语言的基本结构,特别是结构体和文件操作的部分。通讯录通常需要存储联系人信息,比如姓名、电话、地址等,所以应该用结构体来定义每个联系人的数据结构。 接下来,录入功能需要用户输入信息并保存。可能需要一个函数来处理输入,比如AddContact函数。显示功能则是遍历存储的联系人并打印出来,对应的ShowContact函数。动态内存管理可能也是一个问题,因为通讯录的大小可能会变化,所以应该用动态数组或者链表来存储。不过用户提到的示例引用中有静态和动态版本,这里可能需要先展示静态版本,再考虑动态分配。 然后,文件操作部分。用户引用的资料提到,程序启动时加载文件,退出时保存。所以需要函数来读取和写入文件,比如LoadContact和SaveContact。用fopen打开文件,fread和fwrite进行读写,记得检查文件指针是否为空,避免程序崩溃。 另外,代码结构方面,可能需要分文件编写,比如contact.h声明结构体和函数,contact.c实现函数,test.c作为主程序。但用户可能希望一个简化的示例,所以先给出一个完整的单文件示例,方便理解。 还要注意输入缓冲区的处理,比如在读取字符串前使用getchar()清空缓冲区,防止换行符被误读。在显示联系人时,循环遍历数组,并判断count是否为零,给出提示信息。 测试的时候,主函数里用循环和switch语句处理用户选择,1为添加,2为显示,3退出,并在退出时保存数据。需要确保每次添加联系人时检查数组是否已满,避免溢出。 可能的问题点:文件路径的处理,动态内存分配是否足够,输入错误处理等。但根据用户的问题,可能不需要太复杂,先保证基本功能正确。 最后,示例代码要符合C语言的语法,结构清晰,注释明确,方便用户理解。之后生成相关问题,比如动态内存版本、文件存储位置修改、数据验证等,帮助用户深入学习。</think>### C语言通讯录录入显示功能实现步骤 根据文件存储和动态内存管理需求,以下为实现通讯录基础功能的完整代码示例(基于动态内存版本): ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME 20 #define MAX_TEL 12 #define INIT_SIZE 3 typedef struct Contact { char name[MAX_NAME]; char tel[MAX_TEL]; int age; } Contact; typedef struct ContactList { Contact* data; int count; int capacity; } ContactList; // 初始化通讯录 void InitContact(ContactList* pc) { pc->data = (Contact*)malloc(INIT_SIZE * sizeof(Contact)); pc->count = 0; pc->capacity = INIT_SIZE; } // 扩容检查 void CheckCapacity(ContactList* pc) { if (pc->count == pc->capacity) { Contact* new = (Contact*)realloc(pc->data, (pc->capacity + 2) * sizeof(Contact)); if (new) { pc->data = new; pc->capacity += 2; printf("扩容成功,当前容量:%d\n", pc->capacity); } } } // 添加联系人 void AddContact(ContactList* pc) { CheckCapacity(pc); printf("请输入姓名:"); scanf("%s", pc->data[pc->count].name); printf("请输入电话:"); scanf("%s", pc->data[pc->count].tel); printf("请输入年龄:"); scanf("%d", &pc->data[pc->count].age); pc->count++; } // 显示通讯录 void ShowContact(const ContactList* pc) { if (pc->count == 0) { printf("通讯录为空\n"); return; } printf("%-10s\t%-12s\t%-5s\n", "姓名", "电话", "年龄"); for (int i = 0; i < pc->count; i++) { printf("%-10s\t%-12s\t%-5d\n", pc->data[i].name, pc->data[i].tel, pc->data[i].age); } } // 保存到文件 void SaveContact(ContactList* pc) { FILE* pf = fopen("contact.dat", "wb"); if (!pf) { perror("SaveContact"); return; } fwrite(pc->data, sizeof(Contact), pc->count, pf); fclose(pf); } // 加载文件数据 void LoadContact(ContactList* pc) { FILE* pf = fopen("contact.dat", "rb"); if (!pf) { perror("LoadContact"); return; } Contact tmp; while (fread(&tmp, sizeof(Contact), 1, pf)) { CheckCapacity(pc); pc->data[pc->count++] = tmp; } fclose(pf); } int main() { ContactList con; InitContact(&con); LoadContact(&con); int input = 0; do { printf("\n1.添加\t2.显示\t3.退出\n"); printf("请选择:"); scanf("%d", &input); switch(input) { case 1: AddContact(&con); break; case 2: ShowContact(&con); break; case 3: SaveContact(&con); printf("数据已保存\n"); break; default: printf("输入错误\n"); } } while (input != 3); free(con.data); return 0; } ``` 关键实现要点: 1. 使用动态内存管理(`malloc/realloc`)实现弹性存储容量[^3] 2. 通过二进制文件读写(`fwrite/fread`)实现持久化存储[^4] 3. 包含扩容机制防止数据溢出 4. 采用模块化设计便于功能扩展
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值