题目一:
1:问题
设计一个点类Point,它有两个私有数据成员x和y,表示点的坐标。另一个类为直线类Line,它有三个私有数据成员A、B和C,表示直线方程Ax+By+C=0。这两个类中都说明了一个友元函数dist(),用于计算一个点到直线的距离。
2.解题思路
利用点和直线类共同的友元函数来计算距离
3.代码实现
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
class Line;
class Point
{
private:
float x,y;
public:
void in()
{
cin>>x>>y;
}
friend void dist(Point &p,Line &l);
};
class Line
{
private:
float a,b,c;
public:
friend void dist(Point &p,Line &l);
void in()
{
cin>>a>>b>>c;
}
};
void dist(Point &p,Line &l)
{
float d;
d=(l.a*p.x+l.b*p.y+l.c)/sqrt(l.a*l.a+l.b*l.b);
if(d<0)
d=-d;
printf("%.2f",d);
}
int main()
{
class Point point;
class Line line;
point.in();
line.in();
dist(point,line);
return 0;
}
4.问题及解决方法
问题:如何实现公式中的绝对值 解决:加入判断语句
5.心得:
友元函数中要用到的类定义如果在后面,要先在前面声明。
线性表及栈与队列的操作实现
题目内容:
针对线性表或栈或队列,编程实现选择顺序或链式存储结构下数据结构建立,元素插入,删除等基本操作。要求解释实现过程,演示实际例子及运行结果。
算法描述:
线性表
由结点集N以及定义在结点集N上的线性关系R
(1)有一个唯一的开始节点,无前驱,有唯一后继
(2)对于有限集N 存在一个唯一的终止结点,无后继,有唯一前驱
(3)其他为内部结点,有唯一前驱和唯一后继
(4)线性表的节点个数称为长度,长度为0线性表称为空表
(5) 线性关系R简称前驱关系,应具有反对称和传递性
栈:
栈:栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
特点:先进后出
选择顺序栈的实现,顺序栈的类包括构造函数,析构函数,判断栈是否为空,判断栈是否为满,将栈清空,计算栈的长度,入栈,出栈,返回栈顶元素操作的函数实现。主函数为输入俩个数,并且压入栈,出栈一个数赋值给c,返回栈顶元素给d,输出c,d。
顺序队列
两个变量指向队头和队尾,但是如果按顺序表的实现方法,如果从数组后面入队,出队列时间代价O(n)因为需要把前面的元素向前移动一个位置,入队列时间代价O(1)
如果不进行元素的移动,会出现假上溢出,就是front和rear都指向队尾,尽管此时队列为空,但也无法插入元素,所以引入循环队列
线性队列在不断入队出队后,会有空间剩余,所以构造为环形队列,某一个元素的直接后继是( x + 1 ) % m S i z e (x+1)%mSize(x+1)%mSize,但是rear=front时无法判断队列满还是队列空,所以往往空出一个位置,以( r e a r + 1 ) % m S i z e = = f r o n t (rear+1)%mSize==front(rear+1)%mSize==front作为队列满的标志
代码
#include<iostream>
#include<cstring>
using namespace std;
template<class Type>
class SeqStack
{
public:
SeqStack(int size);//构造函数
~SeqStack(){delete base;}//析构函数
int IsEmpty()const{return top==0;} //判断栈是否为空
int IsFull(){return top==maxsize;}//判断栈是否为满
void SeqStackClear(){top=0;}//将栈清空
int SeqStackLength(){return top;}//计算栈的长度
void Push(Type &e);//入栈操作
Type Pop();//出栈操作
Type GetTop();//返回栈顶元素
private:
int maxsize;
Type *base;
int top;
};
template<class Type>
SeqStack<Type>::SeqStack(int size):maxsize(size){
base=new Type[maxsize];
if(base==NULL)
{
cout<<"分配内存失败";
exit(0);
}
top=0;
}
template<class Type>
void SeqStack<Type>::Push(Type & e){
if(IsFull()){
cout<<"栈空间已满"<<endl;
exit(0);
}
else{base[top++]=e;}
}
template<class Type>
Type SeqStack<Type>::Pop(){
if(IsEmpty())
{
cout<<"栈为空"<<endl;
exit(0);
}
else return base[--top];
}
template<class Type>
Type SeqStack<Type>::GetTop(){
if(IsEmpty())
{
cout<<"栈为空"<<endl;
exit(0);
}
else
return base[top-1];
}
int main()
{
SeqStack<int> stack(10);
int a,b,c,d;
cin>>a>>b;
stack.Push(a);//将a入栈
stack.Push(b);//将b入栈
c=stack.Pop();
d=stack.GetTop();
cout<<c<<" "<<d<<endl;
return 0;
}
实验结果:
输入: 1 2 输出: 2 1