C++ 语法基础(二)(三)

简介: C++ 语法基础(二)(三)

设计自己的库

库的概念


库:常用的工具


库的主题:同一个库中的函数都应该是处理同一类问题,自己设计的库也要有一个主题


库的通用性:在某一应用程序中提取库内容时应尽量考虑到兼容更多的应用,使其他应用程序也能共享这个库


库的设计和实现


设计库的接口:库的用户必须了解的内容,包括库中函数的原型、这些函数用到的符号常量和自定义类型,接口表现为一个头文件


设计库中的函数的实现:表现为一个源文件


库的这种实现方法称为信息隐藏



image.png



接口文件


头文件的格式


注释


头文件头上有段注释,说明库的主题、功能


每个函数声明前有一段注释,告诉用户如何使用这些函数


随机函数库接口文件

//文件: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

龟兔赛跑规则


image.png


解题思路


分别用变量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';
}


相关文章
|
12天前
|
编译器 C++ 容器
C++语言的基本语法
想掌握一门编程语言,第一步就是需要熟悉基本的环境,然后就是最重要的语法知识。 C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。 对象 - 对象具有状态和行为。例如:一只狗的状态 - 颜色、名称、品种,行为 - 摇动、叫唤、吃。对象是类的实例。 类 - 类可以定义为描述对象行为/状态的模板/蓝图。 方法 - 从基本上说,一个方法表示一种行为。一个类可以包含多个方法。可以在方法中写入逻辑、操作数据以及执行所有的动作。 即时变量 - 每个对象都有其独特的即时变量。对象的状态是由这些即时变量的值创建的。 完整关键字
29 2
|
1月前
|
Java 编译器 程序员
C++中的语法知识虚继承和虚基类
**C++中的多继承可能导致命名冲突和数据冗余,尤其在菱形继承中。为解决这一问题,C++引入了虚继承(virtual inheritance),确保派生类只保留虚基类的一份实例,消除二义性。虚继承通过`virtual`关键字指定,允许明确访问特定路径上的成员,如`B::m_a`或`C::m_a`。这样,即使基类在继承链中多次出现,也只有一份成员副本,简化了内存布局并避免冲突。虚继承应在需要时提前在继承声明中指定,影响到从虚基类派生的所有后代类。**
44 7
|
1月前
|
编译器 C++ 开发者
C++一分钟之-属性(attributes)与属性语法
【7月更文挑战第3天】C++的属性(attributes)自C++11起允许附加编译器指令,如`[[nodiscard]]`和`[[maybe_unused]]`,影响优化和警告。注意属性放置、兼容性和适度使用,以确保代码清晰和可移植。示例展示了如何使用属性来提示编译器处理返回值和未使用变量,以及利用编译器扩展进行自动清理。属性是提升代码质量的工具,但应谨慎使用。
49 13
|
2月前
|
编译器 程序员 C++
C++一分钟之-属性(attributed)与属性语法
【6月更文挑战第28天】C++的属性为代码添加元数据,帮助编译器理解意图。C++11引入属性语法`[[attribute]]`,但支持取决于编译器。常见属性如`nodiscard`提示检查返回值,`maybe_unused`防止未使用警告。问题包括兼容性、过度依赖和误用。使用属性时需谨慎,确保团队共识,适时更新以适应C++新特性。通过示例展示了`nodiscard`和`likely/unlikely`的用法,强调正确使用属性能提升代码质量和性能。
52 13
|
2月前
|
编译器 C语言 C++
|
2月前
|
存储 自然语言处理 编译器
【C++语言1】基本语法
【C++语言1】基本语法
|
3月前
|
编译器 C语言 C++
C++的基本特性和语法
C++的基本特性和语法
46 1
|
3月前
|
存储 C++ 容器
【C++从练气到飞升】09---string语法指南(二)
【C++从练气到飞升】09---string语法指南(二)
|
3月前
|
存储 Linux C语言
【C++从练气到飞升】09---string语法指南(一)
【C++从练气到飞升】09---string语法指南(一)