【项目1 - C/C++语言中函数参数传递的三种方式】
  C语言提供了两种函数参数传递的方式:传值和传地址。在C++中,又拓展了引用方式。通过本项目,确认自己已经掌握了这三种方式的原理,为后续学习做好准备。
  下面是希望能够交换两个整型变量的swap函数的三个版本(从课程主页中可以找到项目链接,复制后就能调试,不必费事敲代码):

//(1)传值
void myswap(int x, int y)
{int t;t=x;x=y;y=t;
}
//(2)传地址
void myswap(int *p1, int *p2)
{int  t;t=*p1;*p1=*p2;*p2=t;
}
//(3)引用作形参
void myswap(int &x, int &y)
{int t;t=x;x=y;y=t;
}

  下面是调用它们的main()函数:

int main()
{int a, b;printf("请输入待交换的两个整数:");scanf("%d %d", &a, &b);__________________;  //分三个程序,分别写上调用myswap的合适形式printf("调用交换函数后的结果是:%d 和 %d\n", a, b);return 0;
}

  请编制三个程序,分别调用三个版本的交换函数,观察结果。发布博文,展示程序及运行结果,解释成功交换以及交换不成功的原因。请在纸上画出调用过程中各变量的变化过程。
  如果自己不能做出解释,务必找“兄弟”帮忙,拿下这座小山头。

【项目2 - 程序的多文件组织】
  学习数据结构,目标就是要编制出有相当规模的程序的。将所有的代码放在一个文件中的做法,不能适用现阶段的需求了。
  通过这个项目,确认有能力用多文件组织程序。方便以后各章,我们就某一数据结构定义算法库,并能引用算法库进行实践。
  最简单的多文件组织,一个项目中有3个文件:
  (1) .h 头文件:定义数据类型、声明自定义函数、定义宏等
  (2).cpp 源文件1:用于实现头文件中声明的自定义函数
  (3).cpp 源文件2:定义main()函数,用于调用相关函数,实现问题求解目标。
  请将例1.13中按方案3实现的程序,用多文件形式组织并运行。   
  在需要的地方,用 #include “自定义头文件”,使文件之间的内容能“合起来”完成任务。
  如果不能熟练完成,请参考《CodeBlocks中程序的多文件组织》一文。
  下面是写在一个文件中的程序:

#include <stdio.h>
#define MaxStud 50      //学生人数最多为50
#define MaxCour 300     //学生成绩记录数最多为50*6
struct stud1
{int no;         //学号char name[10];  //姓名int bno;        //班号
};
struct stud2
{int no;         //学号int cno;        //课程编号int deg;        //分数
};double studavg(struct stud2 s2[],int m,int i)   //求学号为i的学生的平均分
{int j,n=0;              //n为学号为i的学生选学课程数double sum=0;           //学号为i的学生总分for (j=0; j<m; j++)if (s2[j].no==i)    //学号为i时统计{n++;sum+=s2[j].deg;}return(sum/n);
}
double couravg(struct stud2 s2[],int m,int i)   //求编号为i的课程的平均分
{int j,n=0;              //n为编号为i的课程选修人数double sum=0;           //编号为i的课程总分for (j=0; j<m; j++){if (s2[j].cno==i)   //课程编号为i时统计{n++;sum+=s2[j].deg;}}return(sum/n);
}
void allavg(struct stud1 s1[],int n,struct stud2 s2[],int m)    //求学生平均分和课程平均分
{int i,j;printf("学生平均分:\n");printf("  学号     姓名 平均分\n");i=0;while (i<n){j=s1[i].no;printf("%4d %10s %g\n",s1[i].no,s1[i].name,studavg(s2,m,j));i++;}printf("课程平均分:\n");for (i=1; i<=6; i++)printf(" 课程%d:%g\n",i,couravg(s2,m,i));
}int main()
{int n=7;        //学生记录人数int m=21;       //学生成绩记录数struct stud1 s1[MaxStud]={{1,"张斌",9901},{8,"刘丽",9902},{34,"李英",9901},{20,"陈华",9902},{12,"王奇",9901},{26,"董强",9902},{5,"王萍",9901}};struct stud2 s2[MaxCour]=   //规定课程的编号从1到6,同一学生成绩记录连续存放{{1,1,67},{1,2,98},{1,4,65},{8,1,98},{8,3,90},{8,6,67},{34,2,56},{34,4,65},{34,6,77},{20,1,68},{20,2,92},{20,3,64},{12,4,76},{12,5,75},{12,6,78},{26,1,67},{26,5,78},{26,6,62},{5,1,94},{5,2,92},{5,6,89}};allavg(s1,n,s2,m);return 0;
}

