您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页课程设计实验报告书

课程设计实验报告书

来源:华佗小知识
课程设计实验报告书

程序名称:电话簿管理 报告人:钱怡君 05405107 时间:2006-9-24

一、 程序功能介绍

我所修改的电话管理簿程序主要有以下几个功能: 1 - 增加记录 2 - 显示所有记录 3 - 按要求显示 4 - 根据姓氏查询 5 - 删除记录 6 - 修改记录 7 - 帮助

程序使用一个handle_choice函数对用户的选择进行处理,将用户的选择与对应的函数进行连接,使得每当用户选择给出的选项,程序调用相应的函数完成操作。该函数采用switch语句,操作简单。

1.增加记录功能:

首先定义一个新指针,为其分配一个空间。如果在分配空间时没有发生错误,那么开始增加记录。提示用户依次输入姓名,电话号码。并通过函数将输入信息传给程序。此处采用了cin.get()函数来获取信息。如果在分配空间是发生错误,给出警告,并且不进行记录增加操作。

在这个功能中,还存在一个插入记录功能的函数,使得程序将记录按一定的顺序排放。该功能是这样实现的:首先建立一个新节点,如果本来不存在节点,那么这个新建的节点就是头节点。如果新节点出现在头节点的前面,那么将这个节点定义为新的头节点。否则,重新确定插入位置。用一个指针来跟踪该节点的位置,如果其后空间是空的,那么它就是尾节点。

2.显示所有记录功能:

首先将姓名组合成一个数组,将当前指针current_ptr指向链表头节点,输出current_ptr指针所指的内容。输出格式为:

姓名 电话号码 ------------------------------------------------------------------------------- ------------ 然后current_ptr指针后移,输出下一个信息。循环此操作,直到链表指向末尾。

如果头指针为空,显示提示信息:“没有记录显示”。

3.按要求显示信息:

该功能是我按照题目的要求,在原程序中插入的。程序如下: void display_list2() {

system(\"cls\");

char fullname[36]; // 用于将名字组成数组 int counter=0,a;

cout<<\"输入您想要的每屏显示的数目(不大于22):\"; cin>>a;

current_ptr = head_ptr; // 移动current_ptr到链表头部. if(current_ptr != NULL) {

cout << endl;

cout << \"姓名 电话号码\\n\"; cout << \"----------------------------------- ------------\\n\"; do {

counter++;

strcpy(fullname,\"\"); // 清除名字.

strcat(fullname, current_ptr->last_name); // 给出姓, strcat(fullname, \ // 然后一个逗号 strcat(fullname, current_ptr->first_name); //然后名. cout.setf(ios::left);

cout << setw(36) << fullname;

cout.unsetf(ios::left);

cout.setf(ios::right);

cout << setw(12) << current_ptr->phone_num << endl;

current_ptr = current_ptr->next; //设置current_ptr指向下一个节点.

cout << endl; if((counter)%a==0){

cout<<\"按回车键继续\"<cin.get(pause); }

} while(current_ptr != NULL); cin.ignore(1,pause); //循环直到结束.

system(\"cls\");

system(\"cls\"); }

else // 假如链表是空的,显示提示. {

cout << \"\\n没有记录显示!\\n\"; }

} //显示函数结束 程序设计思想如下:

首先给出提示:“输入您想要的每屏显示的数目(不大于22):”,等待用户输入个数a。

定义一个整型变量counter,用于记录信息的数目。按display_list()函数的操作方法输出信息。每输出一条信息,counter自增一次。当输出a 条信息时,counter==a,此时清除屏幕的信息。

然后提示:“按回车键继续”,当获取回车键字符时,输出下一个a 条信息。假如一开始current_ptr指针所指的头节点是空的,那么表示链表中没有任何信息,给出提示:“没有任何信息显示。”

4. 根据姓氏查询功能:

该功能是这样实现的:搜索由姓组成的数组,把current_ptr指针指向头节点开始搜索。

提示用户输入索要查询的人的姓氏,将用户输入的姓氏存入新定义的search_string指针中,采用strcmp()函数判断current_ptr指针所指的内容与search_string指针中的内容是否相同。

假如strcmp()返回值不是零,那么将current_ptr指针指向下一个节点,继续判断,如此循环。假如strcmp()返回值是零,说明找到所要找的人。然后按照以下格式输出:

****,***(姓,名) **********(电话号码)

如果current_ptr指针最后指向尾节点,说明没有找到。此时给出提示信息:“没有找到相符的,按回车键继续”。

5. 删除记录功能:

将previous_ptr初始化值定为空,将current_ptr移到头节点开始搜索。提示信息:“键入你要删除的人的姓:”。找出相应的人的信息所在位置,将current_ptr指针指向找到的信息。如果找到,提示信息:“是否要删除(Y/N)”,如果用户输入Y,执行删除操作,否则不删除。删除信息功能的具体实行相对较复杂,涉及到三种情况:删除头节点信息,从中间删除信息,从尾节点中删除信息。程序分别定义了三个函数处理三种情况:delete_head_of_list(),delete_from_middle_of_list(),delete_end_of_list()。三个函数共同的特点是:将指针指向被删除的节点的前面和后面,使它跳过被删除的节点。删除节点并释放空间。再把current_ptr指向头部,并给其赋值.不同之处在于,从头部删除信息,

或尾部删除信息后,链表就缺少了头节点和尾节点,必须在制造一个头节点和尾节点是其完整。delete_head_of_list()和delete_end_of_list()中就增加了这个功能。

6. 修改记录功能:

该功能也使我根据题目的要求在原程序中加入的。先调用函数change_record(),此函数实现时先搜索所要修改的信息,将current_ptr()指向该信息。然后调用change_node()函数修改信息。函数定义如下:

void change_node(friend_node *previous_ptr){

char change_string1[20]; char change_string2[20]; char change_string3[20]; cout<<\"修改为:\\n\"; cout<<\"名:\";

cin.get(change_string1,20);

strcpy(current_ptr->first_name,change_string1); cin.get();

cout<<\"姓:\";

cin.get(change_string2,20);

strcpy(current_ptr->last_name,change_string2); cin.get();

cout<<\"电话号码:\"; cin.get(change_string3,20 );

strcpy(current_ptr->phone_num,change_string3); }

定义三个字符型变量change_string1[20], change_string2[20] ,change_string3[20]来存储用户修改是输入的信息,然后采用strcpy()函数将其复制到current_ptr所指的节点中。这样就完成了修改功能。然后将其输出到屏幕,格式为:

****,***(姓,名)

**********(电话号码)

8. 帮助功能:

该功能用来解决用户在使用该程序中可能碰到的问题,并给予简单的帮助。主要有以下几个帮助选项:1: 我的记录出了什么问题?2: 怎样清空记录?3: 什么时候会推出新版本?4: 新版本里会有些什么内容?5: 退出。与handle_choice()函数一样采用switch()语句,针对不同的选项调用不同函数。

9.推出程序功能:

该功能调用delete_list()函数,将存储空间清空。并结束程序运行。delete_list()是这样实现的:将current_ptr指针所指的内容清除,再将其指向下一个节点,做循环操作,直到其指向尾节点。 二、 设计结构:

该程序的结构比较简单易懂。在程序的前面先申明了所要用到的各个函数清晰明了。接下去是主函数main(),其中罗列了该程序的各个功能。然后是各个功能的函数定义,基本是按照主函数中程序出现的顺序定义的,也方便理解。

三、 程序设计不足:

该程序在我的修改后,已经有相当多的功能,但还是存在一些不足。例如:1.增加信息时,只能一条一增。每增加一条信息,就要选择一次功能1。如果用户要增加许多信息,就要重复好多次操作,相当麻烦。2.该程序只能供一个用户使用,不能让许多用户使用,资源不能充分利用。3.信息的安全得不到保障,没有密码功能。4.帮助功能太简单,不能起到很大的作用。

在以后的时间里,会作进一步修改,使得该程序更加完美。

四、 完善及调试程序的心得体会:

短学期C++课的任务是编写一个C++程序,一开始真有些害怕。以前学的知识都是零零散散,从来没有系统地运用过。而且对自己也没有多大的信心,应为一直觉得C++是那么难的一门课,自己学的不是很扎实,可能编出来吗?抱着试一试的心态,开始了我的作业。我选择的是电话簿程序,应为它比较容易理解。而且题目的要求也相对比较容易:

1 增加记录修改功能(姓,名和电话号码)

2 增加显示功能(对链表提供逐屏显示选择而且可以由用户确定每屏显示的数

目)

3 汉化菜单和帮助

4 程序的结构改写,采用双链表结构。

我在做题时,先做第三个题目。一边翻译程序,一边理解程序。一个暑假没有接触C++了,好多知识已经忘记。翻译这么长的程序也是相当重的任务,但是通过翻译,我渐渐回忆起了学过的知识,基本理解了程序设计的思路,那么做下一步的操作就比较省力。

第一个题目比较简单,基本上没有遇到问题。但是在做第二个题目时,我遇到了一个很难处理的问题。题目要求每屏显示用户要求的信息条数,我就想到了用system(“cls”),每输出一屏信息后,用户按回车键,就清除一页的信息。这个思想在后来证明是对的,但是运行时却出现了问题。第一页信息不能显示,而后面的信息却能安要求执行。我怎么都不能发现错误,在万般无奈下,请教了老师。终于,在老师的指导下完成了任务。用cin.get()吸收掉一个回车符就达到要求了。在运行出程序的那一刻真是无比开心。

任务完成了, C++功能的强大,更牢固地掌握了C++知识,理解了C++强大的功能。将学过的知识系统的应用,作出一个属于自己的程序真是一种很享受的过程。在完成这个程序后,我的心情是无比的开心的———自己的劳动果实,承载这胜利的喜悦!这个短学期,让我不再害怕C++,而且更加崇尚科学。经过努力克服困难后得到的快乐会让我更乐观的对待以后的挫折!

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务