C语言编程练习:建立一个同学通讯录,输入学号、姓名、电话号码、住址等信息,然后 对通信录进行显示、查找、添加、修改。 编写一个菜单驱动的通讯录,其功能要求: (1)通讯录的每一条信息包括学号、姓名、家庭住址、电话、分类(如 同事、朋友、同学、家人等)、EMAIL、QQ等。 (2)输入功能:可以一次完成若干条信息的输入。 (3)显示功能:完成全部通讯录信息的显示。(4)查找功能:可以按姓名或按类别等多种方式查找通讯信息 (5)修改功能:根据需要完成通讯录信息的更新、修改 (6)排序功能:可按照所有学生的学号从小到大进行排序; (7)通讯录数据要能够保存,可采用文件读写技术存放于专门的数据文 件如xxx.txt,在程序开始运行时,可以通过读取该文件获得记录数据。

时间: 2023-07-10 08:32:32 浏览: 108
好的,这是一个非常实用的 C 语言编程练习!下面是一个简单的实现方案。 首先,我们需要定义一个结构体来表示每个同学的通讯录信息: ```c typedef struct { int id; // 学号 char name[20]; // 姓名 char address[50]; // 家庭住址 char phone[20]; // 电话号码 char category[20]; // 分类,如同事、朋友、同学、家人等 char email[50]; // 邮箱 char qq[20]; // QQ号码 } Contact; ``` 然后,我们可以定义一个 Contact 数组来存储所有同学的通讯录信息: ```c Contact contacts[100]; int count = 0; // 当前通讯录中同学的数量 ``` 接下来,我们可以编写一个菜单,让用户可以选择不同的功能: ```c int main() { while (1) { printf("通讯录菜单:\n"); printf("1. 输入\n"); printf("2. 显示\n"); printf("3. 查找\n"); printf("4. 修改\n"); printf("5. 排序\n"); printf("6. 保存\n"); printf("7. 退出\n"); printf("请选择功能(输入数字1-7):\n"); int choice; scanf("%d", &choice); switch (choice) { case 1: input(); break; case 2: display(); break; case 3: search(); break; case 4: modify(); break; case 5: sort(); break; case 6: save(); break; case 7: exit(0); default: printf("无效的选择,请重新输入。\n"); break; } } return 0; } ``` 其中,每个功能对应一个函数,下面我们来逐个实现。 ### 输入功能 输入功能可以一次完成若干条信息的输入,我们可以使用一个循环来实现。在循环中,我们可以提示用户输入每个同学的信息,并将其保存到 Contact 数组中: ```c void input() { printf("请输入同学的信息:\n"); while (1) { Contact c; printf("学号:"); scanf("%d", &c.id); printf("姓名:"); scanf("%s", c.name); printf("家庭住址:"); scanf("%s", c.address); printf("电话号码:"); scanf("%s", c.phone); printf("分类:"); scanf("%s", c.category); printf("邮箱:"); scanf("%s", c.email); printf("QQ号码:"); scanf("%s", c.qq); contacts[count++] = c; printf("是否继续输入?(y/n):"); char ch; scanf("%s", &ch); if (ch != 'y') { break; } } printf("输入完成!\n"); } ``` ### 显示功能 显示功能可以完成全部通讯录信息的显示,我们可以使用一个循环来遍历 Contact 数组,并将每个同学的信息打印出来: ```c void display() { printf("当前通讯录中共有%d个同学的信息:\n", count); for (int i = 0; i < count; i++) { Contact c = contacts[i]; printf("学号:%d, 姓名:%s, 家庭住址:%s, 电话号码:%s, 分类:%s, 邮箱:%s, QQ号码:%s\n", c.id, c.name, c.address, c.phone, c.category, c.email, c.qq); } } ``` ### 查找功能 查找功能可以按姓名或按类别等多种方式查找通讯信息。我们可以让用户输入查找的关键字,然后遍历 Contact 数组,找到匹配的同学信息并打印出来: ```c void search() { printf("请选择查找方式:\n"); printf("1. 按姓名查找\n"); printf("2. 按分类查找\n"); printf("请选择(输入数字1或2):\n"); int choice; scanf("%d", &choice); switch (choice) { case 1: searchByName(); break; case 2: searchByCategory(); break; default: printf("无效的选择,请重新输入。\n"); break; } } void searchByName() { printf("请输入同学的姓名:\n"); char name[20]; scanf("%s", name); int found = 0; for (int i = 0; i < count; i++) { Contact c = contacts[i]; if (strcmp(c.name, name) == 0) { printf("学号:%d, 姓名:%s, 家庭住址:%s, 电话号码:%s, 分类:%s, 邮箱:%s, QQ号码:%s\n", c.id, c.name, c.address, c.phone, c.category, c.email, c.qq); found = 1; } } if (!found) { printf("未找到同学信息。\n"); } } void searchByCategory() { printf("请输入同学的分类:\n"); char category[20]; scanf("%s", category); int found = 0; for (int i = 0; i < count; i++) { Contact c = contacts[i]; if (strcmp(c.category, category) == 0) { printf("学号:%d, 姓名:%s, 家庭住址:%s, 电话号码:%s, 分类:%s, 邮箱:%s, QQ号码:%s\n", c.id, c.name, c.address, c.phone, c.category, c.email, c.qq); found = 1; } } if (!found) { printf("未找到同学信息。\n"); } } ``` ### 修改功能 修改功能可以根据需要完成通讯录信息的更新、修改。我们可以让用户输入要修改的同学的学号,然后让用户输入新的信息,并将其更新到 Contact 数组中: ```c void modify() { printf("请输入要修改的同学的学号:\n"); int id; scanf("%d", &id); int found = 0; for (int i = 0; i < count; i++) { Contact *c = &contacts[i]; if (c->id == id) { printf("请输入同学的新信息:\n"); printf("姓名:"); scanf("%s", c->name); printf("家庭住址:"); scanf("%s", c->address); printf("电话号码:"); scanf("%s", c->phone); printf("分类:"); scanf("%s", c->category); printf("邮箱:"); scanf("%s", c->email); printf("QQ号码:"); scanf("%s", c->qq); found = 1; break; } } if (!found) { printf("未找到同学信息。\n"); } else { printf("修改完成!\n"); } } ``` ### 排序功能 排序功能可以按照所有学生的学号从小到大进行排序。我们可以使用冒泡排序来实现: ```c void sort() { for (int i = 0; i < count - 1; i++) { for (int j = 0; j < count - i - 1; j++) { if (contacts[j].id > contacts[j + 1].id) { Contact temp = contacts[j]; contacts[j] = contacts[j + 1]; contacts[j + 1] = temp; } } } printf("排序完成!\n"); } ``` ### 保存功能 保存功能可以将通讯录数据保存到文件中。我们可以使用文件读写技术存放于专门的数据文件如 `contacts.txt`。在程序开始运行时,我们可以通过读取该文件获得记录数据。 ```c void save() { FILE *fp = fopen("contacts.txt", "w"); if (fp == NULL) { printf("无法打开文件!\n"); return; } for (int i = 0; i < count; i++) { Contact c = contacts[i]; fprintf(fp, "%d,%s,%s,%s,%s,%s,%s\n", c.id, c.name, c.address, c.phone, c.category, c.email, c.qq); } fclose(fp); printf("保存完成!\n"); } ``` 在程序开始运行时,我们可以通过读取该文件获得记录数据: ```c int main() { // 读取文件中的记录数据 FILE *fp = fopen("contacts.txt", "r"); if (fp != NULL) { char line[100]; while (fgets(line, sizeof(line), fp) != NULL) { Contact c; sscanf(line, "%d,%[^,],%[^,],%[^,],%[^,],%[^,],%s", &c.id, c.name, c.address, c.phone, c.category, c.email, c.qq); contacts[count++] = c; } fclose(fp); } // 显示菜单 while (1) { // ... } return 0; } ``` 至此,一个基本的同学通讯录程序就完成了,你可以试着运行一下,看看是否能够正常工作。当然,这只是一个最基本的实现方案,你可以根据自己的需要进行扩展和优化。

