C语言实训通讯录.docx

上传人:b****8 文档编号:10656506 上传时间:2023-02-22 格式:DOCX 页数:21 大小:95.73KB
下载 相关 举报
C语言实训通讯录.docx_第1页
第1页 / 共21页
C语言实训通讯录.docx_第2页
第2页 / 共21页
C语言实训通讯录.docx_第3页
第3页 / 共21页
C语言实训通讯录.docx_第4页
第4页 / 共21页
C语言实训通讯录.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

C语言实训通讯录.docx

《C语言实训通讯录.docx》由会员分享,可在线阅读,更多相关《C语言实训通讯录.docx(21页珍藏版)》请在冰豆网上搜索。

C语言实训通讯录.docx

C语言实训通讯录

实训报告

 

题目:

简易通讯录管理系统

院系:

专业:

姓名:

学号:

指导教师:

日期:

2009年9月19日

 

桂林电子科技大学信息科技学院

 

目录

1问题定义…………………………………………………………………………..3

2系统设计……………………………………………………………………3

2.1总体设计………………………………………………………………………………3

2.2详细设计………………………………………………………………………………4

2.2.1数据结构设计…………………………………………………………4

2.2.2主控流程…………………………………………………………………………5

2.2.3输入记录模块……………………………………………………………………6

2.2.4查询记录模块……………………………………………….…………………6

2.2.5管理记录模块………………………………………………6

2.2.6输出记录模块……………………………………………….…………………6

3系统实现………………………………………………………………………7

3.1编码………………………………………………………………………7

3.1.1程序预处理……….……………………………………………………………7

3.1.2主函数main()……….………………………………………………………8

3.1.3主菜单界面………….………………………………………………………8

3.1.4保存信息并释放内存空间…….…………………………………………………9

3.1.5记录查找(按姓名)………….…………………………………………………10

3.1.6输入记录……….…………………………………………………….…………11

3.1.7输出记录………….………………………………………………….…………11

3.1.8删除记录………….…………………………………………………….………12

3.2测试与调试………………………………………………………………………12

3.2.1概述………….……………………………………………………………12

3.2.2程序测试………….……………………………………………………………13

4系统维护………………………………………………………………………15

5归纳总结………………………………………………………………………16

5.1开发经验………………………………………………………………………16

5.2设计中的不足之处……………………………………………………………………16

5.3感想和心得体会……………………………………………………………………16

 

简易通讯录管理系统

本题目设计目的是训练学生的基本编程能力,了解简易通讯录的开发流程,熟悉C语言的文件各种基本操作。

本程序中涉及很多方面的知识,通过本程序的训练,使学生能对C语言的文件操作有一个更深刻的了解,掌握对简易通讯录实现的原理,进一步开发出高质量的通讯录系统打下坚实的基础。

1.问题定义

创建一个简易通讯录管理系统。

假设系统中包含输入信息,显示信息,增加信息,删除信息和保存等信息。

程序的运行效果如下图所示,选择任意菜单后,实现相应功能。

 

在问题定义阶段要考虑题目的可行性和需求分析,接下来进入开发阶段,完成系统设计和系统实现的任务。

2.系统设计

2.1总体设计

采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。

需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。

可以用模块化层次结构图(即模块图)来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述。

 

图2.1

本成绩管理系统要求采用单链表实现,如图2.1所示,它由如下四大功能模块组成:

输入记录模块。

完成将数据存入单链表的工作。

从键盘上逐个输入数据。

当从数据文件中读入记录时,也就是把在以记录为单位存储的数据文件中,将记录逐条复制到单链表中。

查询记录模块。

完成在单链表中查找满足相关条件的记录。

在此通讯录系统中,用户可以按照姓名在单链表中进行查找。

若找到该人物的记录,则返回指向该人物的记录的指针。

否则返回一个值为NULL的空指针,并打印出未找到该人物记录的提示信息。

管理记录模块。

完成在单链表中删除满足相关条件的人物记录。

按照姓名先查找,再删除此记录。

完成在单链表中继续添加人物信息的记录。

与输入记录模块一样。

输出记录模块。

一是实现对人物记录的存盘,即将记录写入数据文件中;二是实现将记录信息以表格的形式在屏幕上打印出来。

2.2详细设计

2.2.1数据结构设计

通讯录结构体

structTelephone

{

charname[20];

charaddrass[20];

charzip[20];

chartelephone[20];

structTelephone*next;

};