【项目3 - 体验复杂度】
  (1)两种排序算法的运行时间
  排序是计算机科学中的一个基本问题,产生了很多种适合不同情况下适用的算法,也一直作为算法研究的热点。本项目提供两种排序算法,复杂度为O(n2)的选择排序selectsort,和复杂度为O(nlogn)的快速排序quicksort,在main函数中加入了对运行时间的统计。
  请阅读后附的程序1和程序2,利用一个将近10万条数据的文件作为输入数据运行程序,感受两种算法在运行时间上的差异。

(2)汉诺塔
  有一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
  可以算法出,当盘子数为n个时,需要移动的次数是f(n)=2n−1。n=64时,假如每秒钟移一次,共需要18446744073709551615秒。一个平年365天有31536000秒,闰年366天有31622400秒,平均每年31556952秒,移完这些金片需要5845.54亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.54亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。据此,2n从数量级上看大得不得了。
  用递归算法求解汉诺塔问题,其复杂度可以求得为O(2n),是指数级的算法。请到课程主页下载程序运行一下,体验盘子数discCount为4、8、16、20、24时在时间耗费上的差异,你能忍受多大的discCount。
  源程序见附后的程序3。

附:项目3的程序1——复杂度是O(n2)的选择排序程序 运行中需要的数据文件

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define MAXNUM 100000
void selectsort(int a[], int n)
{int i, j, k, tmp;for(i = 0; i < n-1; i++){k = i;for(j = i+1; j < n; j++){if(a[j] < a[k])k = j;}if(k != j){tmp = a[i];a[i] = a[k];a[k] = tmp;}}
}int main()
{int x[MAXNUM];int n = 0;double t1,t2;FILE *fp;fp = fopen("numbers.txt", "r");if(fp==NULL){printf("打开文件错!请下载文件,并将之复制到与源程序文件同一文件夹下。\n");exit(1);}while(fscanf(fp, "%d", &x[n])!=EOF)n++;printf("数据量:%d, 开始排序....", n);t1=time(0);selectsort(x, n);t2=time(0);printf("用时 %d 秒!", (int)(t2-t1));fclose(fp);return 0;
}

附:项目3的程序2——复杂度为O(nlogn)的快速排序程序 运行中需要的数据文件

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define MAXNUM 100000
void quicksort(int data[],int first,int last)
{int i, j, t, base;if (first>last)return;base=data[first]; i=first;j=last;while(i!=j) {while(data[j]>=base && i<j) j--;while(data[i]<=base && i<j) i++;/*交换两个数*/if(i<j){t=data[i];data[i]=data[j];data[j]=t;}}data[first]=data[i]; data[i]=base; quicksort(data,first,i-1);quicksort(data,i+1,last);
}int main()
{int x[MAXNUM];int n = 0;double t1,t2;FILE *fp;fp = fopen("numbers.txt", "r");if(fp==NULL){printf("打开文件错!请下载文件,并将之复制到与源程序文件同一文件夹下。\n");exit(1);}    while(fscanf(fp, "%d", &x[n])!=EOF)n++;printf("数据量:%d, 开始排序....", n);t1=time(0);quicksort(x, 0, n-1);t2=time(0);printf("用时 %d 秒!", (int)(t2-t1));fclose(fp);return 0;
}

附:项目3的程序3——汉诺塔程序

#include <stdio.h>
#define discCount 4
long move(int, char, char,char);
int main()
{long count;count=move(discCount,'A','B','C');printf("%d个盘子需要移动%ld次\n", discCount, count);return 0;
}long move(int n, char A, char B,char C)
{long c1,c2;if(n==1)return 1;else{c1=move(n-1,A,C,B);c2=move(n-1,B,A,C);return c1+c2+1;}
}

