数据结构与算法1(程序设计基础知识、抽象数据类型设计)

数据结构与算法1(程序设计基础知识、抽象数据类型设计)

基本知识:
抽象数据类型

数据元素集合以及定义在该集合上的一组操作,简称为ADT(Abstract Data Type)。
“抽象”指与具体实现无关,仅考虑能做什么,而不考虑如何做。
形式描述:
ADT = ( D,R,P )其中:D 是数据对象,R 是 D 上的关系集,P 是 D 的基本操作集。

抽象数据类型的重要特征

1.数据抽象
用ADT描述程序处理的实体时,强调的是其本质的特征、其所能完成的功能以及它和外部用户的接口(即外界使用它的方法)。
2.数据封装
将实体的外部特性和其内部实现细节分离,并且对外部用户隐藏其内部实现细节。
3.抽象数据类型的实现
面向对象——类(class),如C++、Java语言
面向过程——结构体(struct),如C语言

算法

程序=数据结构+算法
算法就是求解问题的一系列步骤的集合。
通常把具体存储结构上的操作实现步骤或过程称为算法。

  • 算法的特性
  1. 有穷性: 对于任意一组合法的输入值,在执行有穷步骤之后一定能结束。
  2. 确定性:每条指令必须有确切的含义,不能有二义性。
  3. 可行性:算法中描述的操作都是用已经实现的基本运算组成。
  4. 输入:可以有零个或多个输入。
  5. 输出:一组与"输入"有确定关系的量值。有一个或多个输出。
  • 算法的评价(设计准则)
  1. 正确性:能正确执行预定的功能。
  2. 可使用性:方便使用,用户友好性。
  3. 可读性:易于理解,逻辑清晰。
  4. 健壮性:具有很好的容错性。能提供异常处理,不容易出现崩溃。
  5. 高效性:执行时间短(时间效率)、占用存储空间少(空间效率)。
算法频度

一般用算法中语句被执行的次数(频度)来表示算法的时间效率

分析下面程序段的频度:

int i, sum = 0;1次)
for (i = 0; i < n; i++)		(n+1次)
  sum = sum + i;			(n次)
return sum;1次)

T(n)=2n+3,且T(n)是n数量级的。

(渐进)时间复杂度

忽略次要语句的执行次数,只对重要的语句(原操作)和执行最频繁的语句进行计数,同时对计算结果只取其最高次幂,且略去系数不写。
渐近时间复杂度常简称为时间复杂度,用大O表示。
T(n)=2n+3=O(n)
既可简化T(n)的计算,又能比较客观地反映出当n很大时,算法的时间性能
例如:T(n)=3n2-5n+10000=O(n2)

基本操作

1、观察结构体类型的定义形式、结构体成员的访问方式和结构体变量在内存中的数据组织形式,请记住结构体类型变量的数据域的连续排列方式。注意掌握用typedef关键字为已定义的合法类型名增加新名称

#include <iostream>
using namespace std;
struct StructTest
{
    int t1;
    int t2;
};
//typedef StructTest TEST;

int main()
{ 
	StructTest my_Var;
	//TEST my_Var;
	cout<<&my_Var<<"  "<<&my_Var.t1<<"  "<<&my_Var.t2<<endl;
	return 0;
}

在这里插入图片描述
2、运行下列程序,比较值传递、指针传递、引用传递*三种函数参数的传递方法。用F9设置断点①至⑥,用F5调试程序并在Watch监视窗口中观察下列表格中变量的值。结合断点位置变量的相关数据,分析哪个函数可以交换实参的值,并总结用指针和引用作为函数参数的设计步骤。

#include <iostream>
using namespace std;
void swap1(int x,  int y);//值传递
void swap2(int *px,  int *py);//指针传递
void swap3(int &x,  int &y);//引用传递

int main()
{	
	int a=1, b=2;
	int *pa=&a, *pb=&b;  //将地址赋值给指针

	swap1(a,b); //断点①
	cout<<"After calling swap1:a="<<a<<", b="<<b<<endl;

	a=1,b=2;
	swap2(pa,pb); //断点③
	cout<<"After calling swap2:a="<<a<<", b="<<b<<endl;

	a=1,b=2;
	swap3(a,b); //断点⑤ 
	cout<<"After calling swap3:a="<<a<<", b="<<b<<endl;

	return 0;
}
//值传递
void swap1(int x, int y)
{
	int t; 
	t=x;  x=y;  y=t; //断点②
}

//指针传递
void swap2(int *px, int *py)
{
	int t; 
	t=*px;  *px=*py;  *py=t; //断点④
}

//引用传递
void swap3(int &x, int &y)
{
	int t; 
	t=x;  x=y;  y=t; //断点⑥
}

值传递
在这里插入图片描述

指针传递
在这里插入图片描述
引用传递
在这里插入图片描述
3、在以下矩形抽象数据类型的基础上设计矩形的周长和面积的操作。

#include <iostream>
using namespace std;

struct Rect {
	double length;
	double width;
};//声明矩形(矩形的类型定义)

void InitRect(Rect& R, double l, double w);//构造矩形
double Circumference(Rect& R);//求矩形周长
double AreaR(Rect& R);//求矩形面积

int main()
{
	Rect my_rect;//定义矩形变量my_rect
	double Length, Width, Circ, Area;
	cout << "Input length,width:" << endl;
	cin >> Length >> Width;
	InitRect(my_rect, Length, Width);//构造矩形my_rect

//此处写程序
	Circ = Circumference(my_rect);
	cout << "周长:" << Circ << endl;
	Area = AreaR(my_rect);
	cout << "面积:" << Area << endl;
	return 0;
}
//初始化矩形
void InitRect(Rect& R, double l, double w)
{
	R.length = l;
	R.width = w;
}

//求矩形周长
double Circumference(Rect& R)
{
	//此处写程序
	return R.length + R.width;
}

//求矩形面积
double AreaR(Rect& R)
{
	//此处写程序
	return R.length * R.width;
}

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值