《高级语言课程设计》
题 目: 班 级: 学生学号: 学生姓名: 指导老师: 提交时间: 成 绩:
通讯录程序
12级软工3班
201230690311
李崇辉
肖磊
2011年4月15日
华南农业大学 信息学院
2.2考核方式
本次课程设计采用2种方式结合的方式: (1)评阅课程报告
(2)程序运行演示和回答问题
注意:如有发现抄袭现象,记为0分,下年重修。
成绩评定方法
每名同学提交最终课程设计报告后,按照安排的时间到实验室向指导老师演示程序并回答老师提出的问题,老师根据实际情况从如下6个方面给出成绩。
评分项目 分数 小组总成绩:
功能是否满足要求(50分) 界面是否美观(10分) 所学知识在设计中的运用是否得当(10分) 对效率要求较高的部分是否有更深的思考与设计(10分) 答辩陈述是否清楚(10分) 答辩陈述是否完整(10分)
题目2:通讯录程序
1、题目描述
设计一个通讯录程序,该程序具有以下功能:
(1) 用户登录:输入用户名和密码,密码正确才允许登录。 (2)录入通讯信息;
(3)给定人名,修改该人的通讯信息; (4)给定人名,删除该人的通讯信息;
(5)根据输入的人名或姓,显示查找到的相应通讯信息; (6)根据输入的分类,显示该分类的所有人的通讯信息;
2
(7)统计功能:统计各分类的人数。 2、题目要求
(1)按照分析、设计、编码、调试和测试过程完成应用程序; (2)学习并使用流程图等工具,并在撰写报告中使用;
(3)程序的各项功能在程序运行时,以菜单方式选择并执行;
(4)要求用户输入数据时,要给出清晰、明确的提示,包括:输入数据的内容、格式及结束方式等 (5)所有的信息存储在一个文件或多个中,并实现文件读写操作。 (6)程序中用链表存放通讯信息并实现增删减功能。 3、提示
(1)报告信息可以设计一个结构体类型
(2)自己构思并增加的除规定功能之外的新功能,酌情加分。 关键要求:
一、联系人信息应该至少包括如下信息
联系人类别、姓名、电话、电子邮件、QQ号、通信地址
二、存储文件
1. 登录用户文件,格式为二进制文件,文件名:user.dat。 登录用户在其中存放2个数据信息:登录用户名、登录密码。 2. 联系人类别文件:格式为文本文件,文件名:catalog.dat 每行一个类别名称,如:同学、家人、同事等
3. 通讯录文件,格式为二进制文件,文件名:contact.dat
其中以结构体形式存放联系人信息,每个结构体代表一个联系人
三、细节要求:
输入“联系人类别”时,不能随意输入字符串,程序必须给联系人类别文件中目前已经有的类别,让用户从中选择。
退出通讯录 打开通讯用户注册(首次登录) 输入正确用户和密码后登进入类别界面 进入操作界面 添加显示删除查询修改保存 3
4
源程序: #include \#include \#include \#include \
#define LEN sizeof(struct student) #define ERROR 0 #define OK 1 #define ElemType int #include
int class1;
char name[10]; //姓名 char tel[15]; //电话 char age[8]; //年龄 char adds[20]; //地址 char qq[20]; //QQ号
} dat[1000]; struct student
5
{
char username[20]; char password[10]; }su,*psu,*psu1; struct Data1 {
struct Data data; struct Data1 *next; } *p,*p1,*p2; int n,i,j; char Key[20]; char c; FILE *fp;
char usr[20],usr1[30],pwd[10]; struct LNode {
char clas[20]; int length; struct Data1 *next; }a[10];
/*主菜单*/
int meauselect(int ads); int input(struct Data dat[],int n); void print1(struct Data dat[],int n); void delete11(struct LNode a[],int n); void onedelete1(struct LNode a[],int n); void alldelete1(struct DLNode a[],int n); void Find(struct LNode a[],int n); void Readfile(); void Save();
void namefind(struct LNode a[],int n); void telfina(struct LNode a[],int n); void addsfind(struct LNode a[],int n); void Change(struct LNode a[],int n); void namechange(struct LNode a[],int n); void telchange(struct LNode a[],int n); void addschange(struct LNode a[],int n); void main1(int ads);
6
int encrypt(char *pwd);/*加密算法*/
int checkUerValid(struct student *psu);/*校验用户合法性*/ int classselect(); void openclass();
int input1(struct LNode a[],int n); void print11(struct LNode a[],int n); int classselect() { do {
printf(\家人亲戚\\n\ printf(\朋友\\n\ printf(\同学\\n\ printf(\同事\\n\ printf(\陌生人\\n\ printf(\其他\\n\ printf(\退出程序\\n\ printf(\请您选择(0-6):\ scanf(\ if(c<'0'||c>'6')
printf(\输入错误!请重新输入:\\n\ }
while(c<'0'||c>'6'); return (c-'0'); } int main() { int ads; Readfile(); while(1) {
switch(ads=classselect()) {
case 1:system(\ case 2:system(\ case 3:system(\ case 4:system(\ case 5:system(\ case 6:system(\ case 0:system(\
7
default:ads=classselect(); } }}
//单类函数 void main1(int ads) { int i=1; while(i) {
switch(meauselect(ads)) {
case 1:system(\添加名片到通讯录\\n\ case 2:system(\显示所有名片\\n\ case 3:system(\从通讯录中删除名片\\n\ case 4:system(\在通讯录中查找名片\\n\ case 5:system(\修改通讯录中的名片\\n\ case 6:system(\文件保存成功!\\n\ case 0:system(\返回分类表!\\n\ default:meauselect(ads); } } }
int meauselect(int ads) { do {
printf(\欢迎,您的%s通讯录中共有%d张名片\\n\ printf(\添加名片\\n\ printf(\显示名片\\n\ printf(\删除名片\\n\ printf(\查询名片\\n\ printf(\修改名片\\n\ printf(\保存名片\\n\ printf(\返回分类表\\n\ printf(\请您选择(0-6):\ scanf(\ if(c<'0'||c>'6')
printf(\输入错误!请重新输入:\\n\ }
8
while(c<'0'||c>'6'); return (c-'0'); }
/*添加新联系人*/
int input1(struct LNode a[],int n) {
char s[10]; char ch,m;
while(ch!='n'&&ch!='N') {
p1=a[n].next;
printf(\添加新联系人\\n\ printf(\姓名:\
p=(struct Data1*)malloc(sizeof(struct Data1));
p->next=NULL; scanf(\ if(p1!=NULL) {
while((strcmp(p1->data.name,s)!=0)&&p1->next!=NULL)
p1=p1->next; if(strcmp(p1->data.name,s) == 0) {
printf(\通讯录中已有此人!\\n\ printf(\是否继续添加?(Y/N)\ scanf(\
while(m!='n'&&m!='N'&&m!='y'&&m!='Y') {
printf(\输入错误!请重新输入:\ scanf(\ }
if(m!='n'&&m!='N') {
input1(a,n); } return 0; }
if(p1->next==NULL) {
printf(\电话:\
9
scanf(\ printf(\电子邮件:\ scanf(\ printf(\地址:\
scanf(\ printf(\号:\ scanf(\ strcpy(p->data.name,s); printf(\类别:%d\ p->data.class1=n; p1->next=p; a[n].length++; }}
else{printf(\电话:\ scanf(\ printf(\电子邮件:\ scanf(\ printf(\地址:\
scanf(\ printf(\号:\ scanf(\ strcpy(p->data.name,s); printf(\类别:%d\ p->data.class1=n; a[n].next=p; a[n].length++;}
printf(\是否继续添加?(Y/N)\ scanf(\
while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y') {
printf(\输入错误!请重新输入:\ scanf(\ } }
printf(\添加成功!\\n\
printf(\按任意键返回主菜单:\ getch(); return 0; }
/*显示联系人*/
10
void print11(struct LNode a[],int n) { int l=1;
if(a[n].length>0) {
printf(\共%d条记录\\n\ p1=p=a[n].next; while(p!=NULL) {
printf(\类别:\ printf(\ printf(\姓名:\
printf(\ printf(\电话:\
printf(\ printf(\电子邮件:\ printf(\ printf(\地址:\
printf(\ printf(\
printf(\ p=p->next; } }
else printf(\名片数为0!\\n\ printf(\按任意键返回主菜单:\ getch(); return; }
/*删除联系人函数*/
void onedelete1(struct LNode a[],int n) {
char s[20],r; int i=0;
printf(\请输入想删除联系人的姓名:\ scanf(\ p1=p=a[n].next; if(p1==NULL)
{ printf(\通讯录中没有此人!\\n\
11
return;}
while(strcmp(p->data.name,s)!=0&&p->next!=NULL)p=p->next; if(strcmp(p->data.name,s) != 0) {
printf(\通讯录中没有此人!\\n\ return; }
if(strcmp(p->data.name,s) == 0) {
printf(\类别:\
printf(\ printf(\姓名:\
printf(\ printf(\电话:\
printf(\ printf(\电子邮件:\ printf(\ printf(\地址:\
printf(\ printf(\
printf(\ }
printf(\确认删除?(Y/N):\ scanf(\
while(r!='n'&&r!='N'&&r!='y'&&r!='Y') {
printf(\输入错误!请重新输入:\ scanf(\ }
if(r=='y'||r=='Y') {
if(p1==p)a[n].next=p->next;
else {while(p1->next!=p)p1=p1->next; p1->next=p->next;} free(p); a[n].length--;
printf(\已经成功删除!\\n\ return; } }
12
//全部删除函数
void alldelete1(struct LNode a[],int n) {
char r;
p1=p=a[n].next;
printf(\确认删除?(Y/N):\ scanf(\
while(r!='n'&&r!='N'&&r!='y'&&r!='Y') {
printf(\输入错误!请重新输入:\ scanf(\ }
if(r=='y'||r=='Y') {
if(p1==NULL){printf(\不存在名片!\
while(p1->next!=NULL){p=p1->next;p1->next=p->next;free(p);} a[n].next=NULL; a[n].length=0;
printf(\已经成功删除全类名片!\\n\ return; }
if(r=='n'||r=='N') {
return; } }
//选择删除联系人函数
void delete11(struct LNode a[],int n) { int m;
printf(\请选择删除方式:\\n\ printf(\单个删除 \\n\ printf(\全部删除\\n\ printf(\返回菜单\\n\ printf(\请选择(0-2):\ scanf(\
while(m!=1&&m!=2&&m!=0) {
printf(\输入错误,请重新选择:\
13
scanf(\ } if(m==1) {
onedelete1(a,n); } if(m==2) {
alldelete1(a,n); } if(m==0) {
return; } }
//姓名查询联系人函数
void namefind(struct LNode a[],int n) {
char s[20]; int i=0; char m;
printf(\请输入想查询的姓名:\ scanf(\p1=p=a[n].next; if(p1==NULL)
{ printf(\通讯录中没有此人!\\n\
return;} while(p->next!=NULL) {
while(strstr(p->data.name,s)==NULL&&p->next!=NULL)p=p->next; if(strstr(p->data.name,s)!=NULL) { i++;
printf(\类别:\
printf(\ printf(\姓名:\
printf(\ printf(\电话:\
14
printf(\ printf(\电子邮件:\ printf(\ printf(\地址:\
printf(\ printf(\
printf(\ }
if((p->next==NULL)&&i==0) {
printf(\通讯录中没有此人!\\n\ printf(\是否继续查询?(Y/N)\ scanf(\
while(m!='n'&&m!='N'&&m!='y'&&m!='Y') {
printf(\输入错误!请重新输入:\ scanf(\ }
if(m!='n'&&m!='N') {
namefind(a,n); } return; }
if(p->next==NULL){ printf(\查询完成!\\n\ printf(\是否继续查询?(Y/N)\ scanf(\
while(m!='n'&&m!='N'&&m!='y'&&m!='Y') {
printf(\输入错误!请重新输入:\ scanf(\ }
if(m!='n'&&m!='N') {
namefind(a,n); } return;} else p=p->next; }
if(strstr(p->data.name,s)!=NULL)
15
{ i++;
printf(\类别:\
printf(\ printf(\姓名:\
printf(\ printf(\电话:\
printf(\ printf(\电子邮件:\ printf(\ printf(\地址:\
printf(\ printf(\
printf(\ }
printf(\查询完成!\\n\ printf(\是否继续查询?(Y/N)\ scanf(\
while(m!='n'&&m!='N'&&m!='y'&&m!='Y') {
printf(\输入错误!请重新输入:\ scanf(\ }
if(m!='n'&&m!='N') {
namefind(a,n); } return; }
//电话查询联系人函数
void telfind(struct LNode a[],int n) {
char s[20]; int i=0; char m;
printf(\请输入想查询的电话:\ scanf(\p1=p=a[n].next;
16
if(p1==NULL)
{ printf(\通讯录中没有此人!\\n\
return;}
while(p->next!=NULL) {
p=p->next;
while(strstr(p->data.tel,s)==NULL&&p->next!=NULL)p=p->next; if(strstr(p->data.tel,s)!=NULL) {i++;
printf(\类别:\
printf(\ printf(\姓名:\
printf(\ printf(\电话:\
printf(\ printf(\电子邮件:\ printf(\ printf(\地址:\
printf(\ printf(\
printf(\ }
if((p->next==NULL)&&i==0) {
printf(\通讯录中没有此人!\\n\ printf(\是否继续查询?(Y/N)\ scanf(\
while(m!='n'&&m!='N'&&m!='y'&&m!='Y') {
printf(\输入错误!请重新输入:\ scanf(\ }
if(m!='n'&&m!='N') {
telfind(a,n); } return; }
if(p->next==NULL){ printf(\查询完成!\\n\ printf(\是否继续查询?(Y/N)\
17
scanf(\
while(m!='n'&&m!='N'&&m!='y'&&m!='Y') {
printf(\输入错误!请重新输入:\ scanf(\ }
if(m!='n'&&m!='N') {
namefind(a,n); } return;} else p=p->next;
}if(strstr(p->data.tel,s)!=NULL) {i++;
printf(\类别:\
printf(\ printf(\姓名:\
printf(\ printf(\电话:\
printf(\ printf(\电子邮件:\ printf(\ printf(\地址:\
printf(\ printf(\
printf(\ }
printf(\查询完成!\\n\ printf(\是否继续查询?(Y/N)\ scanf(\
while(m!='n'&&m!='N'&&m!='y'&&m!='Y') {
printf(\输入错误!请重新输入:\ scanf(\ }
if(m!='n'&&m!='N') {
telfind(a,n); }
18
return; }
//地址查询联系人函数
void addsfind(struct LNode a[],int n) {
char s[20]; int i=0; char m;
printf(\请输入想查询的地址:\ scanf(\p1=p=a[n].next; if(p1==NULL)
{ printf(\通讯录中没有此人!\\n\
return;}
while(p->next!=NULL) {
while(strstr(p->data.adds,s)==NULL&&p->next!=NULL)p=p->next; if(strstr(p->data.adds,s)!=NULL) {i++;
printf(\类别:\
printf(\ printf(\姓名:\
printf(\ printf(\电话:\
printf(\ printf(\电子邮件:\ printf(\ printf(\地址:\
printf(\ printf(\
printf(\ }
if((p->next==NULL)&&i==0) {
printf(\通讯录中没有此人!\\n\ printf(\是否继续查询?(Y/N)\ scanf(\
while(m!='n'&&m!='N'&&m!='y'&&m!='Y')
19
{
printf(\输入错误!请重新输入:\ scanf(\ }
if(m!='n'&&m!='N') {
addsfind(a,n); } return; }
if(p->next==NULL){ printf(\查询完成!\\n\ printf(\是否继续查询?(Y/N)\ scanf(\
while(m!='n'&&m!='N'&&m!='y'&&m!='Y') {
printf(\输入错误!请重新输入:\ scanf(\ }
if(m!='n'&&m!='N') {
namefind(a,n); } return;} else p=p->next; }
if(strstr(p->data.adds,s)!=NULL) {i++;
printf(\类别:\
printf(\ printf(\姓名:\
printf(\ printf(\电话:\
printf(\ printf(\电子邮件:\ printf(\ printf(\地址:\
printf(\ printf(\
printf(\
20
return check; }
/*printf(\输入用户名:\
printf(\输入密码:\//读取文件函数 void Readfile() {
openclass();
if((fp=fopen(\ {
printf(\通讯录文件已存在。\\n\ rewind(fp);
fread(&psu1,sizeof(struct student),1,fp);
printf(\请输入用户名:\ printf(\请输入密码:\ encrypt(su.password); while(checkUerValid(&su)!=1) {
printf(\密码错误,请重新输入:\\n\
printf(\请输入用户名:\ printf(\请输入密码:\ encrypt(su.password); }
fclose(fp);}
if((fp=fopen(\ {
printf(\通讯录文件不存在!\
if ((fp=fopen(\不存在则进行创建
{ } else {
if ((fp=fopen(\不存在则进行创建 {
printf(\建立失败\exit(0);
36
printf(\建立失败\exit(0);
}
}
} { } fclose(fp);
printf(\按任意键进入主菜单\getch(); return;
printf(\输入注册号(不大于8位数):\scanf(\while(strlen(psu->username)>=8) { }
printf(\输入注册号密码(不大于8位数):\scanf(\while(strlen(psu->password)>=8) { }
fwrite(psu,sizeof(struct student),1,fp);
printf(\注册号输入错误!请重新输入:\scanf(\
printf(\注册号输入错误!请重新输入:\scanf(\
else
struct student su[1],*psu=su;
encrypt(psu->password);
printf(\通讯录文件已建立\\n\
exit(0); //退出
fseek(fp,0,2); //文件位置指针移动到文件末尾 if (ftell(fp)>0) //文件不为空,获取的是文件长度 {
//rewind(fp); //文件位置指针移动到文件开始位置 fseek(fp,0,0); //文件位置指针移动到文件开始位置
for (n=0; !feof(fp) && fread(&dat[n],sizeof(struct Data),1,fp);n++); //for(i=0;i<=n;i++)printf(\for(i=0;i<=n;i++) {
p=(struct Data1*)malloc(sizeof(struct Data1));
37
p1=a[dat[i].class1].next;
}
}
p->data=dat[i]; p->next=NULL;
if(a[dat[i].class1].next==NULL){a[dat[i].class1].next=p;a[dat[i].class1].length++;} else
{while(p1->next!=NULL)p1=p1->next; p1->next=p;a[dat[i].class1].length++; }}
//从文件流中读取数据,以Data结构体接收读取的数据,并由n记录下文件中联系人个数 printf(\文件导入成功\\n\printf(\按任意键进入主菜单:\getch(); return;
fclose(fp);
printf(\文件导入成功\\n\printf(\文件中没有数据\\n\printf(\按任意键进入主菜单:\getch();//按任意键退出 return;
void openclass() {
FILE *fp1; int i;
if ((fp1=fopen(\ {
printf(\不存在分类类别\
if ((fp1=fopen(\不存在则进行创建
{ }
printf(\建立失败\exit(0);
strcpy(a[1].clas,\家人亲戚\ //依次将下一条信息复制到上一条的位置 strcpy(a[2].clas,\朋友\ strcpy(a[3].clas,\同学\ strcpy(a[4].clas,\同事\ strcpy(a[5].clas,\陌生人\
38
strcpy(a[6].clas,\其他\ for (i=1; i<=6; i++) {
if (fprintf(fp1,\ {
printf(\文件保存错误!\\n\ }
a[i].length=0;a[i].next=NULL; }} else {
rewind(fp1);
for (i=1; !feof(fp1) && fscanf(fp1,\ printf(\类别文件导入成功\\n\ }
fclose(fp1);
//printf(\按任意键返回主菜单:\ // getch();//按任意键退出 return; }
//保存文件函数 void Save() {
FILE *fp; int i;
if ((fp=fopen(\ {
printf(\文件打开失败\ }
for (i=1; i<=6; i++) {
p=a[i].next; while(p!=NULL) {
if (fwrite(&(p->data),sizeof(struct Data),1,fp)==0) {
printf(\文件保存错误!\\n\
39
} p=p->next; } } fclose(fp);
printf(\按任意键返回主菜单:\ getch();//按任意键退出 return; }
附加说明:
本程序的加密算法来自《C语言程序设计(第2版)》何钦铭,颜晖主编; 编后语:
由于本人是第一次进行完整的程序设计,所以花了很长时间看《C语言程序设计(第2版)》,还在百度文库上看了相关的程序设计,浏览了一些百度知道上的问题及答案。
对我来说,链表和二进制文件操作是最难的。
刚开始时,我的通讯录只用数组进行操作,而且忘了分类。那时我就想:就在分类上添加链表,使各类别链接起来。但后来觉得这不是相当于没用链表吗?所以我就把程序重新做了一遍。
有一个地方我特别骄傲,那就是我把各个类别放在一个结构数组里,而那个结构组里又包含另一个结构组链表。虽然在使用时,尝试及测试很多遍,花了很长时间,但是最后终于成功了。
而为了文件操作,我把文件的相关操作函数看了一边又一边,也尝试了很多次。为了弄懂二进制结构链表怎么用fwrite函数和fread函数操作,也查了百度知道,但回答是让提问者有fprintf和fscanf函数来代替,我都无语死了。在自己尝试很久之后,我终于找到了一种方法。
40
百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典综合文库通讯录c语言源程序在线全文阅读。
相关推荐: