C语言通讯录
c语言课程设计通讯录

c语言课程设计 通讯录一、课程目标知识目标:1. 理解并掌握C语言结构体和数组的使用,能够运用其创建和操作通讯录。
2. 学习并掌握C语言中的文件操作,实现通讯录数据的保存和读取功能。
3. 掌握C语言中的函数定义和应用,实现通讯录各项功能模块的划分和调用。
技能目标:1. 能够编写C程序,实现通讯录的增加、删除、修改和查询功能。
2. 能够运用所学知识,设计出界面友好、操作简便的通讯录管理系统。
3. 能够对程序进行调试和优化,提高代码的可读性和执行效率。
情感态度价值观目标:1. 培养学生主动探索、积极实践的学习态度,增强其解决实际问题的能力。
2. 培养学生的团队协作精神,学会与他人共同分析问题、解决问题。
3. 通过本课程的学习,使学生认识到编程在生活中的应用价值,激发其对计算机科学的兴趣。
分析课程性质、学生特点和教学要求:本课程为C语言课程设计,旨在巩固和拓展学生所学知识,提高其编程能力。
学生已具备一定的C语言基础,能够独立完成简单的程序编写。
课程要求学生通过动手实践,掌握结构体、数组、文件操作等知识,并能够将其应用于实际项目中。
课程目标明确,分解为具体学习成果,便于教学设计和评估。
在教学过程中,注重培养学生的实际操作能力和团队协作能力,提高其综合素质。
二、教学内容根据课程目标,教学内容主要包括以下几部分:1. C语言基础知识回顾:结构体、数组、函数、文件操作等。
- 结构体:定义、声明、初始化、结构体数组。
- 数组:一维数组、二维数组、字符串与字符数组。
- 函数:函数定义、声明、调用、参数传递。
- 文件操作:文件打开、关闭、读写、定位。
2. 通讯录管理系统功能模块设计:- 系统架构设计:功能模块划分、模块间关系。
- 功能实现:增加、删除、修改、查询、排序等。
3. 编程实践与调试:- 编写代码实现通讯录管理系统各项功能。
- 调试程序,优化代码,提高执行效率。
4. 团队协作与项目展示:- 分组进行项目开发,培养学生团队协作能力。
通讯录C语言程序设计

