帮我写一个拥有姓名,住址,电话号码,以及QQ号的c语言通讯录代码,以文件的形式存储,所有管理活动均以文件操作的方式进行

时间: 2024-04-11 07:27:00 浏览: 105
ZIP

c语言 通讯录 代码

当然可以!下面是一个示例的C语言通讯录程序,使用文件存储联系人信息: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME_LENGTH 50 #define MAX_ADDRESS_LENGTH 100 #define MAX_PHONE_LENGTH 15 #define MAX_QQ_LENGTH 15 struct Contact { char name[MAX_NAME_LENGTH]; char address[MAX_ADDRESS_LENGTH]; char phone[MAX_PHONE_LENGTH]; char qq[MAX_QQ_LENGTH]; }; void addContact(FILE* file) { struct Contact newContact; printf("请输入姓名:"); fgets(newContact.name, MAX_NAME_LENGTH, stdin); printf("请输入住址:"); fgets(newContact.address, MAX_ADDRESS_LENGTH, stdin); printf("请输入电话号码:"); fgets(newContact.phone, MAX_PHONE_LENGTH, stdin); printf("请输入QQ号:"); fgets(newContact.qq, MAX_QQ_LENGTH, stdin); fwrite(&newContact, sizeof(struct Contact), 1, file); printf("联系人已添加成功。\n"); } void displayContacts(FILE* file) { struct Contact contact; printf("通讯录列表:\n"); while (fread(&contact, sizeof(struct Contact), 1, file) == 1) { printf("姓名:%s", contact.name); printf("住址:%s", contact.address); printf("电话号码:%s", contact.phone); printf("QQ号:%s", contact.qq); printf("\n"); } if (feof(file)) { printf("所有联系人已显示完毕。\n"); } else { printf("无法读取通讯录文件。\n"); } } int main() { FILE* file; int choice; file = fopen("contacts.dat", "ab+"); if (file == NULL) { printf("无法打开通讯录文件。\n"); return 1; } do { printf("\n通讯录程序菜单:\n"); printf("1. 添加联系人\n"); printf("2. 显示所有联系人\n"); printf("3. 退出程序\n"); printf("请输入选项:"); scanf("%d", &choice); getchar(); // 用于清除输入缓冲区中的换行符 switch (choice) { case 1: addContact(file); break; case 2: displayContacts(file); break; case 3: printf("感谢使用通讯录程序!\n"); fclose(file); return 0; default: printf("无效的选项,请重新输入。\n"); } } while (1); return 0; } ``` 这个通讯录程序使用结构体 `Contact` 来存储联系人信息,每个联系人包括姓名、住址、电话号码和QQ号。程序使用文件操作函数 `fwrite` 和 `fread` 将联系人信息写入和读取出来存储在文件 `contacts.dat` 中。你可以根据需要进行扩展和修改。希望对你有帮助!
阅读全文

相关推荐

application/x-rar
#include <stdio.h>
#include <string.h>
/* 程序多次调用biodkey(),应包含头文件bios.h */
#include <bios.h>
/* 程序多次调用clrscr(),应包含头文件conio.h */
#include <conio.h>

#define MAX 100
#define PAGE 2
#define PRINT1 printf("--------------------------------------\n")
#define PRINT2 printf("NUM---NAME---AGE---MOBILE---ADDRESS\n")
#define PRINT3 printf("%d,%s,%d,%s,%s,\n",message[i].num,message[i].name,message[i].age,message[i].mobile[15],message[i].address);


int sum;


struct message_type
{
int num;
char name[15]; /* name应是数组 */
int age;
char mobile[15];
char address[30]; /* address应是数组 */
}message[MAX];


main()
{
int choice;
sum = read_message();
bioskey(0);

do
{
clrscr();
printf("\n\n\n ********通讯录管理系统********\n\n" );
printf(" 1.创建资料\n\n");
printf(" 2.输出资料\n\n");
printf(" 3.资料查询\n\n");
printf(" 4.资料添加\n\n");
printf(" 5.资料删除\n\n");
printf(" 6.资料修改\n\n");
printf(" 7.资料整理\n\n");
printf(" 0.退出系统\n\n");
printf("请选择(0-7):");
scanf("%d",&choice);

switch(choice)
{
case 1: input_message();break;
case 2: output_message();break;
case 3: inquire_message();break;
case 4: insert_message();break;
case 5: del_message();break;
case 6: revise_message();break;
case 7: sort_message();break;
case 0: break;
}
}while(choice!=0);
save_message(sum);
printf("\n -以上资料已保存!-(文件名:messagenotes.txt)\n");
}


