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

本文介绍了一个简单的通讯录管理系统的设计与实现。系统使用结构体存储联系人的基本信息,包括姓名、出生日期、性别、固定电话号码和移动电话号码。文章提供了完整的C语言代码示例,展示了如何输入和输出这些记录。

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

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

输入格式:

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

在通讯录记录输入完成后,最后一行给出正整数K,并且随后给出K个整数,表示要查询的记录编号(从0到N-1顺序编号)。数字间以空格分隔。

输出格式:

对每一条要查询的记录编号,在一行中按照“姓名 固话 手机 性别 生日”的格式输出该记录。若要查询的记录不存在,则输出“Not Found”。

输入样例:

3
Chris 1984/03/10 F +86181779452 13707010007
LaoLao 1967/11/30 F 057187951100 +8618618623333
QiaoLin 1980/01/01 M 84172333 10086
2 1 7

输出样例:

LaoLao 057187951100 +8618618623333 F 1967/11/30
 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 struct tong{
 5     char name[11];
 6     char birthday[11];
 7     char sex;
 8     char gnum[17];
 9     char num[17];
10 };
11 
12 void input();
13 void output();
14 
15 int main()
16 {
17     int n, i;
18     scanf("%d", &n);
19     struct tong t[n];
20     input(t, n);
21     output(t, n);
22     
23     return 0;
24 }
25 
26 void input(struct tong p[], int n)
27 {
28     int i;
29     for(i = 0; i < n; i++) {
30         scanf("%s %s %c %s %s", p[i].name, p[i].birthday, &p[i].sex, p[i].gnum, p[i].num);
31         }
32     
33 }
34 
35 void output(struct tong q[], int n)
36 {
37     int m, j;
38     scanf("%d", &m);
39     int a[m];
40     for(j = 0; j < m; j++) {
41         scanf("%d", &a[j]);
42     }
43     for(j = 0; j < m; j++) {
44         if(a[j] >=0 && a[j] < n) {
45             printf("%s %s %s %c %s\n", q[a[j]].name, q[a[j]].gnum, q[a[j]].num, q[a[j]].sex, q[a[j]].birthday);
46         }
47         else {
48             printf("Not Found\n");
49         }
50     }    
51 }

 

转载于:https://www.cnblogs.com/aexin/p/3903375.html

<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. 采用模块化设计便于功能扩展
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值