相关推荐

最新推荐

recommend-type

C语言基于哈希表实现通讯录

在详细设计中,我们首先定义了一个结构体node,用于存储电话号码、姓名、地址、城市、其他信息等。然后,我们定义了一个哈希函数hash,用于将电话号码转换为数字,并计算出哈希值。最后,我们实现了create、dlter、...
recommend-type

单片机C语言程序设计:定时器控制数码管动态显示

单片机C语言程序设计:定时器控制数码管动态显示是单片机应用的一个经典案例,展示了单片机C语言程序设计的强大功能和灵活性。 知识点: 1. 单片机C语言程序设计的应用 2. 定时器的使用和原理 3. 数码管的动态显示...
recommend-type

单片机C语言程序设计:8X8LED 点阵显示数字

名称:按键控制 8X8LED 点阵屏显示图形 说明:每次按下 K1 时,会使 8X8LED点阵屏循环显示不同图形。本例同时使用外部中断和定时中断。
recommend-type

C语言实现顺序表的顺序查找和折半查找

C语言实现顺序表的顺序查找和折半查找 在计算机科学中,查找是指在一组数据中找到特定元素的过程。顺序表是一种基本的数据结构,在实际应用中非常常见。因此,学习如何在顺序表中实现查找是非常重要的。下面,我们...
recommend-type

C语言设计散列表实现电话号码查找系统

基本要求: (1)设每个记录有下列...(2)从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表; (3)采用一定的方法解决冲突; (4)查找并显示给定电话号码的记录; (5)查找并显示给定用户名的记录。
recommend-type

基于嵌入式ARMLinux的播放器的设计与实现 word格式.doc

