跪求数据结构课程设计(C语言版)代码,感激不尽

跪求数据结构课程设计(C语言版)代码,感激不尽,第1张

《数据结构课程精讲教案合集-复旦大学(共计1061页).pdf 》百度网盘免费资源下载

链接: https://pan.baidu.com/s/15uwjtHgKKzZdheWFQC21pQ

?pwd=abzc 提取码: abzc

). 打开VC新建一个“Win32 Dynamic-Link Library”工程,命名为:sqlite32). 在接下来的对话框中选择"An empty DLL project",点 FINISH->OK3). 将源码中所有的 *.c *.h *.def 复制到工程文件夹下4). 在工程的Source File中添加你下载到的SQLite源文件中所有*.c文件,注意这里不要添加shell.c和tclsqlite.c这两个文件。5). 将 SQLite 源文件中的 sqlite3.def 文件添加到在工程的Source File中6). 在Header File中添加你下载到的SQLite源文件中所有*.h文件,7). 开始编译,Build(F7)一下也许到这里会遇到一个错误:e:\zieckey\sqlite\sqlite3\sqlite3ext.h(22) : fatal error C1083: Cannot open include file: 'sqlite3.h': No such file or directory经检查发现,源码中包含sqlite3.h都是以 #include <sqlite3.h>方式包含的,这就是说编译器在系统默认路径中搜索,这样当然搜索不到 sqlite3.h 这个头文件啦,这时可以改为 #include "sqlite3.h" ,让编译器在工程路径中搜索,但是如果还有其他地方也是以 #include <sqlite3.h>方式包含的,那么改源码就显得有点麻烦,好了,我们可以这样,在菜单栏依次选择:Tools->Options...->Directeries在下面的Directeries选项中输入你的 sqlite3.h 的路径,这里也就是你的工程目录.添加好后,我们在编译一下就好了,最后我们在工程目录的 Debug 目录生成了下面两个重要文件:动态链接库文件 sqlite3.dll 和引入库文件 sqlite3.lib二. 使用动态链接库下面我们来编写个程序来测试下我们的动态链接库.在VC下新建一个空的"Win32 Console Application" Win32控制台程序,工程命名为:TestSqliteOnWindows再新建一个 test.cpp 的C++语言源程序,源代码如下:// name: test.cpp// This prog is used to test C/C++ API for sqlite3 .It is very simple,ha !// Author : zieckey// data : 2006/11/28#include <stdio.h>#include <stdlib.h>#include "sqlite3.h" #define _DEBUG_int main( void ){sqlite3 *db=NULLchar *zErrMsg = 0int rcrc = sqlite3_open("zieckey.db", &db)//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件if( rc ){fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db))sqlite3_close(db)return (1)}else printf("You have opened a sqlite3 database named zieckey.db successfully!\nCongratulations! Have fun ! ^-^ \n")

我们以前做的课程设计,有完整的文件,要的话给个邮箱

面向对象课程设计——通信

本章课程设计是设计一个实用的小型通信录,具有查询和删除功能,并且能够打开或修改指定文件及将多个文件组成一个文件,它完全使用类来实现,充分体现了面向对象的程序设计特点。

本章的参考程序使用双向链表保存数据的底层数据结构,并使用C++标准库提供的list来实现这个链表的结构,由于利用list类,所以实现起来很简单。虽然这种方法超出一般的教材,但只要学习下一个标准库,还是容易理解的。C++推荐使用标准库,这也是目前编程的方向,所以设计本章作为所选内容,以便学生熟悉和了解C++的标准库。

一、功能设计要求

设计要求实现的功能较多,所以将它们分为几个部分叙述。

1. 建立文件

(1) 存储文件可以使用默认文件名或指定文件名。

(2) 可以不保存输入记录,但需要确认是否保存输入记录。

(3) 如果已经有文件,只能在其后追加

(4) 新增的记录可以不存入原文件中,也可以用原来的文件覆盖内存的内容。

(5) 可以将指定文件的内容追加到目前内存的链表后面。

2. 文件的存取和显示

(1) 可以单独存取文件。

(2) 可以随时显示内存中记录的全部内容。

(3) 可以直接存取默认文件或指定文件。

3. 删除记录

(1) 可以按“姓名”或“电话”方式删除记录并更新内存链表内容。

(2) 能给出被删除记录的信息。

(3) 如果已经是空表,删除时应该给出提示信息并返回主菜单。

(4) 如果没有要删除的信息,输出没有找到的信息。

(5) 删除 *** 作仅限于内存,只要执行记录时,才能覆盖原记录。

