写在前面:仅为个人代码/总结,未必标准,仅供参考!如有错误,还望指出交流,共同进步!
最小差值
【问题描述】
对于给定n个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值。请基于线性表ADT完成程序设计。
【问题分析】
① 处理对象:n个正整数
② 实现的功能:通过线性表的功能找出n个数据中相差(差的绝对值)最小的两个数,并输出它们差值的绝对值。
③ 处理后的数据结果以一个整数的形式输出。
④ 设计求解方法(算法思想):首先将输入的n个数据依次插入顺序表表尾,声明变量Min并初始化为顺序表前两个元素的差值的绝对值,然后依次计算n个数据两两差值的绝对值并与Min进行比较,若存在比Min小的差值则以此值更新Min的值。
样例求解:
5
1 5 4 8 20
求解过程:
声明变量min=fabs(1-5)=4;
fabs(1-4)=3<4,min=3;f
abs(1-8)=7;
fas(1-20)=19;f
abs(5-4)=1<3,min=3;
fabs(5-8)=3;
fabs(5-20)=15;
fabs(4-8)=4;
fabs(4-20)=16;
fabs(8-20)=12;
最终结果为1。
【抽象数据类型设计】
① 数据对象的结构特征:输入的n个正整数为线性结构。
② ADT设计:
1) 数据对象:int类型的正整数
2) 数据关系:n个整数以输入的顺序插入表尾形成前后关系
3) 基本操作:
a. Append():在线性表末尾插入新的元素,输入为新元素,输出为长度增1的顺序表
b. 获取当前元素的值getValue():获取curr位置的元素的值;
c. 移动curr到表头moveToStart():将curr指向表头元素;
d. 移动curr到指定位置moveToPos(int):将curr指向指定位置的元素;
e. curr往后移动以为next():将curr指向下一个元素;
【基于ADT的成员函数设计定义(以顺序表为例)】
Append():
void Append(const E&it)//在顺序表尾追加it
{
assert(listSize<maxSize);
listArray[listSize++]=it;
}
getValue()
const E& getValue() const
{
assert((curr>=0)&&(curr<listSize));
return listArray[curr];
}
moveToStart()
void moveToStart(){
curr=0;}
moveToPos()
void moveToPos(int pos)
{
assert((pos>=0)&&(pos<=listSize));
curr=pos;
}
next()
void next(){
if(curr<listSize) curr++;}
【核心代码】
①依次将n个元素插入顺序表表尾:
for(int i=0;i<n;i++)
{
cin>>m;//输入数据
L.Append(m);//调用Append()函数
}
②声明变量Min并初始化为顺序表前两个元素的差值的绝对值:
int u=L.getValue();//获取顺序表表头元素的值
L.next();//调用next()函数
int v=L.getValue();//获取顺序表第二个元素的值
int Min=fabs(u-v);//声明并初始化
L.moveToStart();
③依次计算n个数据两两差值的绝对值并与Min进行比较,实时更新Min的取值:
L.moveToStart();//将curr移到表头
//计算当前元素与其后面的每个元素的差值的绝对值
for(int i=0;i<n-1;i++)
{
L.moveToPos(i);//将curr移到指定位置
int a=L.getValue();//获取当前位置的元素的值
for(int j=i+1;j<n;j++)
{
L.next();//curr后移
int b=L.getValue();//获取i之后某个元素的值
int c=fabs(a-b);//计算差值
if(c<Min) {
Min=c;}//更新Min值
}
}