/*保存信息*/
save_message(int sum)
{FILE *fp;
int i;
if((fp=fopen("messagenotes.txt","wb"))==NULL)
{printf("读文件错误!\n");
return;
}
for(i=0;i<sum;i++)
if(fwrite(&message[i],sizeof(struct message_type),1,fp)!=1)
printf("写文件错误!\n");
fclose(fp);
}

/* Function: input_message() */
input_message()
{
int i=0; /* 变量s无用,已删除 */
clrsrc();
printf("\n\n 录入通讯录\n"); /* 笔误 */
printf("\n -------------------------------\n");

do
{
printf("\n 第%d号录入",i+1);
printf("\n 编号:");
scanf("%d",&message[i].num);
if(message[i].num == 0)
break;
printf("\n 姓名:");
scanf("%s",message[i].name);
printf("\n 年龄:");
scanf("%d",&message[i].age);
printf("\n 电话:");
scanf("%s",message[i].mobile); /* message的mobile是数组,不用取址 */
printf("\n 地址:");
scanf("%s",message[i].address);
i++;
}while(i<MAX);

printf("\n --第%d号录入完毕 --\n",i);
sum = i;
printf("\n 按任意键返回住菜单!"); /* 本语句无效,程序已自动返回菜单 */
}

/* Function: read_message() */
int read_message()
{
FILE *fp;
int i = 0;
if((fp=fopen("messagenotes.txt","rb")) == NULL)
{
printf("\n\n*****暂时没有任何保存信息,按任意键进入主菜单选择进行信息录入!*****\n");
return;
}
while(!feof(fp)) /* feof()遇文件结束标志时返回非0值,不能依赖于1 */
{
fread(&message[i],sizeof(struct message_type),1,fp);
if(message[i].num == 0)
break;
else
i++;
}
fclose(fp);
return(i);
}


/* Function: output_message() */
output_message()
{
int i=0,j=0,count,page=1;
clrscr();
printf("\n\n --通讯录资料-- 第%d页\n\n",page);
PRINT2;
PRINT1;

do
{
if(message[i].num != 0)
{
j++;
if(j%PAGE != 0) /* 本if句恒假 */
{
PRINT3;
PRINT1;
}
else
{
PRINT3;
PRINT1;
if(message[i+1].num!=0)
{
print("按任意键继续!");
bioskey(0);
clrscr();
printf("\n\n --通讯录资料-- 第%d页\n\n",++page);
PRINT2;
PRINT1;
}
}
}
i++;
}while(message[i].num != 0);

printf("按任意键返回主菜单!");
bioskey(0);
}


/* Function: insert_message() */
insert_message()
{
int i=sum,j,flag=0;
char choice;
clrscr();
printf("\n\n 添加一条资料\n");
printf(" ---------------------------\n");
do
{
message[i].num = ++sum;
printf("\n 新资料编号:%d",message[i].num);
printf("\n 姓名:");
scanf("%s",message[i].name);
printf("\n 年龄:");
scanf("%d",&message[i].age);
printf("\n 电话:");
scanf("%s",&message[i].mobile[15]);
printf("\n 地址:");
scanf("%s",message[i].address);
printf("\n 要继续吗?(Y/N)");
choice=getch();
if (choice=='y'||choice=='Y')
{printf("\n 继续!\n");
i++;
flag=1;
}
else flag=0;
}while(flag==1);
printf("\n 按任意键返回主菜单!");
bioskey(0);
}


/*删除模块*/
del_message()
{int i=sum,j,flag=0;
char choice;
clrscr();
printf("\n\n 删除一条资料\n");
printf(" ---------------------------\n");
do
{message[i].num=++sum;
printf("\n 删除资料编号:%d",message[i].num);
printf("\n 姓名:");
scanf("%s",message[i].name);
printf("\n 年龄:");
scanf("%d",&message[i].age);
printf("\n 电话:");
scanf("%s",&message[i].mobile[15]);
printf("\n 地址:");
scanf("%s",message[i].address);
printf("\n 要继续吗?(Y/N)");
choice=getch();
if (choice=='y'||choice=='Y')
{printf("\n 继续!\n");
i++;
flag=1;
}
else flag=0;
}while(flag==1);
printf("\n 按任意键返回主菜单!");
bioskey(0);
}


/*修改模块*/
revise_message()
{int i=0,choice,revise_num,flag;
do
{clrscr();
printf("\n 输入要修改的资料编号:");
scanf("%d",&revise_num);
for(i=0;i<sum;i++)
if(message[i].num==revise_num)
{printf("\n --资料信息--\n");
PRINT1;
PRINT2;
PRINT3;
printf("\n 您要修改哪一项?\n");
printf("\n 1.姓名\n");
printf("\n 2.年龄\n");
printf("\n 3.电话\n");
printf("\n 4.地址\n");
printf("\n 请选择(1-4):");
scanf("%d",&choice);
switch(choice)
{case 1: printf("\n 请输入修改后的姓名:");
scanf("%s",&message[i].name);break;
case 2: printf("\n 请输入修改后的年龄:");
scanf("%d",&message[i].age);break;
case 3: printf("\n 请输入修改后的手机:");
scanf("%s",&message[i].mobile[15]);break;
case 4: printf("\n 请输入修改后的地址:");
scanf("%s",&message[i].address);break;
}
PRINT1;
PRINT2;
PRINT3;
break;
}
if (i==sum)
{printf("\n 无该资料!");
bioskey(0);
}
printf("\n\n 继续修改吗?(Y/N)");
choice=getch();
if (choice=='Y'||choice=='y')
{flag=1;
printf("\n 继续!\n");
}
else flag=0;
}while(flag==1);
printf("\n 按任意键返回主菜单!");
bioskey(0);
}


/* Function: inquire_name() */
inquire_name()
{
int i,choice,j=0; /* 笔误 */
char inquire_name[15]; /* 变量inquire_name应为数组 */
clrscr();
printf("\n 请输入要查询的姓名:");
scanf("%s",inquire_name);

for(i=0; i<sum; i++)
{ /* 以下语句,在0<i<sum的情况下,message[i].num恒不等于0 */
if(strcmp(message[i].name,inquire_name) == 0)
{
printf("\n --资料--\n");
PRINT1;
PRINT2;
PRINT3;
break; /* 增加 */
}
else
j++;
}
if(j == sum)
printf("\n 查询信息不存在!");
bioskey(0);
}

/* Function: inquire_age() */
inquire_age() /* 对本函数作更改,参与原函数比较 */
{
int i,choice,j=0;
int inquire_age;
clrscr();
printf("\n 请输入要查询的年龄:");
scanf("%d",&inquire_age);
for(i=0; i<sum; i++)
if(message[i].age == inquire_age)
{
printf("\n --资料--\n");
PRINT1;
PRINT2;
PRINT3;
break;
}
else
j++;
if(j == sum)
printf("\n 查询信息不存在!");
bioskey(0);
}


/* Function: inquire_message() */
inquire_message()
{
int choice; /* 原语句笔误,已改 */

do
{
clrscr();
printf("\n\n\n **********查询资料**********\n\n\n");
printf(" 1.按姓名查询\n\n");
printf(" 2.按年龄查询\n\n");
scanf("%d",&choice);
switch(choice)
{
case 1: inquire_name();break; /* 为函数调用 */
case 2: inquire_age();break; /* 同上 */
case 0: break;
}
}while(choice != 0);
}


/*排序模块*/
sort_num()
{struct message_type *p,*q[MAX];
int i,j,k;
clrscr();
printf("\n 按编号排序\n");
printf("---------------------------------------------\n");
printf("\n 排名 编号 姓名 年龄 手机 地址\n");
p=message;
for(i=0;i<sum;i++)
{k=i;
for(j=i+1;j<sum;j++)
if(q[k]->num<q[j]->num)
k=j;
if(k!=i)
{p=q[i];q[i]=q[k];q[k]=p;}
}
for(i=0;i<sum;i++)
printf("\n%d %d %s %d %s %s\n",
i+1,q[i]->num,q[i]->name,q[i]->age,q[i]->mobile[15],q[i]->address);
bioskey(0);
}

最新推荐

recommend-type

基于springboot大学生就业信息管理系统源码数据库文档.zip

基于springboot大学生就业信息管理系统源码数据库文档.zip
recommend-type

基于java的驾校收支管理可视化平台的开题报告.docx

基于java的驾校收支管理可视化平台的开题报告
recommend-type

Chrome ESLint扩展:实时运行ESLint于网页脚本

资源摘要信息:"chrome-eslint:Chrome扩展程序可在当前网页上运行ESLint" 知识点: 1. Chrome扩展程序介绍: Chrome扩展程序是一种为Google Chrome浏览器添加新功能的小型软件包,它们可以增强或修改浏览器的功能。Chrome扩展程序可以用来个性化和定制浏览器,从而提高工作效率和浏览体验。 2. ESLint功能及应用场景: ESLint是一个开源的JavaScript代码质量检查工具,它能够帮助开发者在开发过程中就发现代码中的语法错误、潜在问题以及不符合编码规范的部分。它通过读取代码文件来检测错误,并根据配置的规则进行分析,从而帮助开发者维护统一的代码风格和避免常见的编程错误。 3. 部署后的JavaScript代码问题: 在将JavaScript代码部署到生产环境后,可能存在一些代码是开发过程中未被检测到的,例如通过第三方服务引入的脚本。这些问题可能在开发环境中未被发现,只有在用户实际访问网站时才会暴露出来,例如第三方脚本的冲突、安全性问题等。 4. 为什么需要在已部署页面运行ESLint: 在已部署的页面上运行ESLint可以发现那些在开发过程中未被捕捉到的JavaScript代码问题。它可以帮助开发者识别与第三方脚本相关的问题,比如全局变量冲突、脚本执行错误等。这对于解决生产环境中的问题非常有帮助。 5. Chrome ESLint扩展程序工作原理: Chrome ESLint扩展程序能够在当前网页的所有脚本上运行ESLint检查。通过这种方式,开发者可以在实际的生产环境中快速识别出可能存在的问题,而无需等待用户报告或使用其他诊断工具。 6. 扩展程序安装与使用: 尽管Chrome ESLint扩展程序尚未发布到Chrome网上应用店,但有经验的用户可以通过加载未打包的扩展程序的方式自行安装。这需要用户从GitHub等平台下载扩展程序的源代码,然后在Chrome浏览器中手动加载。 7. 扩展程序的局限性: 由于扩展程序运行在用户的浏览器端,因此它的功能可能受限于浏览器的执行环境。它可能无法访问某些浏览器API或运行某些特定类型的代码检查。 8. 调试生产问题: 通过使用Chrome ESLint扩展程序,开发者可以有效地调试生产环境中的问题。尤其是在处理复杂的全局变量冲突或脚本执行问题时,可以快速定位问题脚本并分析其可能的错误源头。 9. JavaScript代码优化: 扩展程序不仅有助于发现错误,还可以帮助开发者理解页面上所有JavaScript代码之间的关系。这有助于开发者优化代码结构,提升页面性能,确保代码质量。 10. 社区贡献: Chrome ESLint扩展程序的开发和维护可能是一个开源项目,这意味着整个开发社区可以为其贡献代码、修复bug和添加新功能。这对于保持扩展程序的活跃和相关性是至关重要的。 通过以上知识点,我们可以深入理解Chrome ESLint扩展程序的作用和重要性,以及它如何帮助开发者在生产环境中进行JavaScript代码的质量保证和问题调试。
recommend-type

管理建模和仿真的文件

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

精确率与召回率的黄金法则:如何在算法设计中找到最佳平衡点

