设计自己的库
库的概念
库:常用的工具
库的主题:同一个库中的函数都应该是处理同一类问题,自己设计的库也要有一个主题
库的通用性:在某一应用程序中提取库内容时应尽量考虑到兼容更多的应用,使其他应用程序也能共享这个库
库的设计和实现
设计库的接口:库的用户必须了解的内容,包括库中函数的原型、这些函数用到的符号常量和自定义类型,接口表现为一个头文件
设计库中的函数的实现:表现为一个源文件
库的这种实现方法称为信息隐藏
接口文件
头文件的格式
注释
头文件头上有段注释,说明库的主题、功能
每个函数声明前有一段注释,告诉用户如何使用这些函数
随机函数库接口文件
//文件:Random.h //随机函数库的头文件 #ifndef _random_h #define _random_h //函数:RandomInit //用法:RandomInit() //作用:此函数初始化随机数种子 void RandomInit(); //函数:RandomInteger //用法:n = RandomInteger(low, high) //作用:此函数返回一个 low 到 high 之间的随机数,包括 low 和 high int RandomInteger(int low, int high); #endif
库的实现
实现文件名:与头文件的名字是相同
实现文件的格式
注释(这一部分简单介绍库的功能)
include此cpp文件所需的头文件
每个实现要包含自己的头文件,以便编译器能检查函数定义和函数原型声明的一致性
每个函数的实现代码(在每个函数实现的前面也必须有一段注释)
随机函数库实现文件
//文件:Random.cpp //该文件实现了Random库 #include <cstdlib> #include <ctime> #include "Random.h" //函数:RandomInit //该函数取当前系统时间作为随机数发生器的种子 void RandomInit() { srand(time(NULL)); } // 函数:RandomInteger // 该函数将0到RAND_MAX的区间的划分成high - low + 1 个 子区间。当产生的随机数落在第一个 // 子区间时,则映射成low。 当落在最后一个子区间时,映射成high。当落在第 i 个子区间时 //(i 从 0 到 high-low),则映射到low + i int RandomInteger(int low, int high) { return (low + (high - low + 1) * rand() / (RAND_MAX + 1)); }
1.统计学的一些计算在计算机的帮助下变得准确和高效,下面请给出这个有关统计学的函数库的接口文件,其中需要包含的函数和要求如下。
算数平均值计算Average():传入两个double指针代表数组的起始位置和结束位置的后一位,返回一个double表示答案
最值统计MinMax():数组表示同上,同时通过两个double的引用传递记录最小最大值的答案,无返回值
中位数统计Median():数组表示同上,返回一个double表示答案
众数统计Mode():数组表示同上,返回一个double表示答案
//文件:statistics.h //统计学函数库 #ifndef _statistics_h #define _statistics_h //函数:Average //用法:double ave = Average(double*, double*) //作用:计算从数组中所有实数的算数平均值 double Average(double *begin, double *end); //函数:MinMax //用法:MinMax(double *, double *, double &, double &) //作用:统计数组的最小最大值,并且通过引用传参得到结果 void MinMax(double *begin, double *end, double &Min, double &Max); //函数:Median //用法:double med = Median(double*, double*) //作用:计算从数组中所有实数的中位数 double Median(double *begin, double *end); //函数:Mode //用法:double mod = Mode(double*, double*) //作用:计算从数组中所有实数的众数 double Mode(double *begin, double *end); #endif
龟兔赛跑规则
解题思路
分别用变量tortoise和hare代表乌龟和兔子的当前位置
时间用秒计算
用随机数来决定乌龟和兔子在每一秒的动作
根据动作决定乌龟和兔子的位置的移动
跑道的长度设为70个点
模块划分
主模块:main
移动模块:move_tortoise、move_hare
输出模块:print_position
实现
主模块
#include "Random.h" //包含随机数库 #include <iostream> using namespace std; const int RACE_END = 70; //设置跑道的长度 int move_tortoise(); int move_hare(); void print_position(int, int, int); int main() { int hare = 0, tortoise = 0, timer = 0; RandomInit(); //随机数初始化 cout << "timer tortoise hare\n"; //输出表头 while (hare < RACE_END && tortoise < RACE_END) { tortoise += move_tortoise(); //乌龟移动 hare += move_hare(); //兔子移动 print_position(timer, tortoise, hare); ++timer; } if (hare > tortoise) cout << "\n hare wins!\n"; else cout << "\n tortoise wins!\n"; return 0; }
Move模块
用户行为生成方法
利用随机数的等概率生成0-9之间的随机数
当生成的随机数为0-4时,认为是第一种情况,5-6是第二种情况,7-9是第三种情况
// 文件名:move.cpp #include "Random.h" //本模块用到了随机函数库 int move_tortoise() { int probability = RandomInteger(0, 9); //产生0到9之间的随机数 if (probability < 5) return 3; //快走 else if (probability < 7) return -6; //后滑 else return 1; //慢走 } int move_hare() { int probability = RandomInteger(0, 9); if (probability < 2) return 0; //睡觉 else if (probability < 4) return -9; //大后滑 else if (probability < 5) return 14; //快走 else if (probability < 8) return 3; //小步跳 else return -2; //慢后滑 }
Print模块
// 文件名:print.cpp #include <iostream> using namespace std; void print_position(int timer, int t, int h) { if (timer % 6 == 0) //每隔6秒空一行 cout << endl; cout << timer << '\t' << t << '\t' << h << '\n'; }