通讯录C语言程序设计通讯录C语言程序设计是一个常见的编程练习项目,它可以帮助初学者熟悉C语言的基本语法和数据结构。
下面是一个简单的通讯录程序设计示例,包括了程序的基本框架、功能实现和代码实现。
程序设计目标设计一个通讯录程序,能够实现以下功能:1. 添加联系人2. 删除联系人3. 修改联系人信息4. 显示所有联系人5. 按姓名查找联系人6. 保存联系人信息到文件7. 从文件加载联系人信息程序设计思路1. 数据结构设计:使用结构体`struct Contact`来存储联系人信息,包括姓名、电话号码、电子邮件等。
2. 功能模块划分:将程序分为多个功能模块,如添加、删除、修改、显示、查找、保存和加载。
3. 用户界面设计:设计一个简单的文本界面,使用循环让用户选择相应的操作。
4. 文件操作:使用C语言的文件操作函数来实现联系人信息的持久化存储。
数据结构定义```c#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_CONTACTS 100#define MAX_NAME 50#define MAX_PHONE 20#define MAX_EMAIL 50struct Contact {char name[MAX_NAME];char phone[MAX_PHONE];char email[MAX_EMAIL];};struct Contact contacts[MAX_CONTACTS];int contactCount = 0;```功能实现1. 添加联系人```cvoid addContact() {if (contactCount >= MAX_CONTACTS) {printf("Contact list is full.\n"); return;}printf("Enter name: ");scanf("%49s", contacts[contactCount].name);printf("Enter phone: ");scanf("%19s", contacts[contactCount].phone);printf("Enter email: ");scanf("%49s", contacts[contactCount].email);contactCount++;}```2. 删除联系人```cvoid deleteContact() {int i, index;printf("Enter name of the contact to delete: ");scanf("%49s", contacts[index].name);for (i = 0; i < contactCount; i++) {if (strcmp(contacts[i].name, contacts[index].name) == 0) {index = i;break;}}if (i == contactCount) {printf("Contact not found.\n");} else {for (; i < contactCount - 1; i++) {contacts[i] = contacts[i + 1];}contactCount--;printf("Contact deleted.\n");}}```3. 修改联系人信息```cvoid modifyContact() {// 类似于删除联系人,找到联系人后修改信息}```4. 显示所有联系人```cvoid displayContacts() {for (int i = 0; i < contactCount; i++) {printf("%s, %s, %s\n", contacts[i].name, contacts[i].phone, contacts[i].email);}}```5. 按姓名查找联系人```cvoid findContact() {char name[MAX_NAME];printf("Enter name to find: ");scanf("%49s", name);for (int i = 0; i < contactCount; i++) {if (strcmp(contacts[i].name, name) == 0) { printf("%s, %s, %s\n", contacts[i].name, contacts[i].phone, contacts[i].email);return;}}printf("Contact not found.\n");}```6. 保存联系人信息到文件```cvoid saveContactsToFile() {FILE *file = fopen("contacts.txt", "w");if (file == NULL) {printf("Error opening file.\n");return;}for (int i = 0; i < contactCount; i++) {fprintf(file, "%s,%s,%s\n", contacts[i].name, contacts[i].phone, contacts[i].email);}fclose(file);printf("Contacts saved to file.\n");}```7. 从文件加载联系人信息```cvoid loadContactsFromFile() {FILE *file = fopen("contacts.txt", "r");if (file == NULL) {printf("。
C语言课程设计-通讯录

内容:设计一个通讯信息管理系统,使之具有以下功能:(1)每一条记录包括姓名、单位、联系电话,家庭住址等信息。
(2)输入功能:可以一次完成若干条记录的输入。
(3)显示功能:完成全部记录的显示。
(4)查找功能:能够按姓名或单位查找记录,并显示。
(5)排序功能:按姓名进行排序。
(6)插入功能:插入一条记录。
(7)将记录存在文件中,并能进行复制。
#include "stdio.h"#include "stdlib.h"#include "string.h"/*字符串函数*/#include "ctype.h"#define M 50typedef struct /*定义数据结构*/{ char name[20];char units[30];char tele[10];}ADD_BOOK;/******以下是函数原型*******/int enter(ADD_BOOK t[]); /*输入记录*/void list(ADD_BOOK t[],int n); /*显示记录*/void search(ADD_BOOK t[],int n); /*按姓名查找显示记录*/ int delete(ADD_BOOK t[],int n); /*删除记录*/int add(ADD_BOOK t[],int n); /*插入记录*/void save(ADD_BOOK t[],int n); /*记录保存为文件*/int load(ADD_BOOK t[]); /*从文件中读记录*/void display(ADD_BOOK t[]); /*按序号查找显示记录*/void sort(ADD_BOOK t[],int n); /*按姓名排序*/void qseek(ADD_BOOK t[],int n); /*快速查找记录*/void copy(); /*文件复制*/void print(ADD_BOOK temp); /*显示单条记录*/int find(ADD_BOOK t[],int n,char *s) ; /*查找函数*/int menu_select(); /*主菜单函数*//******主函数开始*******/main(){ int i;ADD_BOOK adr[M]; /*定义结构体数组*/int length; /*保存记录长度*/system("CLS");for(;;){ switch(menu_select()){case 0:length=enter(adr);break;case 1:list(adr,length);break;case 2:search(adr,length);break;case 3:length=delete(adr,length);break;case 4:length=add(adr,length); break;case 5:save(adr,length);break;case 6:length=load(adr); break;case 7:display(adr);break;case 8:sort(adr,length);break; /*按姓名排序*/case 9:qseek(adr,length);break; /*快速查找记录*/case 10:copy();break;case 11:exit(0); /*如返回值为11则程序结束*/}}}/*菜单函数,函数返回值为整数,代表所选的菜单项*/menu_select(){ char s[80];int c;printf("按下任意键开始......\n");getch();system("CLS");printf("********************MENU*********************\n\n");printf(" 0. 输入新的项目\n");printf(" \t1. 列出内存中的数据\n");printf(" 2. 按姓名搜索记录\n");printf(" \t3. 删除一条记录\n");printf(" 4. 添加一条记录 \n");printf(" \t5. 保存到文件\n");printf(" 6. 读取文件\n");printf(" \t7. 按记录编号单条显示\n");printf(" 8. 按姓名排序 \n");printf(" \t9. 快速搜索已经排序的记录\n");printf(" 10. 复制文件到新的文件\n");printf(" \t11. 退出\n");printf("***********************************************\n");do{ printf("\n 请选择(0~11):");scanf("%s",s);c=atoi(s);//atio()的作用是把字符转换成整数;}while(c<0||c>11);return c;}/***输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度*/ int enter(ADD_BOOK t[]){ int i,n;char *s;system("cls");printf("\n请问您想输入几条信息? \n");scanf("%d",&n);printf("请输入新的条目 \n");printf("姓名单位电话号码\n");printf("------------------------------------------------\n");for(i=0;i<n;i++){ scanf("%s%s%s",t[i].name,t[i].units,t[i].tele);printf("----------------------------------------------\n");}return n;}/*显示记录,参数为记录数组和记录条数*/void list(ADD_BOOK t[],int n){ int i;system("CLS");printf("\n\n*******************ADD_BOOK******************\n");printf("name unit telephone\n"); printf("------------------------------------------------\n");for(i=0;i<n;i++)printf("%-20s%-30s%-10s\n",t[i].name,t[i].units,t[i].tele);if((i+1)%10==0){ printf("任意键继续\n");getch();}printf("************************end*******************\n");}/*查找记录*/void search(ADD_BOOK t[],int n){ char s[20];int i;system("CLS");printf("输入要查找的姓名\n");scanf("%s",s);i=find(t,n,s);if(i>n-1)printf("没有这个记录\n");elseprint(t[i]);}/*显示指定的一条记录*/void print(ADD_BOOK temp){ system("CLS");printf("\n\n********************************************\n"); printf("姓名单位电话\n"); printf("------------------------------------------------\n"); printf("%-20s%-30s%-10s\n",,temp.units,temp.tele);printf("**********************end***********************\n"); }/*查找函数,参数为记录数组和记录条数以及姓名 */int find(ADD_BOOK t[],int n,char *s){ int i;for(i=0;i<n;i++){if(strcmp(s,t[i].name)==0)return i;}return i;}/*删除函数,参数为记录数组和记录条数*/int delete(ADD_BOOK t[],int n){ char s[20];int ch=0;int i,j;printf("请输入要删除条目的姓名\n");scanf("%s",s);i=find(t,n,s);if(i>n-1)printf("没找到要删除的记录\n");else{ print(t[i]); /*调用自定义的输出函数显示该条记录信息*/printf("确定要删除么?(1/0)\n");scanf("%d",&ch);if(ch==1){for(j=i+1;j<n;j++) //所有记录向前移一位;{ strcpy(t[j-1].name,t[j].name);strcpy(t[j-1].units,t[j].units);strcpy(t[j-1].tele,t[j].tele);}n--;}}return n;}/*插入记录函数,参数为结构体数组和记录数*/int add(ADD_BOOK t[],int n){ ADD_BOOK temp;int i,j;char s[20];printf("请输入记录\n");printf("************************************************\n");printf("name unit telephone\n"); printf("--------------------------------------------------\n");scanf("%s%s%s",,temp.units,temp.tele);printf("------------------------------------------------\n");printf("请输入在哪里插入? \n");scanf("%s",s);i=find(t,n,s); /*调用find,确定插入位置*/for(j=n-1;j>=i;j--){ strcpy(t[j+1].name,t[j].name);strcpy(t[j+1].units,t[j].units);strcpy(t[j+1].tele,t[j].tele);}strcpy(t[i].name,);strcpy(t[i].units,temp.units);strcpy(t[i].tele,temp.tele);n++;return n;}/*保存函数,参数为结构体数组和记录数*/void save(ADD_BOOK t[],int n){ int i;FILE *fp;if((fp=fopen("record.txt","wb"))==NULL){printf("error:can not open file\n");exit(1);}printf("\n保存文件\n");fprintf(fp,"%d",n);fprintf(fp,"\r\n");for(i=0;i<n;i++){ fprintf(fp,"%-20s%-30s%-10s",t[i].name,t[i].units,t[i].tele);fprintf(fp,"\r\n");}fclose(fp);printf("****save success***\n");fflush(stdin);//清空内存}/*读入函数,参数为结构体数组*/int load(ADD_BOOK t[]){ int i,n;FILE *fp;if((fp=fopen("record.txt","rb"))==NULL){printf("error:can not open file\n");exit(1);}fscanf(fp,"%d",&n);for(i=0;i<n;i++)fscanf(fp,"%20s%30s%10s",t[i].name,t[i].units,t[i].tele);fclose(fp);printf("删除成功!!!\n");return n;}/*按序号显示记录函数*/void display(ADD_BOOK t[]){ int id,n;FILE *fp;if((fp=fopen("record.txt","rb"))==NULL){printf("can not open file\n");exit(1);}printf("输入记录编号...\n");scanf("%d",&id);fscanf(fp,"%d",&n); /*从文件读入记录数*/if(id>=0&&id<n){ fseek(fp,(id-1)*sizeof(ADD_BOOK),1); //fseek()是移动文件指针到记录位置print(t[id]);printf("\r\n");}elseprintf("没有第 %d 条记录!!!\n ",id);fclose(fp);}/*排序函数,参数为结构体数组和记录数*/void sort(ADD_BOOK t[],int n){int i,j,flag;ADD_BOOK temp; /*临时变量做交换数据用*/for(i=0;i<n;i++){ flag=0; /*设标志判断是否发生过交换*/for(j=0;j<n-1;j++)if((strcmp(t[j].name,t[j+1].name))>0) /*比较大小*/{flag=1;strcpy(,t[j].name);strcpy(temp.units,t[j].units);strcpy(temp.tele,t[j].tele);strcpy(t[j].name,t[j+1].name);strcpy(t[j].units,t[j+1].units);strcpy(t[j].tele,t[j+1].tele);strcpy(t[j+1].name,);strcpy(t[j+1].units,temp.units);strcpy(t[j+1].tele,temp.tele);}if(flag==0)break; /*如果标志为0,说明没有发生过交换循环结束*/ }printf("排序成功!!!\n");}/*快速查找,参数为结构体数组和记录数*/void qseek(ADD_BOOK t[],int n){ char s[20];int l,r,m;printf("\n认在查找之前,记录是否已排序!\n");printf("输入需要查找的姓名\n");scanf("%s",s);l=0;r=n-1; //折半查找法while(l<=r){ m=(l+r)/2;if(strcmp(t[m].name,s)==0){print(t[m]);return ;}if(strcmp(t[m].name,s)<0) l=m+1;else r=m-1;}if(l>r) printf("not found\n"); //}/*复制文件*/void copy(){ char outfile[20]; /*目标文件名*/int i,n;ADD_BOOK temp[M]; /*临时变量*/FILE *sfp,*tfp;system("CLS");if((sfp=fopen("record.txt","rb"))==NULL){ printf("error:can not open file\n");exit(1);}printf("输入将要输出的文件名称,例如 c:\\f1\\te.txt:\n"); scanf("%s",outfile);if((tfp=fopen(outfile,"wb"))==NULL) /*打开目标文件*/{printf("不能打开文件\n"); /*显示信息*/exit(1);}fscanf(sfp,"%d",&n); /*读出文件记录数*/fprintf(tfp,"%d",n);/*写入目标文件数*/fprintf(tfp,"\r\n"); /*写入换行符*/for(i=0;i<n;i++){ fscanf(sfp,"%20s%30s%10s\n",temp[i].name,temp[i].units, temp[i].tele);fprintf(tfp,"%-20s%-30s%-10s\n",temp[i].name,temp[i].units,temp[i].tele); /*写入记录*/fprintf(tfp,"\r\n"); /*写入换行符*/}fclose(sfp); /*关闭源文件*/fclose(tfp); /*关闭目标文件*/printf("复制成功!!!\n"); /*显示复制成功*/}。
c语言课程设计通讯录

5.设计友好的用户界面,使操作更加便捷。
2、教学内容
本节课在上一阶段的基础上,进一步深化以下教学内容:
1.对结构体数组进行排序,实现通讯录联系人的姓名排序功能;
2.引入链表结构,将通讯录升级为动态存储,提高内存利用率;
3.实现链表在增加、删除节点时的动态调整,确保通讯录数据的准确性;
3.结合教材中的文件操作知识,编写函数实现通讯录数据的导入和导出功能,以便于数据的备份和迁移;
4.讨论如何优化程序性能,例如通过索引、二分查找等方法提高通讯录的查询效率;
5.强调代码规范和注释的重要性,指导学生编写整洁、易于理解的C语言代码,为后续的学习和协作打下基础。
4、教学内容
在第四部分的教学内容中,我们将重点关注以下方面:
1.结合实际应用场景,引入内存分配与释放的概念,讲解动态内存管理的重要性,并在通讯录项目中正确使用malloc和free函数;
2.通过案例展示内存泄漏和野指针的问题,教育学生注意避免这些常见的编程错误;
3.引导学生设计测试用例,对通讯录程序进行单元测试和集成测试,确保程序稳定性和正确性;
4.讨论程序异常处理的重要性,教授学生如何使用try-catch机制来处理程序中可能出现的错误;
c语言课程设计通讯录
一、教学内容
本节课为九年级下学期《C语言》课程设计示范课,基于教材第七章“数组与字符串”和第十章“文件操作”的内容,开展“C语言课程设计通讯录”项目实践。教学内容主要包括:
1.使用一维数组存储通讯录中的联系人姓名;
2.使用结构体数组存储联系人的详细信息(如姓名、电话、邮箱等);
3.实现通讯录的增加、删除、查找、修改和显示等功能;
c语言课程设计通讯录

c语言课程设计通讯录一、课程目标知识目标:1. 理解并掌握C语言中的结构体概念,能够运用结构体创建复杂数据类型;2. 学会使用数组存储结构体数据,实现结构体数组的操作;3. 掌握文件操作的基本方法,实现对通讯录数据的读写和存储。
技能目标:1. 能够编写C程序,设计并实现一个基本的通讯录管理系统;2. 能够运用选择、循环等基本控制结构实现对通讯录的有效管理;3. 能够对程序进行调试和优化,提高代码的执行效率。
情感态度价值观目标:1. 培养学生的编程兴趣,激发他们主动探索问题的积极性;2. 培养学生团队协作意识,提高沟通与协作能力;3. 引导学生认识到编程在生活中的实际应用,增强学以致用的意识。
课程性质分析:本课程为C语言课程设计,旨在通过设计一个通讯录管理系统,让学生将所学C语言知识应用于实际项目中,提高编程实践能力。
学生特点分析:学生已具备基本的C语言知识,熟悉语法和基本控制结构,但可能缺乏实际项目经验,对复杂数据类型和文件操作尚需加强。
教学要求:1. 注重理论与实践相结合,引导学生通过实际操作掌握知识;2. 鼓励学生相互讨论、协作,培养解决问题和团队协作能力;3. 强化代码规范,提高代码质量和可读性。
二、教学内容1. 结构体和结构体数组:- 介绍结构体的定义和使用;- 通过通讯录管理系统的需求,设计联系人结构体;- 引导学生运用结构体数组存储和管理联系人信息。
2. 文件操作:- 讲解文件的基本概念和文件操作函数;- 结合通讯录管理系统,实现数据的读写和存储。
3. 通讯录功能实现:- 添加联系人:实现输入、存储联系人信息的功能;- 删除联系人:实现根据条件删除指定联系人的功能;- 查找联系人:实现根据关键字查找联系人的功能;- 显示所有联系人:实现显示通讯录中所有联系人的功能。
4. 程序调试与优化:- 分析程序可能出现的错误和异常;- 引导学生掌握调试方法,优化代码执行效率。
教材章节关联:本教学内容与教材中关于结构体、数组、文件操作等章节密切相关。
c语言编写的通讯录代码、

#include<stdio.h>#include<string.h>struct friends_list{char name[10];int age;char telephone[13];};int Count=0;void new_friend(struct friends_list friends[]);void search_friend(struct friends_list friends[],char*name);void Modify_friend(struct friends_list friends[],char*name);void Delete_friend(struct friends_list friends[],char*name,int n);int main(void){int choice,n;char name[10];struct friends_list friends[50];do{printf("手机通讯录功能选项: 1:新建2:查询3:修改4:删除0:退出\n"); printf("请选择功能:");scanf("%d",&choice);switch(choice){case 1:new_friend(friends);break;case 2:printf("请输入要查找的联系人姓名:");scanf("%s",name);search_friend(friends,name);break;case 3:printf("请输入您要修改的联系人的姓名:");scanf("%s",name);printf("\n");Modify_friend(friends,name);break;case 4:printf("1:单个删除2:全部删除\n\n");printf("请选择您需要的操作:\n");scanf("%d",&n);if(n==1){printf("输入名字\n");scanf("%s",name);Delete_friend(friends,name,n);break;}if(n==2){Delete_friend(friends,name,n);break;}case 0: break;}}while(choice!=0);printf("谢谢使用通讯录功能!\n");return 0;}void new_friend(struct friends_list friends[ ]){struct friends_list f;if(Count==50){printf("通讯录已满!\n");return;}printf("请输入新的联系人的姓名:");scanf("%s",);printf("请输入新联系人的年龄:");scanf("%d",&f.age);printf("请输入新联系人的联系电话:");scanf("%s",f.telephone);friends[Count] = f;Count++;}/*查询联系人*/void search_friend(struct friends_list friends[],char*name){int i,flag=0;if(Count==0){printf("通讯录是空的!\n");return;}/*在书本源代码的基础上,我修改了一下,让程序可以查询多个相同名字的联系人*/ for(i=0;i<Count;i++)if(strcmp(name,friends[i].name)==0){printf("姓名:%s\t",friends[i].name);printf("年龄:%d\t",friends[i].age);printf("电话:%s\n",friends[i].telephone);flag++;}if(flag==0)printf("无此联系人!\n");}/*修改联系人*/void Modify_friend(struct friends_list friends[],char*name){int k,y=0;int t,j=1,g=0;struct friends_list x;if(Count==0){printf("通讯录是空的!\n");return;}/*首先,判断要修改的联系人中有没有相同的名字*/for(k=0;k<Count;k++){if(strcmp(name,friends[k].name)==0)y++;}/*如果,y等于1,说明只有一个需要修改的联系人*/if(y==1){for(k=0;k<Count;k++){if(strcmp(name,friends[k].name)==0){printf("请重新输入姓名\n");scanf("%s",);printf("请重新输入年龄\n");scanf("%d",&x.age);printf("请重新输入电话号码\n");scanf("%s",x.telephone);friends[k]=x;}}}/*如果,y大于1,说明你选择修改的人中,有多个相同名字的联系人*/ if(y>1){/*用序号来显示所有需要修改的联系人*/printf("此通讯录有%d个名字相同的联系人.\n",y);for(k=0;k<Count;k++){if(strcmp(name,friends[k].name)==0){printf("%d:姓名:%-10s",j,friends[k].name);printf("年龄:%-5d",friends[k].age);printf("电话:%13s\n",friends[k].telephone);j++;}}/*选择需要修改的联系人的序号*/printf("请选择所要修改的联系人序号:\n");scanf("%d",&t);for(k=0;k<Count;k++){if(strcmp(name,friends[k].name)==0){g++;if(g==t){/*如果g等于t,说明在序号中找到了需要修改的人*/ printf("请重新输入姓名\n");scanf("%s",);printf("请重新输入年龄\n");scanf("%d",&x.age);printf("请重新输入电话号码\n");scanf("%s",x.telephone);friends[k]=x;}}}}if(y==0)printf("无此联系人\n");}void Delete_friend(struct friends_list friends[],char*name,int n) {int l,h=0,y=0,i,k;int j=1;int a[50],t,g=0;if(Count==0){printf("通讯录是空的!\n");return;}/*如果,n等于1,说明用户选择单个删除*/if(n==1){/*首先,判断在修改的人当中有没有相同名字的*/for(i=0;i<Count;i++){if(strcmp(name,friends[i].name)==0)y++;}/*如果,y等于1,说明你需要修改的人当中只有一个*/if(y==1){for(l=0;l<Count;l++){if(strcmp(name,friends[l].name)==0){do{friends[l]=friends[l+1];l++;}while(l<Count);h++;Count--;printf("删除成功!\n");}}}/*如果,y>1 说明你要修改的人当中有多个相同的名字*/if(y>1){/*用序号来显示所有需要修改的联系人*/printf("有%d个相同的联系人:\n",y);for(l=0;l<Count;l++){if(strcmp(name,friends[l].name)==0){a[l]=l;printf("%d:姓名:%-10s",j,friends[l].name);printf("年龄:%-5d",friends[l].age);printf("电话:%13s\n",friends[l].telephone);j++;h++;}}/*选择需要修改的联系人序号*/printf("请选择所要删除的联系人序号:\n");scanf("%d",&t);for(k=0;k<Count;k++)if(strcmp(name,friends[k].name)==0){g++;if(g==t){/*如果g等于选择的序号t,就开始删除*/do{friends[k]=friends[k+1];k++;}while(k<Count);}if(g==t){/*这里又使用一个g等于t,表面上看是多余的.其实当在选择的序号超出现有的序号时,起到限制作用*/printf("删除成功!\n");Count--;}}}if(h==0)printf("没有此联系人\n");}/*如果n等于2,说明用户选择了全部删除*/if(n==2){Count=0;/*把Count赋0,也就是清空所有联系人*/printf("已全部删除!\n");} }。
C语言编程-通讯录

C语言编程-通讯录#include<string.h> /*字符函数和字符串函数*/#include<conio.h> /*字符模式函数(调用getch()函数)*/#include<stdio.h> /*输入输出函数*/ int i;struct friend /*电子通讯录结构定义*/{char num[5]; /*编号*/char name[11]; /*名字*/char sex[2]; /*性别*/char phone[12]; /*电话*/char address[26]; /*地址*/char post_num[11]; /*邮编*/}friends[50];FILE *fp;void Data_load() /*数据载入函数*/{ int j;fp=fopen("friend.txt","r+"); /*打开文件friend.txt*/if(fp==NULL) /*判断是否存在friend.txt,如果不存在则创建*/ { fp=fopen("friend.txt","w");i=0;}else{ for(i=0;i<50;i++){ j=fgetc(fp);if(j==EOF)/*判断是否到了文件尾*/return;fseek(fp,i*sizeof(struct friend),0);fread(&friends[i],sizeof(struct friend),1,fp); /*从文件中读取一条记录*/}}}void Menu_Select() /*显示菜单界面*/{printf(" \n");printf(" \n");printf(" \n");printf(" Address Book Management System \n");printf(" \n");printf(" ======================\n"); printf(" 1.Address book data Entry\n"); /*数据输入*/printf(" 2.Address Book data Show\n"); /*数据显示*/printf(" 3.Address Book data Search\n"); /*数据查找*/printf(" 4.Address Book data Alter\n"); /*数据修改*/printf(" 5.Address Book data Insert\n"); /*数据插入*/printf(" 6.Address Book data Delete\n");/*数据删除*/printf(" 7.Address Book data Save\n"); /*数据保存*/printf(" 0.Exit\n"); /*退出*/printf(" ======================\n"); printf( " Please chioce 0-7 \n\n");}int Data_check(int k,char ID[5]) /*检查通讯录中是否存在相同ID或ID输入格式错误*/{int j;if(ID[0]=='0')k=1;for(j=0;ID[j]!='\0';j++){if(ID[j]>'9'||ID[j]<'0')k++;}for(j=0;j<i+1;j++){if(strcmp(ID,friends[j].num)==0)k++;}return k;}void Data_Input() /*数据输入函数*/{char yes_no='1';char ID[5];int k=0;if(i>=50)printf("\n\n Storage full!\n\n");if(i<50){printf("***************************************** *******************************\n");printf(" ******************* Add Address Book Information ***********************\n");printf("***************************************** *******************************\n");printf("***************************************** *******************************\n");}for(;i<50;i++){do{switch(yes_no){case '1': /*如果输入为'1',则进行数据输入*/printf(" ****** No.(4) Name(10) Sex(M/F) Phone(11) Address(25) Zip_Code(10)*******\n");scanf("%s%s%s%s%s%s",ID,friends[i].name,f riends[i].sex,friends[i].phone,friends[i].address,f riends[i].post_num);Data_check(k,ID);while(Data_check(k,ID)>0) /*检查输入的ID是否已存在,如果存在重新输入*/{printf("The No. already exists Or The No. isn't correct, please re-enter\n");scanf("%s",ID);Data_check(k,ID);}strcpy(friends[i].num,ID);if(i<49){printf("\n\n Whether to be continue? Y(1)/N(0) \n\n");yes_no=getch();}if(i>=49)printf("\n\nStorage full!\n\n");break;case '0':break;default:yes_no=getch();}}while(yes_no!='1'&&yes_no!='0'); /*如果输入的不是'1'或'0'则重新输入*/if(yes_no=='0')/*如果输入'0'则退出输入函数*/{i++;break;}}}int The_Size(char a[],char b[]) /*比较两个ID的大小*/{int j,t;if((j=strlen(a)-strlen(b))>0) t=1;if((j=strlen(a)-strlen(b))<0) t=-1;if((j=strlen(a)-strlen(b))==0){if(strcmp(a,b)>0) t=1;if(strcmp(a,b)<0) t=-1;if(strcmp(a,b)==0) t=0;}return t;}void Data_Show() /*数据输出函数*/{ int j,k;char m;struct friend t;printf("***************************************** ***************************\n");printf(" No. Name Sex Phone Address Zip_Code \n");printf("***************************************** ***************************\n");for(j=0;j<i-1;j++)/*对数据进行排序*/{ for(k=0;k<i-1-j;k++){if(The_Size(friends[k].num,friends[k+1].num)= =1){t=friends[k];friends[k]=friends[k+1];friends[k+1]=t;}}}for(j=0;j<i;j++)/*数据输出*/{printf("%4s %10s %4s %11s %20s %10s\n",fri ends[j].num,friends[j].name,friends[j].sex,friend s[j].phone,friends[j].address,friends[j].post_num );m=getch();if(m==' ')break;}printf("\n\n There are %d data in the book .\n\n",i);}void Data_Search() /*数据查找函数*/{char k;int j,a,b;char ID[5];char NAME[11];printf("Search by No. : 1\n");printf("Search by name : 2\n");k=getch();switch(k){case '1': /*按ID查找*/a=0;printf("\n\n Please enter the No.\n\n");scanf("%s",ID);for(j=0;j<i+1;j++){if(strcmp(ID,friends[j].num)==0){a++;printf(" No. Name Sex Phone Address Zip_Code \n");printf("%4s %10s %4s %11s %20s %10s\n",fri ends[j].num,friends[j].name,friends[j].sex,friend s[j].phone,friends[j].address,friends[j].post_num );}}if(a==0)printf(" Do not have to find the No.!\n\n");break;case '2': /*按姓名查找*/b=0;printf("\n\n Please enter the Name\n\n");scanf("%s",NAME);for(j=0;j<i+1;j++){if(strcmp(NAME,friends[j].name)==0){b++;printf(" No. Name Sex Phone Address Zip_Code \n");printf("%4s %10s %4s %11s %20s %10s\n",fri ends[j].num,friends[j].name,friends[j].sex,friend s[j].phone,friends[j].address,friends[j].post_num );}}if(b==0)printf(" Do not have to find the Name!\n\n");break;default:printf("\n\n Error!\n");break;}}void Data_Insert() /*数据插入函数*/{ if(i>=50)printf("\n\n Storage full!\n\n");if(i<50){char ID[5];int k=0;printf("Please enter the No. that you want to insert.\n");scanf("%s",ID);Data_check(k,ID);printf("%d",Data_check(k,ID)); /*检查所需插入的ID是否已存在,如果存在重新输入*/while(Data_check(k,ID)>0){printf("The No. already exists Or The No. isn't correct, please re-enter\n");scanf("%s",ID);Data_check(k,ID);}strcpy(friends[i].num,ID);/*插入数据*/printf(" ****** Name(10) Sex(M/F) Phone(11) Address(30) Zip_Code(10)*******\n");scanf("%s%s%s%s%s",friends[i].name,friends [i].sex,friends[i].phone,friends[i].address,friends [i].post_num);i++;}}void Data_Delete() /*数据删除函数*/{int k,t=0;char ID[5];printf("\n\n Please enter the No. need to be deleted\n\n");scanf("%s",ID);for(k=0;k<i;k++){if(strcmp(friends[k].num,ID)==0){t++;break;}}if(t==0)printf("\n\n The No. does not Exist!\n\n");if(t>0){for(;k<i;k++)/*删除位置前的元素顺序前移*/{friends[k]=friends[k+1];}printf("\n\n Delete success!\n\n");i=i-1;}}void Data_Alter() /*修改函数*/{int k,t=0;char ID[5];printf("\n\n Please enter the No. to be Amended\n\n");scanf("%s",ID);for(k=0;k<i;k++){if(strcmp(friends[k].num,ID)==0){t++;break;}}if(t==0)printf("\n\n The No. does not Exist!\n\n");if(t>0){strcpy(friends[k].num,ID);printf(" ****** Name(10) Sex(M/F) Phone(11) Address(30) Zip_Code(10)*******\n");scanf("%s%s%s%s%s",friends[k].name,friend s[k].sex,friends[k].phone,friends[k].address,frie nds[k].post_num);printf("\n\n Alter Success!\n\n");}}void Data_Save() /*数据保存函数*/{int j;fp=fopen("friend.txt","w");for(j=0;j<=i-1;j++){fwrite(&friends[j],sizeof(struct friend),1,fp);}printf("\n\n Save Success!\n\n");}void Exit() /*退出函数*/{char flag;printf(" Save or Not? (Y/N)\n"); /*判断是否保存*/do{flag=getch();switch(flag){case 'Y': /*保存*/Data_Save();break;case 'y': /*保存*/Data_Save();break;case 'N':break;case 'n':break;}}while(flag!='Y'&&flag!='y'&&flag!=' N'&&flag!='n');}void main(){ char choose,yes_no;Data_load();do{Menu_Select();choose=getch();switch(choose){case '1': Data_Input(); break; /*输入*/case '2': Data_Show(); break; /*显示*/case '3': Data_Search(); break; /*查找*/case '4': Data_Alter(); break; /*修改*/case '5': Data_Insert(); break; /*插入*/case '6': Data_Delete(); break; /*删除*/case '7': Data_Save(); break; /*保存*/case '0': Exit(); break; /*退出*/default : printf(" Error!\n");}if(choose=='0')break;printf(" Would you like to be continue? (Y/N)\n");do{yes_no=getch();}while(yes_no!='Y'&&yes_no!='y'&&yes _no!='N'&&yes_no!='n');if(yes_no=='N'||yes_no=='n'){Exit();break;}}while(yes_no!='Y'||yes_no!='y');。
c语言课程设计通讯录

c语言课程设计通讯录好的,我可以帮助您设计一个简单的通讯录程序。
下面是一个示例代码,实现了通讯录的基本功能,包括添加联系人、显示联系人列表、查找联系人、删除联系人和修改联系人信息。
c复制代码:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_CONTACTS 100 // 通讯录最大容量// 定义联系人结构体typedef struct {char name[20]; // 姓名char phone[15]; // 电话号码char email[30]; // 邮箱地址} Contact;// 定义通讯录结构体typedef struct {Contact contacts[MAX_CONTACTS]; // 联系人数组int size; // 当前联系人数量} AddressBook;// 添加联系人void add_contact(AddressBook *book) {if (book->size >= MAX_CONTACTS) {printf("通讯录已满,无法添加联系人。
\n"); return;}printf("请输入联系人姓名:");scanf("%s", book->contacts[book->size].name); printf("请输入联系人电话号码:");scanf("%s", book->contacts[book->size].phone); printf("请输入联系人邮箱地址:");scanf("%s", book->contacts[book->size].email); book->size++;printf("联系人已添加。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言程序设计课程设计报告题目: 通讯录课程设计报告书一、设计目的:灵活使用C语言进行程序编写,巩固有关语句,指针,结构体,链表,文件操作等概念和方法。
提高调试程序的技能,提高软件编写的能力。
二、总体设计:三、详细设计1、编写菜单界面程序,并用Switch 语句实现菜单的选择,通过函数调用实现菜单跳转。
2、编写菜单中调用的各个函数,思路如下:(1)、add _record (添加记录)程序会提示用户输入增加的姓名和号码,并且输入一组数据后,会提示用户是否继续输入数据,如选择否,就会显示记录,自动返回二级菜单(如流程图(1))。
流程图(2)流程图(1)(2)、find_record (查找记录)程序会提示用户输入要查找的姓名,并输出该人的姓名和电话号码,如果查找不到会自动提示没有该人的姓名记录,并自动返回二级菜单(如流程图2)。
(3)、change_record(修改记录)程序会提示用户输入要修改的姓名,并要求输入该人新的姓名和电话号码,如果查找不到会自动提示没有该人的姓名记录,如果修改成功就输出新的记录。
(4)、delete_ record(删除记录)程序会提示用户输入要删除的姓名,如果没有该人会自动提示没有该人的姓名记录,否则就会删除该记录,输出删除后的记录并返回二级菜。
(6)、sort -record(记录排序)程序自动将姓名按字母顺序排列并输出并返回二级菜。
(流程图3)(7) load(读取已有的记录)程序会自动打开已保存的文件记录,以便用户进行修改、删除等。
(8)display(显示链表)此函数经过调用会显示链表中的记录,以便用户查看。
四、调试与测试调试过程中,遇到了很多的问题,如排序问题、用fopen函数打开原有记录会出现一大堆乱码等。
不过,经过和同学们讨论却从中受到了很好的启示,并能更好地解决问题和复习了C语言程序设计。
五、源程序清单和执行结果#include<stdio.h>#include<stdlib.h>#include<malloc.h>#include<string.h>#define NULL 0#define LEN sizeof(struct address)typedef struct address//通讯录中记录的结构//{char name[18];char tel[20];struct address *next;}ADDR;int menu2(); //函数的声明//int menu(); //对menu 函数的声明//int menu1();//对menu1函数的声明//void display(ADDR *head)//定义显示连表display函数//{ADDR *p=head;printf("\nThese records are:\n");if(head!=NULL)do{printf("\n name:%s\t\t,tel:%s\r\n",p->name,p->tel);//输出名字和电话号码//p=p->next;}while(p!=NULL);else printf("These file is empty");//提醒连表为空//putchar('\n');}ADDR* add(ADDR* head,ADDR* per)//定义添加记录add函数,此函数不开辟{新的空间,只在原有基础增加//ADDR *p;if(head==NULL){return per;}else{p=head;while(p->next!=NULL) p=p->next;p->next=per;return head;//返回头指针//}}ADDR* add_record(ADDR *head)//定义添加记录add_record函数,此函数可开{ADDR *p1=head,*p2=head;辟新的空间//if(p1==NULL){head=(ADDR*)malloc(LEN);//开辟空间//p1=head;}else{do{p2=p1;p1=p1->next;}while(p1!=NULL);p2->next=(ADDR*)malloc(LEN);p1=p2->next;}printf("\nname:");scanf("%s",p1->name);//添加姓名//printf("\ntel:");scanf("%s",p1->tel);//添加电话号码//p1->next=NULL;display(head);//凋用display函数,显示当前连表//putchar('\n');return(head);}ADDR* delete_record(ADDR* head)//定义删除函数delete_record//{ADDR *per,*p1=head,*p2=head;if (head==NULL) puts("This link has no record!!!\n");//提醒连表为空//else{puts("please input the delete name:\n");scanf("%s",per->name);//输入要删除的名字//while (strcmp(per->name,p1->name)!=0&&p1->next!=NULL){p2=p1;p1=p1->next;}if (strcmp(per->name,p1->name)==0){if(p1==head) head=p1->next;else p2->next=p1->next;printf("delete:%s\n\n",per->name);display(head);//显示删除后的连表//}else printf("%s can not find\n\n",per->name);//提醒没有要删除的人//}return (head);}void find_record(ADDR*head)//定义查询记录函数find_record//{ADDR *p;char s[18];printf("please input the find name:");scanf("%s",s);p=head;do{if(strcmp(s,p->name)==0){printf("\nname:%s,tel:%s\n",p->name,p->tel);//输出所查找的人的名字和电话/break;}p=p->next;}while(p!=NULL);if(p==NULL) printf("\ncannot find the people!");//提醒找不到//}ADDR* load()//定义读入函数load//{FILE* fp;ADDR* head=NULL;ADDR* per=NULL;char filename[30]={"E:\\jim.txt"};if((fp=fopen(filename,"rb"))==NULL){printf("can not open the file\n");exit(0);//提醒不可以打开文件//}while(!feof(fp)){per=(ADDR*)malloc(LEN);fscanf(fp,"%s\t\t%s\r\n",per->name,per->tel);per->next=NULL;head=add(head,per);//跳到添加函数add//}display(head);//显示连表//fclose(fp);return head;}ADDR* sort(ADDR* head)//定义排序函数sort//{ADDR *p1=head,*p2,p;if(head==NULL) printf("the file is empty!\n");for(;p1!=NULL;p1=p1->next)for(p2=p1;p2!=NULL;p2=p2->next){if(strcmp(p1->name,p2->name)>0){strcpy(,p1->name);strcpy(p1->name,p2->name);strcpy(p2->name,);strcpy(p.tel,p1->tel);strcpy(p1->tel,p2->tel);strcpy(p2->tel,p.tel);}}display(head);//显示连表//return head;}int menu_change() //定义选择修改项函数//{char s;int cn;printf("1. Change the name\n");printf("2. Change the tel\n");printf("3. Change the name and tel\n");printf("Input 1-3:");do{s=getchar();cn=(int)s-48;}while(cn<0||cn>3);return cn;}ADDR* change_record(ADDR* head)//定义修改函数change_record//{ADDR *p=head;char s[18];if(head==NULL) printf("is empty!");//连表为空//else{printf("please input the change name:");//提醒输入要改变的名字//scanf("%s",s);do{if(strcmp(s,p->name)==0){printf("\nname:%s,tel:%s\n",p->name,p->tel);switch(menu_change()){case 1:printf("please input the new name:");scanf("%s",p->name);break;case 2:printf("please input the new tel:");scanf("%s",p->tel);break;case 3:printf("please input the new name:");scanf("%s",p->name);printf("please input the new tel:");scanf("%s",p->tel);break;default:printf("error,try again\n");//提醒输入错误//}display(head);break;//显示修改后的连表//}p=p->next;}while(p!=NULL);if(p==NULL) printf("can not find the people\n");}return (head);}void save1(ADDR* head,char* filename)//定义保存函数savel//{FILE* fp;ADDR* p=head;if((fp=fopen(filename,"wb"))==NULL){printf("cannot open file\n");return;}fprintf(fp,"name\t\ttel\r\n");while(p!=NULL){fprintf(fp,"%s\t\t,%s\r\n",p->name,p->tel);p=p->next;}fclose(fp);}void save2(ADDR* head)//定义保存函数save2//{FILE* fp;ADDR* p=head;if((fp=fopen("E:\\jim.txt","wb"))==NULL){printf("cannot open file\n");return;//提醒打不开文件//}while(p!=NULL){fprintf(fp,"%s\t\t,%s\r\n",p->name,p->tel);p=p->next;}fclose(fp);}void clear(ADDR* head)//定义释放空间函数//{ADDR* p=head;while(p!=NULL){head=head->next;free(p);p=head;}}int second_menu1()//二级菜单second_menu1//{FILE *fp;int i;ADDR* head=NULL;char filename[30];printf("please input the filename:\n");//输入文件名和路径//scanf("%s",filename);if((fp=fopen(filename,"wb+"))==NULL){printf("cannot open the file\n");exit(0);}fclose(fp);for(;;){switch(menu1()){case 1:printf("add_record\n");head=add_record(head);//跳到添加函数//break;case 2:printf("find_record\n");find_record(head);//跳到查询记录函数//break;case 3:printf("change_record\n");head=change_record(head);//跳到修改函数//break;case 4:printf("delete_record\n");head=delete_record(head); //跳到删除记录函数//break;case 5:printf("sort\n");head=sort(head);//跳到排序函数//break;case 6:printf("save1\n");printf("If save the link?\n");//询问是否保存数据//puts("1.Yes 0.No\nplease selete 1or0");scanf("%d",&i);if(i){save1(head,filename);printf("<<<success save>>>\n");//提醒保存成功//}else printf("Had not save yet!");//警告还没有保存数据//break;case 7:printf("go back to the first menu\n");clear(head);menu();exit(0);default: printf("error!try again\n");}}}int menu1()//定义二级菜单选择函数//{char s;int cn;printf("1.add_record\n");printf("2.find_record\n");printf("3.change_record\n");printf("4.delete_record\n");printf("5.sort\n");printf("6.save1\n");printf("7.go back to the first menu\n");printf("Input 1-7:");do{s=getchar();cn=(int)s-48;}while(cn<0||cn>7);return cn;}int second_menu2()//二级菜单second_menu2//{ADDR* head;char filename[30];int i;head=load();for(;;){switch(menu2()){case 1:printf("add_record\n");head=add_record(head);//跳到添加记录//break;case 2:printf("find_record\n");find_record(head);//跳到查询记录//break;case 3:printf("change_record\n");head=change_record(head);//跳到修改记录//break;case 4:printf("delete_record\n");head=delete_record(head)//跳到删除记录//break;case 5:printf("sort\n");head=sort(head);//跳到排序函数//break;case 6:printf("save2\n");printf("If save the record?\n");//提醒是否保存//printf("1.Yes 0.No\nselete 1or0\n");scanf("%s",&i);if(i){save2(head);printf("<<<sucess save>>>\n");//提醒已保存成功//}else printf("Had not save yet!");//警告还没有保存//break;case 7:printf("go back to the first menu");//返回一级菜单//clear(head);menu();exit(0);default: printf(":error!try again\n");}}}int menu2()//定义二级菜单选择函数//{char s;int cn;printf("1.add_record\n");printf("2.find_record\n");printf("3.change_record\n");printf("4.delete_record\n");printf("5.sort\n");printf("6.save2\n");printf("7.go back to the first menu\n");printf("Input 1-7:");do{s=getchar();cn=(int)s-48;}while(cn<0||cn>7);return cn;}int menu()//定义一级菜单选择函数//{char s;int cn;printf("1. Build a new file\n");printf("2. Open the file\n");printf("3. Quit the file\n");printf("Input 1-3:");do{s=getchar();cn=(int)s-48;}while(cn<0||cn>3);return cn;}void main()//主函数//{for(;;){switch( menu()) {case 1:printf("Build a new file\n");second_menu1();//调用二级菜单//break;case 2:printf("Open the file\n");second_menu2();//调用二级菜单//break;case 3:printf("Quit the file\n");exit(0);default: printf("error!try again\n");}}}附带电子板:。