结构体structTelephone用于储存通讯录的基本信息。

结构体

typedefstructTelephoneTEL;

TEL*head=NULL;

voidshowmenu();//菜单

voidAppenditem();//添加条目

voidprint();//输出条目

voidFinditem1();//查找条目(按姓名)

voidRemoveitem();//删除信息

voidSaveandfree();//保存到文件

voidOpen();//打开文件

 

2.2.2主控main()函数的执行

voidmain()

{

charch;

Open();//打开文件

while

(1)

{

showmenu();//显示菜单

scanf("%c",&ch);

switch(ch)

{

case'1':

Appenditem();//添加条目

break;

case'2':

print();//输出条目

break;

case'3':

Finditem1();//查找条目1.按姓名

break;

case'4':

Removeitem();//删除信息

print();//输出删除后的结果

break;

case'0':

Saveandfree();//保存并释放内存

exit(0);//退出

break;

default:

printf("选择错误!

");

break;

}

}

}

先打开文件,此文件若不存在,则新件此文件.

2.2.3输入记录模块

输入记录模块主要实现将数据存入单链表中.用户选择voidAppenditem()函数进行对人物记录的输入,即完成在单链表中添加记录的操作.值得一提的是,这里的字符串和数值的输入分别采用了函数来实现,在函数中完成输入数据任务,并对数据进行条件判断,直到满足条件为止,这样一来,大大减少了代码的重复和冗余,符合模块化程序设计的特点。

2.2.4查询记录模块

查询记录模块主要实现了在单链表中按姓名查找满足相关条件的人物记录。

在查询模块函数voidFinditem1()中,p为指向保存了学生成绩信息的单链表的首地址的指针变量。

为了遵循模块化编程的原则,我们将在单链表中进行的指针定位操作,设计成了一个单独的函数若找到该记录,则返回指向该节点的指针;否则,返回一个空指针。

2.2.5管理记录模块

此模块主要实现了对学生记录的删除、添加操作。

因为学生记录是以单链表的结构形式存储的,所以这些操作都在单链表中完成。

(1)删除记录。

该操作完成删除指定学号或姓名的学生记录,它也分两步完成。

第一步,输入要删除的姓名,输入后调用定位函数,在单链表中逐个对节点数据域中学号或姓名字段的值进行比较,直到找到该学号或姓名的学生记录,则返回指向该学生记录的节点指针;

第二步,若找到该学生记录,将该学生记录所在节点的前驱节点的指针域,指向目标节点的后继节点。

(2)添加记录。

该操作完成在指定学号的随后位置插入新的学生记录。

首先,要求用户输入某个学生的学号,新的记录将插入在该学生记录之后;然后,提示用户输入一条新的学生记录的信息,这些信息保存在新节点的数据域中;最后,将该节点插入在指定位置学号之后.

2.2.6输出记录模块

当把记录输出至文件时,调用函数,将p指针所指节点中的各字段值,写入文件指针fp所指的文件。

当把记录输出至屏幕时,调用函数,将单链表中的人物记录信息以表格的形式在屏幕上打印出来。

开始着手进行系统实现的工作,开始程序代码的编写.

3.系统实现

3.1编码

3.1.1程序预处理

包括加载头文件,定义结构体、常量和变量,并对它们进行初始化工作。

#include

#include

#include

structTelephone

{

charname[20];

charaddrass[20];

charzip[20];

chartelephone[20];

structTelephone*next;

};

typedefstructTelephoneTEL;

TEL*head=NULL;

voidshowmenu();//菜单

voidAppenditem();//添加条目

voidprint();//输出条目

voidFinditem1();//查找条目(按姓名)

voidRemoveitem();//删除信息

voidSaveandfree();//保存到文件

voidOpen();//打开文件

3.1.2主函数main()

main()函数主要实现了对整个程序的运行控制,以及相关功能模块的调用。

voidmain()

{

charch;

Open();//打开文件

while

(1)

{

showmenu();//显示菜单

scanf("%c",&ch);

switch(ch)

{

case'1':

Appenditem();//添加条目

break;

case'2':

print();//输出条目

break;

case'3':

Finditem1();//查找条目1.按姓名

break;

case'4':

Removeitem();//删除信息

print();//输出删除后的结果

break;

case'0':

Saveandfree();//保存并释放内存

exit(0);//退出

break;

default:

printf("选择错误!

");

break;

}

}

}

3.1.3主菜单界面

用户进入通讯录管理系统时,需要显示主菜单,提示用户进行选择,完成相应任务。

此代码被main()函数调用。

 

//菜单

voidshowmenu()

{

printf("\n*****************通讯录系统*****************\n");

printf("\t1.添加条目。

\n");

printf("\t2.输出输出\n");

printf("\t3.按姓名查询\n");

printf("\t4.删除条目\n");

printf("\t0.保存并退出!

\n");

printf("*************************************************\n");

printf("\t请选择:

\n");

}

3.1.4保存信息并释放内存空间

voidSaveandfree()

{

TEL*p=NULL;

FILE*fp;

char*Book="books.txt";

if(head==NULL)

{

printf("\n记录为空!

\n");

return;

}

else

p=head->next;

if((fp=fopen(Book,"wb+"))==NULL)

{

printf("\n打不开文件!

\n");

return;

}

while(p!

=NULL)//保存信息

{

fwrite(p,sizeof(TEL),1,fp);

p=p->next;

}

printf("保存完毕!

");

fclose(fp);

//*****释放链表空间*****

for(;head->next!

=NULL;)

{

p=head->next;

head->next=head->next->next;

free(p);

}

free(head);

}

//文件信息输出到链表

voidOpen()

{

FILE*fp;

TEL*p1=NULL,*p2=NULL,*temp=NULL;

if((fp=fopen("books.txt","rb+"))==NULL)

{

printf("\n****************这是一个新的通讯录管理系统******************\n");

return;

}

head=(TEL*)malloc(sizeof(TEL));

head->next=NULL;

temp=p2=head;

while(!

feof(fp))//循环读取

{

p1=(TEL*)malloc(sizeof(TEL));

temp=p2;

p2->next=p1;

p2=p1;

fread(p1,sizeof(TEL),1,fp);

}

temp->next=NULL;

fclose(fp);//关闭文件

}

3.1.5记录查找(按姓名)

需要先输入姓名,找到相应的记录

voidFinditem1()

{

TEL*p;

charfindname[20];

printf("请输入要查找的姓名:

\n");

scanf("%s",findname);

printf("**************通讯录系统*********************\n");

printf("姓名\t地址\t邮编\t电话\n");

for(p=head->next;p!

=NULL;p=p->next)

{

if(strcmp(p->name,findname)==0)

printf("%s\t%s\t%s\t%s\n",p->name,p->addrass,p->zip,p->telephone);

}

}

3.1.6输入记录

voidAppenditem()

{

TEL*p1=NULL,*p2=NULL;

p1=(TEL*)malloc(sizeof(TEL));//申请结点

printf("输入姓名:

\n");//添加信息

scanf("%s",p1->name);

printf("输入地址:

\n");

scanf("%s",p1->addrass);

printf("输入邮编:

\n");

scanf("%s",p1->zip);

printf("输入电话:

\n");

scanf("%s",p1->telephone);

p1->next=NULL;//保存到链表

if(head==NULL)

{

head=(TEL*)malloc(sizeof(TEL));//申请空间

head->next=p1;

}

else

{

for(p2=head;p2->next!

=NULL;p2=p2->next);//找到结点尾

p2->next=p1;

}

printf("此信息已添加!

");

}

3.1.7输出记录

voidprint()

{

TEL*p=NULL;

if(head==NULL)

{

printf("此通讯录中无记录,请输入记录后在使用本功能!

\n");

return;

}

printf("**************通讯录系统*********************\n");//输出信息

printf("姓名\t地址\t邮编\t电话\n");

for(p=head->next;p!

=NULL;p=p->next)

printf("%s\t%s\t%s\t%s\n",p->name,p->addrass,p->zip,p->telephone);

}

3.1.8删除记录

voidRemoveitem()

{

charfindname[20];//先查找后删除

TEL*p=head->next,*pr=head->next;

printf("请输入要删除的姓名:

\n");

scanf("%s",findname);

if(head->next==NULL)

{

printf("无此节点!

\n");

return;

}

while((strcmp(p->name,findname)!

=0)&&p->next!

=NULL)

{

pr=p;

p=p->next;

}

if(strcmp(findname,p->name)==0)//输出删除信息

{

printf("%s\t%s\t%s\t%s\n",p->next->name,p->next->addrass,\

p->next->zip,p->next->telephone);

if(p==head->next)

head->next=p->next;

else

pr->next=p->next;

free(p);

}

printf("此信息已删除!

");

}

3.2测试与调试

3.2.1概述

一般情况下,为解决一个问题所编写的程序代码较长,可能包括几百条甚至成千上万条语句。

在检查并排除所有语法错误后,还会有不易发现的逻辑错误,因此要对程序进行认真仔细的测试与调试。

测试是通过运行程序发现错误的过程,常见的错误有数据溢出、数组越界、进入死循环、语句顺序颠倒、多加“;”或少加“{}”等等。

调试则是确定测试中找到的错误性质并改正错误的过程。

测试与调试通常交替进行,即测试——调试——再测试——再调试。

能检查出尚未发现的、各种不同类型错误的测试才是成功的测试。

测试程序需要测试用例,测试用例可用如下公式表示:

测试用例=测试数据+预期结果。

好的测试用例应该是用尽可能少的测试数据发现尽可能多的错误,即发现错误的概率要大。

要选择合适的测试数据,使系统在运行时尽量能执行到每条语句,以测试各指令是否正确。

还应分别测试输入合法数据与非法数据时,程序的运行情况,。

对于合法数据,还要考虑数据的一般性与特殊性,如求最大值的问题,应测试最大值在最前面、最后面、中间某一位置的情况。

测试可按模块测试、组装测试和确认测试的步骤进行。

(1)模块测试就是分别对各模块进行测试的过程。

在编写一个模块后应立即对其进行测试,因为这时对模块记忆深刻,而且单个模块相对较小,所以容易构造测试数据,能方便地检查和改正错误。

(2)组装测试就是把所有模块(应该是通过模块测试的模块)按预先制定的计划逐步组装和测试的过程。

一般情况下,各模块之间要相互传递数据和控制信息,因此组装测试的主要任务是发现模块接口中的错误。

(3)确认测试是最后一个步骤,一般在将软件交付用户之前,应确认软件是否确实满足用户的要求,通常使用接近实际的用例进行测试。

3.2.2程序测试

●在主菜单中选择1

当用户输入1并按回车键后,即可进入数据输入界面。

其输入记录过程如图3.1所示,这里输入了1条学生记录。

图3.1

●在主菜单中选择2

当用户输入2并按回车键后,即可显示输出界面.如图3.2所示.

图3.2

●在主菜单中选择3

当用户输入3并按回车键后,即可进入记录查找界面。

如图3.3所示.

图3.3

●在主菜单中选择4

当用户输入4并按回车键后,即可进入删除界面。

先得添加多个记录草能运行删除功能。

图3.4

●在主菜单中选择5

当用户输入5并按回车键后,即可进入记录保存并退出界面。

如图3.5所示。

图3.5

4、系统维护

经测试与调试确认软件无错时,开发就告一段落,这时可以交付软件供用户使用,但是在软件的使用过程中还会面临更加漫长的工作,即软件维护。

一般维护的工作有:

更改使用中发现的错误;为适应实际环境而对程序进行修改;为满足新的需求而对程序作必要的改进等等。

5、归纳总结

5.1开发经验

通过对本题目的开发,体会到要掌握以下几点内容。

●大程序的设计风格。

按“自顶向下,逐步细化,模块化”的方法进行程序设计。

●编写主函数,并进行测试与调试。

当被调函数又需要调用其他函数时,也要遵循逐步细化的原则。

C语言提供丰富的库函数,编程序时要善于使用库函数,避免不必要的劳动。

●定义函数时,应选好参数的个数和数据类型。

●文件使用方法。

文件使用完毕后应及时关闭。

5.2设计中尚存的不足之处

关于这次的程序,也有挺多不足的地方。

首先,我觉得程序还不够完善,有些功能并没有完全写出来.最后,就是该程序界面不够美观大方。

5.3感想和心得体会

通过这次实验,我感觉到自己学到的知识还不够完善,有些内容还不能完全理解,导致编写代码的时候,遇到了很多困难.突然觉得自己要把所学的理论知识运用于解决实际问题不仅要付出艰辛的劳动,还得要有科学的方法和坚持不懈的努力。

10天的时间,很快过去,在一步步学习和解决问题中,我学到了很多东西,不断请教,不断修改,不断沟通,使得我有了大量的知识积累和提高.从而激发了我进一步学习C语言的热情,一点一滴到心血,都会换来美好到回报。

还要感谢老师的辛苦解答,才能改善我到能力。

虽然这次程序编写得不够理想,可是,我会努力的,努力编写更多更好到程序!

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 制度规范

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1