![精确率与召回率的黄金法则:如何在算法设计中找到最佳平衡点](http://8411330.s21i.faiusr.com/4/ABUIABAEGAAg75zR9gUo_MnlwgUwhAc4-wI.png) # 1. 精确率与召回率的基本概念 在信息技术领域,特别是在机器学习和数据分析的语境下,精确率(Precision)和召回率(Recall)是两个核心的评估指标。精确率衡量的是模型预测为正的样本中实际为正的比例,而召回率衡量的是实际为正的样本被模型正确预测为正的比例。理解这两个概念对于构建有效且准确的预测模型至关重要。为了深入理解精确率与召回率,在本章节中,我们将先从这两个概念的定义
recommend-type

在嵌入式系统中,如何确保EFS高效地管理Flash和ROM存储器,并向应用程序提供稳定可靠的接口?

为了确保嵌入式文件系统(EFS)高效地管理Flash和ROM存储器,同时向应用程序提供稳定可靠的接口,以下是一些关键技术和实践方法。 参考资源链接:[嵌入式文件系统:EFS在Flash和ROM中的可靠存储应用](https://wenku.csdn.net/doc/87noux71g0?spm=1055.2569.3001.10343) 首先,EFS需要设计为一个分层结构,其中包含应用程序接口(API)、本地设备接口(LDI)和非易失性存储器(NVM)层。NVM层负责处理与底层存储介质相关的所有操作,包括读、写、擦除等,以确保数据在断电后仍然能够被保留。 其次,EFS应该提供同步和异步两
recommend-type

基于 Webhook 的 redux 预处理器实现教程

资源摘要信息: "nathos-wh:*** 的基于 Webhook 的 redux" 知识点: 1. Webhook 基础概念 Webhook 是一种允许应用程序提供实时信息给其他应用程序的方式。它是一种基于HTTP回调的简单技术,允许一个应用在特定事件发生时,通过HTTP POST请求实时通知另一个应用,从而实现两个应用之间的解耦和自动化的数据交换。在本主题中,Webhook 用于触发服务器端的预处理操作。 2. Grunt 工具介绍 Grunt 是一个基于Node.js的自动化工具,主要用于自动化重复性的任务,如编译、测试、压缩文件等。通过定义Grunt任务和配置文件,开发者可以自动化执行各种操作,提高开发效率和维护便捷性。 3. Node 模块及其安装 Node.js 是一个基于Chrome V8引擎的JavaScript运行环境,它允许开发者使用JavaScript来编写服务器端代码。Node 模块是Node.js的扩展包,可以通过npm(Node.js的包管理器)进行安装。在本主题中,通过npm安装了用于预处理Sass、Less和Coffescript文件的Node模块。 4. Sass、Less 和 Coffescript 文件预处理 Sass、Less 和 Coffescript 是前端开发中常用的预处理器语言。Sass和Less是CSS预处理器,它们扩展了CSS的功能,例如变量、嵌套规则、混合等,使得CSS编写更加方便、高效。Coffescript则是一种JavaScript预处理语言,它提供了更为简洁的语法和一些编程上的便利特性。 5. 服务器端预处理操作触发 在本主题中,Webhook 被用来触发服务器端的预处理操作。当Webhook被设置的事件触发后,它会向服务器发送一个HTTP POST请求。服务器端的监听程序接收到请求后,会执行相应的Grunt任务,进行Sass、Less和Coffescript的编译转换工作。 6. Grunt 文件配置 Grunt 文件(通常命名为Gruntfile.js)是Grunt任务的配置文件。它定义了任务和任务运行时的配置,允许开发者自定义要执行的任务以及执行这些任务时的参数。在本主题中,Grunt文件被用来配置预处理任务。 7. 服务器重启与 Watch 命令 为了确保Webhook触发的预处理命令能够正确执行,需要在安装完所需的Node模块后重新启动Webhook运行服务器。Watch命令是Grunt的一个任务,可以监控文件的变化,并在检测到变化时执行预设的任务,如重新编译Sass、Less和Coffescript文件。 总结来说,nathos-wh主题通过搭建Grunt环境并安装特定的Node模块,实现了Sass、Less和Coffescript文件的实时预处理。这使得Web开发人员可以在本地开发时享受到更高效、自动化的工作流程,并通过Webhook与服务器端的交互实现实时的自动构建功能。这对于提高前端开发的效率和准确性非常关键,同时也体现了现代Web开发中自动化工具与实时服务整合的趋势。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

精确率的终极指南:提升机器学习模型性能的10个实战技巧

![精确率的终极指南:提升机器学习模型性能的10个实战技巧](https://simg.baai.ac.cn/hub-detail/3f683a65af53da3a2ee77bd610ede1721693616617367.webp) # 1. 机器学习模型性能的度量与挑战 机器学习模型的性能度量与优化是开发健壮和可靠系统的基石。在评估模型的准确性时,传统的度量指标如准确率、召回率和F1分数已经不能满足需求,特别是当数据集不平衡或存在类别重叠时。这要求我们深入理解各种性能指标的内在含义和适用场景。 ## 1.1 模型性能的多种度量指标 准确率是指模型正确预测的样本数占总样本数的比例,但当
recommend-type

在嵌入式系统中,如何设计一个支持高效持久化存储的文件系统,并为应用程序提供稳定可靠的接口?

为了在嵌入式系统中实现文件系统的高效持久化存储以及提供可靠的接口给应用程序,我们可以借鉴《嵌入式文件系统:EFS在Flash和ROM中的可靠存储应用》中的相关知识。EFS(嵌入式文件系统)在设计时采用了分层架构,提供了设备无关的接口,同时考虑到性能和资源的高效利用。 参考资源链接:[嵌入式文件系统:EFS在Flash和ROM中的可靠存储应用](https://wenku.csdn.net/doc/87noux71g0?spm=1055.2569.3001.10343) 首先,EFS需要支持对Flash和ROM这类非易失性存储器(NVM)的高效操作。Flash memory由于其擦写次数有限