4. 查询记录

(1) 可以按“姓名”或“电弧“方式查询记录。

(2) 能给出查询记录的信息。

(3) 如果查询的信息不存在,输出“没有找到“的信息。

5. 整体性能

(1) 应可以随时检索|、删除或增加新记录,也可以保存或取消新的记录。

(2) 姓名可由字符和数字混合编码。

(3) 电话号码可由字符和数字组成。

(4) 将输出信息加上栏头,例如:

姓名 电话

李玉梅 (86)-10-62543321

张三 86 551 9823555

Les Hancock 13912345678

Zhang San 0551-36994698

(5) 使用菜单实现功能的正确选择。

6. 测试程序

(1) 应列出测试大纲对程序进行测试

(2) 应保证测试用例能测试到程序的各种边缘情况。

二、使用List类的成员函数

List 对象的定义方式是:

List<T>obj

其中T 是链表所存储的数据类型,也就是链表的每一个结点的数据类型。

List 类中使用typedef定义的常用的数据类型是iterator和const_iterator,可将它们看成是指向每条记录的指针和指向记录的const指针。

在通信录程序中使用到的list类的成员函数如下:

1. bool list ::empty()const

当且仅当list为空时,就返回true.

2.size_t list::size()const

返回链表中记录的元素个数。该函数的运行复杂度是线性的,即O(N)。

3.iterator list::begin()

返回一个iterator,指向此链表的开头。

4.iterator list::end()

返回一个iterator,指向此链表的尾端,这里的尾端指的是链表的最后一个元素之后,即链表中实际存有函数的范围是[begin(),end()].

5.const_iterator list::begin()const

返回一个const_iterator,指向此链表的开头。

6.const_iterator list::end()const

返回一个const_iterator,指向此链表的尾端,这里的尾端指的是链表的最后一个元素之后,即链表中实际存有元素的范围是[begin(),end()]。

7.void list::push_bace(constT&t)

将元素t安插于链表尾。

8.iterator list::erase(iterator pos)

删除pos所指向的元素,返回指向被删除元素后面一个元素的iterator.

9.void list::clear()

删除链表中的所有元素。

三、结构和类

在通信录中共定义了1个结构和3个数,下面对它们加以说明。

1、结构Record

首先要定义通信录中每一条记录的内容的结构,它的每个域对应着记录中的一项信息。这里使用类string的对象来定义Record域的信息项。

sruct Record

{

sring name//姓名

string tel//电话号码

};

如果使用字符串,其长度必须事先定义,使用string类,存储对象需要的长度则随机具体对象的实际长度而定。

在使用VS7(Microsoft Visual Studio.NET 2003)和VC(Microsoft Visual C++.NET 2003)软件时,不会有任何问题。但在使用Visual C++6.0时,由于VC6本身存在一些问题,所以也给本设计带来一个问题:使用getline()函数需要再按一次“回车”键,从而产生交互错误。本程序将在实际设计中做进一步说明,此处不再赘述。

2、类RecordList

类RedcordList 是一个针对通信录做了特殊处理的链表,它继承于list<Record*>,即以指向Record的指针为元素的链表。

Class RecordList : public list<Record*>

{

fiend ostream&operator<<(ostream&os, const RecordList&c_rl)

fiend istream&operator>>(istream&is, RecordList&rl)

public:

void clear()

iterator erase(iterator where)

~RecordList()

}

类RecordList可以直接使用类list中定义的所以函数,但重写了clear()函数、erase()函数和增加了析构函数,并重载了输入、输出 *** 作符。这是因为类list的删除元素的 *** 作只会释放存储元素的空间;对于本程序来说,就是只释放Record指针,却并不会释放该指针所指向的对象。因此,类RecordList覆盖了基类中的clear()函数、erase()函数,使得其在删除元素时首先释放该元素(即Record指针所指向的Record对象),然后再调用基类中被覆盖的同名函数以实现删除元素的功能。增加了析构函数是为了链表被销毁的同时,也销毁其所记录的所有对象。重载了输入、输出 *** 作符是便于从输入、输出流中还原或保存链表。

3、类AddressList

AddressList类是处理通信录的底层类,针对增加记录、删除记录、查询记录以及保存和读取记录等 *** 作进行与底层数据结构相关的处理,该类不涉及任何与用户界面与用户交互相关的 *** 作。

该类以“包含”关系(has-a)持有一个RecordList类的对象recList,作为保护型数据成员,这是存取记录的底层数据结构。

Class AddressList

