《2022年实验_数据结构文件 .pdf》由会员分享,可在线阅读,更多相关《2022年实验_数据结构文件 .pdf(21页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实验 8:查找、排序姓名:翁恒丛学号: 6100410184 专业班级:卓越计算机101 一、实验目的深入了解各种内部排序方法及效率分析。二、问题描述各种内部排序算法的时间复杂度分析,试通过随机数据比较算法的关键字比较次数和关键字移动次数。三、实验要求1、对起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序这六种常用排序算法进行比较。2、待排序表的表长不超过100;其中数据用伪随机数产生程序产生。1、 至少要用6 组不同的输入数据做比较。2、 要对实验结果做简单分析。四、实验环境PC微机DOS操作系统或 Windows 操作系统Turbo C 程序集成环境或 Visual C+
2、程序集成环境五、实验步骤1、根据问题描述写出基本算法。2、设计六种排序算法并用适当语言实现。3、输入几组随机数据,并对其关键字比较次数和关键字移动次数的比较。4、对结果进行分析。5、进行总结。六、测试数据数据有随机数产生器产生。七、实验报告要求实验报告应包括以下几个部分:1、问题描述。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 21 页 - - - - - - - - - 2、六种排序算法描述。(1) 冒泡排序在要排序的一组数中,对当前还未排好序的范围内的全部数,自上
3、而下对相邻的两数依次进行比较和调整,让较大的数往下沉,较小的往上冒。 即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。(2) 直接插入排序这是最简单的排序方法,它的基本基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增加1 的有序表。(3) 简单选择排序思路很简单,就是每次选出最小/ 大的数,和前面的第i 个数交换。是不稳定的排序方式,因为在交换的过程中,相同的两个数,前者有可能被交换到后面去,举个例子,序列 5 8 5 2 9, 我们知道第一遍选择第1 个元素 5 会和 2 交换,那么原序列中2 个 5 的相对前后顺序就被破坏了,所以选择排序不是一
4、个稳定的排序算法。(4) 快速排序快速排序是对冒泡排序的一种本质改进。它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中, 一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少1。快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。(5) 希尔排序在直接插入排序算法中,每次插入一个数,使有序序列只增加1 个节点, 并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素, 则进行一次比较就可能消除
5、多个元素交换。算法先将要排序的一组数按某个增量 d 分成若干组,每组中记录的下标相差d. 对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1 时,整个要排序的数被分成一组,排序完成。(6) 堆排序堆排序是一种树形选择排序,是对直接选择排序的有效改进。堆的定义如下:具有n个元素的序列 (h1,h2,.,hn),当且仅当满足 (hi=h2i,hi=2i+1) 或 (hi=h2i,hi=2i+1)(i=1,2,.,n/2)时称之为堆。在这里只讨论满足前者条件的堆。由堆的定义可以看出,堆顶元素 (即第一个元素)必为最大项。 完全二叉树可以很直观地表示堆的结构。堆
6、顶为根, 其它为左子树、 右子树。初始时把要排序的数的序列看作是一棵顺序存储的二叉树,调整它们的存储顺序,使之成为一个堆,这时堆的根节点的数最大。然后将根节点与堆的最后一个节点交换。然后对前面(n-1) 个数重新调整使之成为堆。依此类推,直到只有两个节点的堆,并对它们作交换,最后得到有n 个节点的有序序列。3、实现算法的程序。详解九、附录程序源代码中4、调试程序程序调试中的错误未经记录,但存在的主要问题是数组在函数中的参数传递中出现了大量错误,另外一个就是关于Max这个全局变量的定义也存在如果分几个文件就会重定义,所以程序中就把单一归为一个文件,代码较长,不易阅读。以下是各步骤的程序运行截图
7、:1.进入程序名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 21 页 - - - - - - - - - 2.随机数排序第一组数据:随机数3.用户数据排序a. 第二组数据 12 65 39 73 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 21 页 - - - - - - - - - b.第三组数据45 89 63 名师资料总结 - - -精品
8、资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 21 页 - - - - - - - - - c. 第四组数据 11 23 15 69 54 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 21 页 - - - - - - - - - d.第五组数据6 2 9 11 23 14 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - -
9、 - - - 名师精心整理 - - - - - - - 第 6 页,共 21 页 - - - - - - - - - e.第六组数据25 32 28 51 45 69 12 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 21 页 - - - - - - - - - 5、比较各算法中的关键字比较次数和关键字移动次数(1)冒泡排序是就地排序,是稳定的排序。算法的最好时间复杂度: 若文件的初始状态是正序的 , 一趟扫描即可完成排序。所需的关键字比较次数C 和记录移动次数M均达
10、到最小值,即 C(min)=n-1, M(min)=0。冒泡排序最好的时间复杂度为(n)。算法名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 21 页 - - - - - - - - - 的最坏时间复杂度: 若初始文件是反序的,需要进行n-1 趟排序。每趟排序要进行n-1 次关键字的比较(1=i=n-1),且每次比较都必须移动记录3 次。 在这种情况下,比 较 和 移动 次 数均 达 到最 大 值 ,即C(max)=n(n-1)/2=O(n2),M(max)=3n(n-1
11、)/2=O(n2)。冒泡排序的最坏时间复杂度为(n2)。算法的平均时间复杂度为(n2)。虽然冒泡排序不一定要进行 n-1 趟,但由于它的记录移动次数较多,故平均时间性能比直接插入排序要差得多。(2)直接插入排序插入排序算法适用于少量数据排序,它的时间复杂度为(m2 ),是稳定的排序方法。(3)简单选择排序排序过程中,所需进行记录移动的操作次数较少,其最小值为0,最大值为3(n-1 )。然而,无论记录的初始排列如何所需进行的关键字间的比较次数相同,均为 n(n-1 )/2. 因此,总的时间复杂度也是(n2)(4)快速排序是对冒泡排序算法的一种改进,基于“分治法”的思想。快速排序每次将待排序数组分
12、为两个部分,在理想状况下, 每一次都将待排序数组划分成等长两个部分,则需要 logn次划分。而在最坏情况下,即数组已经有序或大致有序的情况下,每次划分只能减少一个元素,快速排序将不幸退化为冒泡排序,所以快速排序时间复杂度下界为O(nlogn) ,最坏情况为O(n2) 。在实际应用中,快速排序的平均时间复杂度为O(nlogn) 。快速排序在对序列的操作过程中只需花费常数级的空间。空间复杂度 S(1) 。但需要注意递归栈上需要花费最少logn 最多 n 的空间。(5)希尔排序该方法实质上是一种分组插入方法。Shell排序的时间性能优于直接插入排序,据统计分析其时间复杂度为O(n1.3) 。希尔排序
13、是一种不稳定的算法。(6)堆排序在构建堆的过程中,因为我们是完全二叉树从最下层最右边的非终端结点开始构建, 将它与其孩子进行比较和若有必要的互换,对于每个非终端结点来说,其实最多进行两次比较和互换操作,因此整个构建堆的时间复杂度为O(n) 。在正式排序时,第 i 次取堆顶记录重建堆需要用O(logi)的时间(完全二叉树的某个结点到根结点的距离为 .log2i.1),并且需要取n1 次堆顶记录,因此,重建堆的时间复杂度为O(nlogn) 。所以总体来说,堆排序的时间复杂度为O(nlogn) 。由于堆排序对原始记录的排序状态并不敏感,因此它无论是最好、最坏和平均时间复杂度均为O(nlogn) 。这
14、在性能上显然要远远好过于冒泡、简单选择、直接插入的O(n2) 的时间复杂度了。综合分析:排序方法平均情况最 好 情况最 坏 情况辅助空间直 接 插入 排序O(n2) O(n) O(n2) O(1) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 21 页 - - - - - - - - - 希尔排序O(nlog2n)O(n2) O(n1. 3) O(n2) O(1) 起泡排序O(n2) O (n) O(n2) O(1) 快速排序O(nlog2n) O(nlog2n) O(
15、n2) O(log2n) O(n) 简 单 选择 排序O(n2) O(n2) O(n2) O(1) 堆排序O(nlog2n) O(nlog2n) O (nlog2n) O(1) 归并排序O(nlog2n) O(nlog2n) O(nlog2n) O(n) 1.O(n2) 性能分析平均性能为O(n2) 的有:直接插入排序,选择排序,冒泡排序在数据规模较小时,直接插入排序,选择排序差不多。当数据较大时,冒泡排序算法的时间代价最高。性能为O(n2) 的算法基本上是相邻元素进行比较,基本上都是稳定2.O(nlogn)性能分析平均性能为O(nlogn) 的有:快速排序,归并排序,希尔排序,堆排序。其中,
16、快排是最好的,其次是归并和希尔,堆排序在数据量很大时效果明显。这四种排序可看作为“先进算法”,其中,快排效率最高,但在待排序列基本有序的情况下,会变成冒泡排序,接近 O(n2). 希尔排序对增量的标准没有较为满意的答案,增量对性能会有影响。归并排序效率非常不错,在数据规模较大的情况下,比希尔排序和堆排序要好。多数先进的算法都是因为跳跃式的比较,降低了比较次数,但牺牲了排序的稳定性。3. 稳定性插入排序,冒泡排序,二叉树排序,归并排序都是稳定的选择排序,希尔排序,快速排序,堆排序是不稳定的。4. 排序算法选择a. 数据规模较小(1)待排序列基本序的情况下,可以选择直接插入排序;(2)对稳定性不作
17、要求宜用选择排序,对稳定性有要求宜用插入或冒泡b. 数据规模不是很大(1)完全可以用内存空间,序列杂乱无序,对稳定性没有要求,快速排序,此时要付出log (N)的额外空间。(2)序列本身可能有序,对稳定性有要求,空间允许下,宜用归并排序c. 海量级别的数据,必须按块放在外存上(1)对稳定性有求,则可考虑归并排序。(2)对稳定性没要求,宜用堆排序7. 实验总结排序是数据结构最基础的应用也是其应用在其他领域的基础。该实验主要通过对各种排序算法的实现加强对算法思想的理解。同时提高编程能力。在实验中,遇到的问题很多,部分程序还是从网上寻找的,主要的排序实现参考了数据结构C+ 的书籍,总的说来,经过一学
18、期的数据结构课程的学习,对数据结构有了初步的了解,但是还很不够,需要自己在以名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 21 页 - - - - - - - - - 后的时间里继续加强对数据结构的学习,对算法思想的领悟,配合不断地时间编程来提高自身的综合能力。八、思考题1、试着将数据按散列法存储,并设计好解决冲突的方法,在此基础上实现增、删查询等操作。2、试构造存放C 语言中 32 个关键字的查找表,并希望达到的平均查找长度不超过2。九、附录1. 程序简说:a. 测
19、试排序运行时间:获取当前系统时间,精确到微秒, 分别在代码运行前后调用记录前后时间,再相减即可得到代码运行时间。此处调用函数QueryPerformanceCounter()用于得到高精度计时器的值。 b.程序如何提高性能试图寻求最简短的代码以实现多达七种排序算法的简单调用、乱序和顺序以及逆序数据的分别排序和性能指标统计、算法时间的精确而简易的统计、算法移动次数和比较次数的精确统计。如果设计不合理,将使得主调函数的调用代码冗长,可读性变差。采用以下三种方法实现:(1)使用函数指针数组,分别指向各排序函数的入口地址,然后在Statistics()函数中加以调用, 使得排序函数运行在统计时间函数之
20、间,这样使用一个for语句即可实现七种算法的一次性调用、时间统计、移动次数和比较次数统计。C+实现:void Statistics(Sort &obj,int i,int j) obj.startTime=obj.GetNowTime(); (obj.*pFunctioni)(obj.pRandom1); obj.endTime=obj.GetNowTime(); obj.runtimeij=obj.endTime-obj.startTime; (2)使用两个数组实现乱序、顺序以及逆序数据的排序,大大节省了空间的消耗。基本思想为:随机序列产生一个指定长度的乱序序列,然后通过memcpy()函数
21、拷贝到第二个数组里, 第二个数组作为乱序序列的保存数组,每次对第一个数组进行排序,之后拷贝第二个数组中的乱序序列到第一个数组,实现各次乱序排列。只要算法正确 (第一步可以检验),之后顺序排列只需反复对第一个数组进行操作即可,再后用第二个数组保存逆序数组, 然后同样在每次排序之后复制第二数组存储的乱序序列到第一组,对第一组反复排序即可。C+实现:请参看源代码。(3)建立两个数组分别统计运行次数,再统一使用一个数组记录七种算法在三种不同数据情况下的移动次数和交换次数。在分别运行乱序、顺序和逆序数组排序时取出前两个数组的值写入第三个数组,然后置零继续统计。C+实现:名师资料总结 - - -精品资料欢
22、迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 21 页 - - - - - - - - - 请参看源代码。2. 源代码#include #include #include #include #include #include #include #include #include using namespace std; /构造函数int Max; class Sort public: Sort(); Sort(); void Create1(); void Create2(); int InsertS
23、ort(long int ); /直接插入排序int ShellSort(long int ); /希尔排序int BubbleSort(long int ); /冒泡排序int QuickSort(long int ); /快速排序int QuickSortRecursion(long int , int ,int); int QuickSortPatition(long int , int , int ); int SelectSort(long int ); /选择排序int HeapSort(long int ); /堆排序void HeapSortSift(long int , in
24、t , int ); long double GetNowTime(void); void PrintArray(long int*); void SetTimesZero(); void RecordTimes(int); friend void Statistics(Sort &,int ,int); void PrintStatistics(char *); friend int main(); private: long int *pRandom1; long int *pRandom2; long double runtime63; int comparetimes6; int mo
25、vetimes6; int timestable66; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 21 页 - - - - - - - - - long double startTime,endTime; ; Sort:Sort() memset(timestable,0,sizeof(int)*6*6);/将 timesetable 置零 /构造数组void Sort:Create1() /随机产生的数构成数组 pRandom1=new long intMax+
26、1; pRandom2=new long intMax+1; srand(unsigned)time(NULL); /产生随机数for(int i=0; i=Max;i+ ) pRandom2i=rand(); cout 随机乱序数组如下:n; / 输出原始数组PrintArray(pRandom2); void Sort:Create2() /用户输入产生的数组 pRandom1=new long intMax+1; pRandom2=new long intMax+1; for (int i=1;iusernum; pRandom2i=usernum; cout 您刚才输入的数组如下:n;
27、 / 输出原始数组PrintArray(pRandom2); /直接插入排序int Sort:InsertSort(long int parray) int j=0; for(int i =2; i=Max;i+) parray0=parrayi; comparetimes0+; /比较次数for(j=i-1;parray0=1;d/=2) for(int i=d+1;i0 & parray0parrayj;j-=d) /记录后移 ,寻找插入位置 parrayj+d=parrayj; movetimes1+; parrayj+d=parray0; /插入movetimes1+=2; /每次插入
28、移动2 个位置 return 0; /冒泡排序int Sort:BubbleSort(long int parray) int exchange=Max; int bound,j; while(exchange) bound=exchange; exchange=0; for(j=1;jparrayj+1) /交换 parray0=parrayj; parrayj=parrayj+1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 21 页 - - - - - - -
29、 - - parrayj+1=parray0; exchange=j; movetimes2+=3; /每次移动三个位置 return 0; /快速排序int Sort:QuickSort(long int parray) QuickSortRecursion(parray,1, Max); return 0; int Sort:QuickSortRecursion(long int parray, int first=1, int end=Max) if (firstend) int pivot=QuickSortPatition(parray, first, end); QuickSort
30、Recursion(parray, first, pivot-1);/左侧子序列排序QuickSortRecursion(parray, pivot+1, end); /右侧子序列排序 return 0; int Sort:QuickSortPatition(long int r, int first, int end ) int i=first; int j=end; int temp; while (ij) while (ij & ri= rj) j-; comparetimes3+; /右侧扫描if (ij) temp=ri; /将较小记录交换到前面ri=rj; rj=temp; i+;
31、 movetimes3+=3; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 21 页 - - - - - - - - - while (ij & ri= rj) i+; comparetimes3+; /左侧扫描if (ij) temp=rj; rj=ri; ri=temp; /将较大记录交换到后面j-; movetimes3+=3; /每次移动三个位置 return i; /i 为轴值记录的最终位置 /选择排序int Sort:SelectSort(long in
32、t parray) int i,j,index,temp; for (i=1; iMax; i+) /对 n 个记录进行n-1 趟简单选择排序 index=i; for (j=i+1; j=Max; j+) comparetimes4+; /在无序区中选取最小记录if (parrayj=1; i-) /把数组建成大顶堆HeapSortSift(parray, i, Max) ; for (i=1; iMax; i+) /把堆顶记录和当前未经排序子序列中最后一个记录交换 parray0=parrayMax-i+1; parrayMax-i+1=parray1; parray1=parray0;
33、movetimes5+=3; HeapSortSift(parray, 1, Max-i); /依次迭代 return 0; / void Sort:HeapSortSift(long int parray, int k, int m) int i,j; i=k; j=2*i; /置 i 为要筛的结点,j 为 i 的左孩子while (j=m) /筛选还没有进行到叶子 if (jm & parrayjparrayj) comparetimes5+; break; /根结点已经大于左右孩子中的较大者else parray0=parrayi; parrayi=parrayj; parrayj=pa
34、rray0; movetimes5+=3; i=j; j=2*i; /被筛结点位于原来结点j 的位置 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 21 页 - - - - - - - - - /获取当前时间long double Sort:GetNowTime(void) LARGE_INTEGER litmp; LONG64 QPart; QueryPerformanceCounter(&litmp); QPart=litmp.QuadPart; return (
35、long double)QPart; /打印数组void Sort:PrintArray(long int *pRandom) for(int j=1;j=Max;j+)coutpRandomjt; coutendl; /数组置零函数void Sort:SetTimesZero() memset(comparetimes,0,sizeof(int)*6); /每次排序时将comparetimes 和 movetimes数组置零memset(movetimes,0,sizeof(int)*6); /记录比较和移动次数void Sort:RecordTimes(int j) for(int i=0
36、;i6;i+) timestableij=movetimesi; timestableij+1=comparetimesi; /输出排序数据void Sort:PrintStatistics(char* funcname) int i(0),j(0); cout endl; cout 排序方法乱序耗时 (s) 顺序耗时 (s)逆序耗时 (s) endl; for(i=0;i6;i+) cout funcnamei setw(8)setiosflags(ios:fixed)setprecision(0) setiosflags(ios:left)runtimei0 setw(8)runtimei
37、1 setw(8)runtimei2 endl; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 21 页 - - - - - - - - - cout endl; cout 移动次数统计表endl; cout 排序方法 t 乱序序列 t 顺序序列逆序序列 tendl; for(i=0;i6;i+) coutfuncnamei; for(j=0;j6;j+=2) couttttimestableij; coutendl; cout 比较次数统计表endl; cout 排
38、序方法乱序序列顺序序列逆序序列endl; for(i=0;i6;i+) coutfuncnamei; for(j=1;j6;j+=2) couttttimestableij; coutendl; /类的析构函数Sort:Sort() delete pRandom1; delete pRandom2; /排序算法数组 ,以便一次性调用全部排序算法static int (Sort:*pFunction6)(long int )=&Sort:InsertSort,&Sort:ShellSort,&Sort:BubbleSort,&Sort:QuickSort,&Sort:SelectSort,&So
39、rt:HeapSort; char *funcName7=1 、插入排序 :,2、希尔排序 :,3 、冒泡排序 :,4 、快速排序 :,5、选择排序 :,6、堆排 序:; /统计时间函数void Statistics(Sort &obj,int i,int j) obj.startTime=obj.GetNowTime(); (obj.*pFunctioni)(obj.pRandom1); obj.endTime=obj.GetNowTime(); obj.runtimeij=obj.endTime-obj.startTime; /主调函数int main() 名师资料总结 - - -精品资料
40、欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 21 页 - - - - - - - - - start: cout endl; cout 排序算法性能比较器endl; cout 1.随机数排序2.用户输入数排序endl; cout select; Sort obj; switch(select) case 1: coutMax; cout 默认产生 Max 个随机数 endl; obj.Create1(); memcpy(obj.pRandom1,obj.pRandom2,(Max+1)*sizeo
41、f(long int); /复制数组break; case 2: coutMax; cout 请输入数字 :endl; obj.Create2(); memcpy(obj.pRandom1,obj.pRandom2,(Max+1)*sizeof(long int); /复制数组break; default: cout 您的选择有误 ,请再次输入 :; goto start; int i(0),j(0); /乱序序列obj.SetTimesZero(); for(i=0;i6;i+) Statistics(obj,i,0); coutfuncNamein; /输出各排序结果obj.PrintAr
42、ray(obj.pRandom1); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 20 页,共 21 页 - - - - - - - - - if(i!=6) memcpy(obj.pRandom1,obj.pRandom2,(Max+1)*sizeof(long int); obj.RecordTimes(0); /顺序序列obj.SetTimesZero(); for( i=0;i6;i+) Statistics(obj,i,1); obj.RecordTimes(2); /
43、逆序序列obj.SetTimesZero(); for(i=1;i=Max;i+) obj.pRandom2i=obj.pRandom1Max+1-i; memcpy(obj.pRandom1,obj.pRandom2,(Max+1)*sizeof(long int); for(i=0;i6;i+) Statistics(obj,i,2); memcpy(obj.pRandom1,obj.pRandom2,(Max+1)*sizeof(long int); obj.RecordTimes(4); /统计排序数据obj.PrintStatistics(funcName); return 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 21 页,共 21 页 - - - - - - - - -