数据结构 实践项目——数据结构、算法、程序设计相关推荐

  1. [数据结构实践项目]变态的停车场管理系统

    [数据结构实践项目]变态的停车场管理系统 项目简介 设停车场是一个可以停放 n 辆汽车的南北方向的狭长通道,且只有一个大门可供汽车进出.汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在 ...

  2. 数据结构实践项目——图的基本运算及遍历操作

    本文是针对[数据结构基础系列(7):图]中第1-9课时的实践项目. 0701 图结构导学 0702 图的定义 0703 图的基本术语 0704 图的邻接矩阵存储结构及算法 0705 图的邻接表存储结构 ...

  3. 数据结构实践项目:校园路线导航图

    题目: 23.校园路线导游系统 1.问题描述 用无向网表示东莞理工学院的校园景点平面图,图中顶点表示主要景点(要求包 含学校的大部分景点信息,包括教学楼,体育馆,食堂,学生宿舍,图书馆等信息), 存放 ...

  4. 第八周实践项目9 算法库——广义表

    /* *Copyright (c) 2017,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:项目9- *作 者:邵雪源 *完成日期:2017年12月14日 *版 ...

  5. 第四周实践项目2 算法库——单链表

    /*首先设计测试函数,可以涉及初始化线性表.销毁线性表.输出线性表.插入数据元素对应的函数*/ #include <stdio.h> #include <malloc.h> t ...

  6. 数据结构实践——稀疏矩阵相加

    本文针对数据结构基础系列网络课程(5):数组与广义表的实践项目. [项目 - 稀疏矩阵相加] 采用三元组存储稀疏矩阵,设计两个稀疏矩阵相加的运算算法 提示1:两个行数.列数相同的矩阵可以相加 提示2: ...

  7. 给数据结构初学者:跨过算法和程序之间的鸿沟

    [摘要]学习数据结构时,将各种基本操作通过程序实现,可以加深对算法的理解,也是提高编程能力的一种有效手段.针对初学者在搭建算法和程序之间联系困难的问题,本文以线性表部分为例,介绍了如何从读算法中找出实 ...

  8. 数据结构实践——队列数组

    本文是针对数据结构基础系列网络课程(3):栈和队列的实践项目. [项目 - 队列数组] 创建10个队列,分别编号为0-9(处理为队列数组,编号即下标).输入若干个正整数,以数字0作为结束.设输入的值为 ...

  9. 【算法与数据结构专场】BitMap算法基本操作代码实现

    上篇我们讲了BitMap是如何对数据进行存储的,没看过的可以看一下[算法与数据结构专场]BitMap算法介绍 这篇我们来讲一下BitMap这个数据结构的代码实现. 回顾下数据的存储原理 一个二进制位对 ...

最新文章

  1. 深入理解:RabbitMQ的前世今生
  2. mpython_mPython下载 mPython(图形化编程软件) v0.5.0 官方安装版 下载-脚本之家
  3. POJ 3080 Blue Jeans (多个字符串的最长公共序列,暴力比较)
  4. jzoj5097-[GDOI2017day1]取石子游戏【并查集,LCA】
  5. kotlin编程语言_Kotlin初学者编程基础
  6. Jeecg-Boot 快速开发平台,前后端分离—开发环境搭建
  7. tensorflow.python.framework.errors_impl.NotFoundError: Failed to create a directory: ../user_data\co
  8. 基于mysql的淘宝用户、商品、平台价值分析
  9. 计算机网络选择公用还是家庭,如何设置打印机共享?
  10. 星空编程 小甲鱼c语言,c++快速入门(小甲鱼)
  11. python五子棋双人对弈_用python实现双人五子棋(终端版)
  12. C++学生类和成绩排序
  13. 超详细测试项目——Web电商项目测试点整理.....
  14. Shopee怎么发货?虾皮无货源怎么发货?
  15. 开关量模块在报警系统中的应用
  16. 阿里大鱼短信发送接口开发
  17. 带‘’文件”APP的苹果手机和电脑之间的文件互传
  18. 大长今(汤灿版) 歌词
  19. Linux内核分析 读书笔记 (第十八章)
  20. excel转pdf(解决导出的pdf和excel格式不一致问题)

热门文章

  1. png文件头_Golang GinWeb框架7静态文件/模板渲染
  2. tmadmin: command not found和tmadmin: error while loading shared libraries: libgpnet.so
  3. java list 去除 重复值
  4. 北京市强化电信用户信息安全保护
  5. sp根据备份文件来创建DB
  6. MyGui 3.2.0(OpenGL平台)的编译
  7. 项目管理笔记(观念)
  8. Go Elasticsearch 快速入门
  9. 浅谈Python-IO多路复用(select、poll、epoll模式)
  10. Luogu2261 [CQOI2007]余数求和