{

potected:

RecordList recList//RecordList类的对对象作为数据成员

Public:

Typedef RecordList::iterator Iterator

//从通信录中寻找一个记录

vtual Iterator findRecord(string patten,int type,Iterator from)

//其他成员函数

vrtual void addRecord(Record*rec)

virtual Iterator removeRecord(Iterator it)

virtual void saveRecords(ostream&os)

virtual int loadRecords(istream* is)

virtual ~AddressList()

const int size() const {return (int)recList.size()}

const bool empty() const {return recList.empty()}

virtual void clear() {recList.clear()}

Iterator first() {return recList.begin()}

Iterator pastEnd() {return recList.end}

}

在类AddressList中定义的一些函数直接使用了类RecordList的函数,没有增加太多的功能,如addRecord()只是用了类RecordList继承自基类的push_back(), removeRecord()只是调用了类Record重写了的erasse().

需要特别解释的是findRecord()函数,它用于从通信录中寻找一个符合条件的记录,并返回指向该记录的iterator。该函数将从给定的iterator开始,按递增的顺序一次考查每一条记录,直到找到符合条件的记录或者到达通信录的末尾。在iterator迭代遍历记录时,采用如下的代码:

Iterator it

Iterator it_end =recList.end()

for (it=fromit!=it_end()

{

. . .

}

这里from是迭代开始的位置,it_end是通信录的末尾,若想遍历个通信录找出所有符合条件的记录,from可以第一次取值recList.begin(),之后每次取前一次运行findRecord()所得返回值增1,直到findRecord()返回it_end为止。

4、类AddressBook

类AddressBookshichu是处理通信录 *** 作的面向用户使用的类,包含所有功能的用界面及用户交互的实现。

Class AddressBook : public AddressList

{

protected:

bool isModified//通信录是否已被修改还未保存

publc:

AddressBook()

virtual ~AddressBook()

//开始通信录的用户界面 *** 作

virtual void start()

//菜单处理函数

virtual void displayRecords()

//显示记录

virtual void queryRecord()

//增加记录

virtual void addRecord()

//删除记录

virtual void removeRecords()

//保存记录

virtual void loadRecords()

//结束程序

virtual void loadRecords()

//清空当前通信录

virtual void clear()

protected:

//菜单选择函数

clear menuSelect()

//显示表头

void disputable()

}

该类继承了类AddressList,可以直接使用它的直接基类AddressList的函数。在运行通信录时只要新建一个AddressBook类的对象,就可以通过这个对象自动执行与用户交互的 *** 作。

类AddressBook的构造函数将调用欢迎界面成员函数strat()将调用菜单处理函数handleMenu(),在成员函数handMenu()中,将反复调用菜单选择函数menuSelect(),然后依据用户的选择调用相应的处理函数displayRecords()、queryRecord()、addRecord()、removeRecord()、saveRecord()、loadRecords()、clear()、quit()等。

成员函数displayRecords()会iterator迭代遍历整个通信录,显示所有的记录。

成员函数addRecord()会首先获得用户要求的查询条件,然后通过前面介绍的方法反复调用类AddressList()函数,找出所有匹配条件的记录并显示出来。

成员函数addRecord()将要求用户输入必要的信息以构建新的Record对象,然后将指向该对象的指针作为链表的元素,通过调用类AddressList的addRecord()函数添加到通信录的末尾。

成员函数removeRecord()会首先获得用户要求的查询条件,使用该查询条件来找到用户想要删除的确切记录,将每一个符合条件的记录显示给用户看,询问用户是否确定删除该记录;若确定删除,则调用类RddressList的removeRecord()函数完成删除记录。

成员函数saveRecords()让用户输入文件名,然后建立文件输出流,再调用类AddressList的saveRecords()函数完成。

成员函数loadRecords()会将从文件读入的记录追加到当前通信录的末尾,所以如果希望当前通信录与文件中记录的通信录完全一致,就应该先调用成员函数clear),再调用成员函数loadRecord(),loadRecord()会首先让用户输入文件名,然后建立文件输入流,最后调用直接基类AddressList()的clear()函数完成清空 *** 作。

成员函数quit()会首先检查当前通信录是否已被改动并提示用户进行保存,然后运行语句

delete this:

来销毁自己(AddressBook)的对象,最后运行exit()函数结束程序。

5、类的UML

图1是使用类的短式形式表示的UML结构图。

四、参考程序

本设计由3个.cpp文件及相应的3个头文件组成。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9972371.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-03
下一篇2023-05-03

发表评论

登录后才能评论

评论列表(0条)

    保存