本文主要探讨了基于嵌入式ARM-Linux的播放器的设计与实现。在当前PC时代,随着嵌入式技术的快速发展,对高效、便携的多媒体设备的需求日益增长。作者首先深入剖析了ARM体系结构,特别是针对ARM9微处理器的特性,探讨了如何构建适用于嵌入式系统的嵌入式Linux操作系统。这个过程包括设置交叉编译环境,优化引导装载程序,成功移植了嵌入式Linux内核,并创建了适合S3C2410开发板的根文件系统。 在考虑到嵌入式系统硬件资源有限的特点,通常的PC机图形用户界面(GUI)无法直接应用。因此,作者选择了轻量级的Minigui作为研究对象,对其实体架构进行了研究,并将其移植到S3C2410开发板上,实现了嵌入式图形用户界面,使得系统具有简洁而易用的操作界面,提升了用户体验。 文章的核心部分是将通用媒体播放器Mplayer移植到S3C2410开发板上。针对嵌入式环境中的音频输出问题,作者针对性地解决了Mplayer播放音频时可能出现的不稳定性,实现了音乐和视频的无缝播放,打造了一个完整的嵌入式多媒体播放解决方案。 论文最后部分对整个项目进行了总结,强调了在嵌入式ARM-Linux平台上设计播放器所取得的成果,同时也指出了一些待改进和完善的方面,如系统性能优化、兼容性提升以及可能的扩展功能等。关键词包括嵌入式ARM-Linux、S3C2410芯片、Mplayer多媒体播放器、图形用户界面(GUI)以及Minigui等,这些都反映出本文研究的重点和领域。 通过这篇论文,读者不仅能了解到嵌入式系统与Linux平台结合的具体实践,还能学到如何在资源受限的环境中设计和优化多媒体播放器,为嵌入式技术在多媒体应用领域的进一步发展提供了有价值的经验和参考。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

Python字符串为空判断的动手实践:通过示例掌握技巧

![Python字符串为空判断的动手实践:通过示例掌握技巧](https://img-blog.csdnimg.cn/72f88d4fc1164d6c8b9c29d8ab5ed75c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASGFyYm9yIExhdQ==,size_20,color_FFFFFF,t_70,g_se,x_16) # 1. Python字符串为空判断的基础理论 字符串为空判断是Python编程中一项基本且重要的任务。它涉及检查字符串是否为空(不包含任何字符),这在
recommend-type

box-sizing: border-box;作用是?

`box-sizing: border-box;` 是 CSS 中的一个样式属性,它改变了元素的盒模型行为。默认情况下,浏览器会计算元素内容区域(content)、内边距(padding)和边框(border)的总尺寸,也就是所谓的"标准盒模型"。而当设置为 `box-sizing: border-box;` 后,元素的总宽度和高度会包括内容、内边距和边框的总空间,这样就使得开发者更容易控制元素的实际布局大小。 具体来说,这意味着: 1. 内容区域的宽度和高度不会因为添加内边距或边框而自动扩展。 2. 边框和内边距会从元素的总尺寸中减去,而不是从内容区域开始计算。
recommend-type

经典:大学答辩通过_基于ARM微处理器的嵌入式指纹识别系统设计.pdf

本文主要探讨的是"经典:大学答辩通过_基于ARM微处理器的嵌入式指纹识别系统设计.pdf",该研究专注于嵌入式指纹识别技术在实际应用中的设计和实现。嵌入式指纹识别系统因其独特的优势——无需外部设备支持,便能独立完成指纹识别任务,正逐渐成为现代安全领域的重要组成部分。 在技术背景部分,文章指出指纹的独特性(图案、断点和交叉点的独一无二性)使其在生物特征认证中具有很高的可靠性。指纹识别技术发展迅速,不仅应用于小型设备如手机或门禁系统,也扩展到大型数据库系统,如连接个人电脑的桌面应用。然而,桌面应用受限于必须连接到计算机的条件,嵌入式系统的出现则提供了更为灵活和便捷的解决方案。 为了实现嵌入式指纹识别,研究者首先构建了一个专门的开发平台。硬件方面,详细讨论了电源电路、复位电路以及JTAG调试接口电路的设计和实现,这些都是确保系统稳定运行的基础。在软件层面,重点研究了如何在ARM芯片上移植嵌入式操作系统uC/OS-II,这是一种实时操作系统,能够有效地处理指纹识别系统的实时任务。此外,还涉及到了嵌入式TCP/IP协议栈的开发,这是实现系统间通信的关键,使得系统能够将采集的指纹数据传输到远程服务器进行比对。 关键词包括:指纹识别、嵌入式系统、实时操作系统uC/OS-II、TCP/IP协议栈。这些关键词表明了论文的核心内容和研究焦点,即围绕着如何在嵌入式环境中高效、准确地实现指纹识别功能,以及与外部网络的无缝连接。 这篇论文不仅深入解析了嵌入式指纹识别系统的硬件架构和软件策略,而且还展示了如何通过结合嵌入式技术和先进操作系统来提升系统的性能和安全性,为未来嵌入式指纹识别技术的实际应用提供了有价值的研究成果。