精华内容
下载资源
问答
  • 抽象数据类型(ADT)入门(

    千次阅读 2015-03-20 16:40:02
    抽象数据类型(ADT)入门() 1、抽象数据类型(Abstract Data Types,ADT)和ADT的实现 抽象数据类型个数据元素集合以及在这些数据上的操作。 ADT的个实现包括存储数据元素的存储结构以及实现基本操作的...

    抽象数据类型(ADT)入门(一)


    1、抽象数据类型(Abstract Data Types,ADT)和ADT的实现

    抽象数据类型:一个数据元素集合以及在这些数据上的操作。

    ADT的一个实现包括存储数据元素的存储结构以及实现基本操作的算法。

    在这个数据抽象的思想中,数据类型的定义和它的实现是分开的,这在软件设计中是一个重要的概念。这使得只研究和使用它的结构而不用考虑它的实现细节成为可能。实际上,这通常使用在int、double、char和bool等预定义数据类型上的方法,使用这些数据类型的程序员在绝大部分时间里不需要担心这些数据类型是如何实现的。


    2、C++的简单数据类型以及它们是如何实现的?

    C++中的基本数据类型如int/char/double/float等被称为简单数据类型,这是因为这些数据类型的值都是原子性的,也就是说,它是由不可再分的一个单独的实体构成的。但是它们又可以被看成是抽象数据类型,因为这些数据类型描述了一系列的值并提供了在这些值上操作的实现,对它们中的每一个来说,都是使用存储器单元作为存储结构,而它们的基本操作则是由计算机系统的硬件或者软件实现的。


    (1)、整型数据:

    无符号整数非负整数,有时也被称为基数或全数,其集合是{0,1,2,3,....}。在C++中,这个ADT是通过3种数据类型建模的:unsigned short int(unsigned short)、unsigned int(unsigned)、unsigned long int(unsigned long),这些类型的值在内存中存储为一个位串。它们的长度必须满足:

    sizeof(unsigned short) ≦ sizeof(unsigned) ≦ sizeof(unsigned long)

    注:sizeof是一个C++的运算符,返回一个类型所占的字节数。典型地,unsigned short类型的值用2个字节存储,unsigned类型的值用4个字节存储,而unsigned long类型的值用4或8个字节存储。

    下面给出示例代码:

    #include<iostream>
    using namespace std;
    int main()
    {
    	cout<<"sizeof(unsigned short)="<<sizeof(unsigned short)<<endl;
    	cout<<"sizeof(unsigned)="<<sizeof(unsigned)<<endl;
    	cout<<"sizeof(unsigned long)="<<sizeof(unsigned long)<<endl;
    
    	return 0;
    }
    结果如下图所示:



    带符号整数整数集合{....,-3,-2,-1,0,1,2,3,....}以及熟悉的一些算术运算也构成一种ADT。在C++中,这个ADT是通过3种数据类型建模的:short int(short)、int、long int(long)。典型地,short类型的值用2个字节存储,int类型的值用4个字节存储,而long类型的值用4或8个字节存储。

    注:正数和负数的原码都是其本身,只需在首位加上符号位即可;正数的反码不变,负数的反码是除符号位之外全反;正数的补码不变,负数的补码是符号位不变,全反加1即可。它们之间的区别见下图:





    (2)、实型数据:

    实数值,也称为浮点值,在C++中是通过单精度类型float,双精度类型double和扩展精度类型long double来建模的。


    其中,double是处理实数数据的默认数据类型;可以在一个实数常量的后面添加一个后缀F从而规定将这个实数常量当做float值处理;如果添加一个L后缀,则规定将这个实数常量当做long double值处理。


    注:在一个实数数字的二进制表示被存储到存储器之前,通常都要将它转换为浮点形式。


    注:实数值的存储会存在“舍入错误”,这种错误可以通过存储更多数量的位数来减少,但是不能够被完全消除。请理解理论上的数值和计算机能存储的值之间的区别!!!这也是一个ADT不能完全忠实于这个ADT的表示(数学上的)实数和在实数上的操作的一个例子。


    (3)、字符数据:

    在编程语言中主要使用两种字符集。ASCII(America Standard Code for Information Interchange,美国信息交换标准码)是最常用的,但是一些语言使用Unicode,例如Java。而在C++中,字符通常都是使用char类型来处理的,这种类型使用一个能存储在一个字节中的数字代码表示每个字符。而Unicode使用了2个字节编码。


    C++提供了宽字符类型wchar_t来存储Unicode之类的大字符集中的字符。在C++中,字符值可以被当做整数值处理:

    int(char_value)=char_value的整数代码

    实际上,char类型的值可以和数字值一起组合到算术表达式中,此时将使用char型值的数字编码。


    (4)、布尔数据:

    在C++中布尔值和布尔运算是通过bool数据类型建模的。有两个布尔常量:false(0)和true(1)。


    在输入和输出bool型值时,会自动进行这些数字值和布尔值之间的转换。


    3、ADT的实现并不忠实于ADT的表示的例子

    对所有有限多个数据元素的ADT来说,表示数据值集合上的限制都是固定的,因为用来存储这些元素的内存是有限的。

    ADT的实现并不忠实于ADT的表示的例子:溢出。

    下面给出两个例子作为证明。

    //-- Program to demonstrate the effects of overflow 
    #include <iostream>  
    using namespace std; 
    int main() 
    { 
       int number = 2; 
       for (int i = 1; i <= 15; i++) 
       { 
          cout << number << endl; 
          number *= 10; 
       } 
     }
    结果如下图:


    //-- Program to demonstrate the effects of overflow
    #include <iostream>
    #include <climits>
    using namespace std;
    int main()
    {
       int number = INT_MAX - 3;
       for (int i = 1; i <= 7; i++)
       {
          cout << number << endl;
          number++;
       }
    }

    结果如下图:



    DT的实现并不忠实于ADT的另一个原因是:实现中的操作不一定能够完全按照相应的ADT的操作一样的方式执行。



    大笑大笑大笑。。。。

    关于《4、程序员可定义的新数据类型(Typedef和枚举)》和《5、指针》的介绍将在下一篇博文《抽象数据类型(ADT)入门(二)》中做详细的介绍。

    展开全文
  • 数据抽象一种依赖于接口和实现分离的编程及设计技术。类的接口包括用户所能执行 的操作;类的实现包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。 1.定义抽象数据类型 1.1设计类 确定...

    参考Primer C++ 第七章第一节

        类的基本思想是数据抽象和封装。数据抽象是一种依赖于接口和实现分离的编程及设计技术。类的接口包括用户所能执行
    的操作;类的实现包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。
    

    1.定义抽象数据类型

    1.1设计类

    确定变量、成员函数、非成员函数
    

    1.2定义类

     Sales_data类如下所示:
    
        struct Sales_data {
          //新成员:关于Sales_data对象的操作
          std::string isbn() const {return bookNo;}
          Sales_data& combine(const Sales_data&);
          double avg_price() cosnt;
    
          std::string bookNo;
          unsigned units_sold = 0;
          double revenue = 0.0;
         };
    
         //Sales_data的非成员接口函数
         Sales_data add(const Sales_data&, const Sales_data&);
         std::ostream &print(std::ostream&, const Sales_data&);
         std::istream &read(std::istream&, Sales_data&);
        定义在类内部的函数是隐式的inline函数。
        任何对类成员的直接访问都被看做this的隐式引用。this的类型是指向类类型非常量版本的常量指针。
    
        我们在类的外部定义成员函数时,成员函数的定义必须与它的声明匹配。也就是说,返回类型、参数列表和函数名都必须与类
    内部的声明保持一致。
    

    定义一个返回this对象的函数

           Sales_data& Sales_data::combine(cosnt Sales_data &rhs)
            {
               units_sold += rhs.units_sold;  //把rhs的成员加到this对象的成员上
               revenue += rhs.revenue;
               return *this;                  //返回调用该函数的对象
             }
    

    1.3定义类相关的非成员函数

    一般来说,如果非成员函数是类接口的组成部分,则这些函数的声明应该与类在同一个头文件里。
    

    1.4 构造函数

        类通过一个或者几个特殊的成员函数来控制其对象的初始化过程,这些函数成为构造函数。
        构造函数的任务是初始化类对象的数据成员。类可以包含多个构造函数,不同的构造函数之间必须在参数数量或者参数类型
    上有所区别。
        **合成构造函数**
        类通过一个特殊的构造函数来控制默认初始化过程,则该函数为默认构造函数。默认构造函数无须任何实参。
    
        **定义Sales_data的构造函数**
    
        struct Sales_data {
            Sales_data() = defult;
            Sales_data(const std::string &s) :bookNo(s) {}
            Sales_data(const std::string &s,unsigned n,double p):
                       bookNo(s),units_sold(n),revenue(p*n) {}
            Sales_data(std::istream &s);
    
            std::string isbn() const {return bookNo;}
            Sales_data& combine(const Sales_data&);
            double avg_price() const;
            std::string bookNo;
            unsigned units_sold =0;
            double revenue =0;
            };
       在C++11新标准中,Sales_data() = default ;其作用完全等价于合成默认构造函数。
       构造函数 Sales_data(const std::string &s) :bookNo(s) {} 和 构造函数 Sales_data(const 
    std::string &s,unsigned n,double p):bookNo(s),units_sold(n),revenue(p*n) {} 中的bookNo(s)和bookNo(s),units_sold(n),revenue(p*n)为构造函数初值列表,负责为新创建的对象的一个或者几个数据成员赋初值。
    
       **在类的外部定义构造函数**
       以istream为参数的构造函数需要执行一些实际的操作,比如:调用read函数以给数据成员赋初值:
       Sales_data::Sales_data(std::istream &is)
       {
          read(is, *this); //read函数的作用是从is中读取一条交易信息,然后存入到this对象中
       }
    

    1.5 拷贝、赋值和析构

    展开全文
  • 抽象数据类型(ADT)

    千次阅读 2017-09-12 21:10:48
    说到抽象数据类型,那么就得先提到数据类型数据类型指的是个值的集合以及定义在这个集合上的组操作为什么要有不同的数据类型呢 当我们计算1+1的时候,只需要很小的存储空间,但是当我们去计算10000+100000的时候...

    说到抽象数据类型,那么就得先提到数据类型

    数据类型指的是一个值的集合以及定义在这个集合上的一组操作

    为什么要有不同的数据类型呢 当我们计算1+1的时候,只需要很小的存储空间,但是当我们去计算10000+100000的时候,所需要的空间就会大许多,那么我们为了去区分这些类别的差异,就有了不同的数据类型来更精确的确定存储空间的划分

    第一次看到 int a;的时候,可是一脸懵逼,以为只是告诉我们这是一个“int”型的数据,现在看来,还是太浅了

    而抽象数据类型包含三个部分:数据对象(数据元素)、数据关系(数据关系二院组结合)、基本操作(操作函数的罗列)。

    那么按我的理解用大白话来说:
    1. ADT和数据类型的关系,是被包起来的,即ADT∈数据类型
    2. ADT需要通过固有的数据类型来实现
    3. 举个列子,就像定义一个结构体,里面有很多不同的类型,然后定义基本操作,也就是说定义的函数

    展开全文
  •  当建立好抽象数据类型的时候,数据库管理员就可以向基本数据类型那样,引用抽象数据类型包括在建立表或者对相关字段进行赋值的时候,都这么方便。 如在建立表的时候,可以把这个抽象数据类型直接跟某个字段关联...

    2、 抽象数据的引用。

      当建立好抽象数据类型的时候,数据库管理员就可以向基本数据类型那样,引用抽象数据类型,包括在建立表或者对相关字段进行赋值的时候,都这么方便。

      如在建立表的时候,可以把这个抽象数据类型直接跟某个字段关联起来。如

      Create Table USERS

      (F­­_Adress Adress );

      上面这个语句就是在USERS表中建立了一个F_Adress的字段,其数据类型为Adress。

      若要对这个字段赋值的话,需要注意一个问题,要依次输入赋值的内容,顺序不能够颠倒。如按照上面的定义,用户在赋值的时候,需要依次输入街道、城市、省份、邮编等等内容。若用户在输入的过程中,忘记输入城市的话,则省份的内容将会直接输入到城市中。另外,若数据类型不匹配的话,则就直接会有错误提示。当然数据库管理员也可以根据需要,为特定的数据内容设置默认值,以方便管理。

     

      三、抽象数据类型管理经验分享。

      笔者平时在数据库设计中,非常钟爱这个抽象数据类型。笔者十多年的数据库管理经验证明,利用抽象数据类型可以大幅度的简化我们平时的工作。为此笔者在这方面也积累了不少的经验。这里就拿出来跟大家分享一下。

     

      经验一:利用脚本建立抽象数据类型。

      对于一些常用的抽象数据类型,数据库管理员最好能够利用脚本来建立抽象数据类型。如果每次建立数据库的时候,都通过手写代码来完成的话,工作量会比较大。如笔者在日常工作中,就把常用的一些抽象数据类型,如员工姓名、地址、产品规格等抽象数据类型都保存在一个SQL脚本中,等到需要的时候,只需要运行这个脚本即可。这就可以减少一些不需要的编码的编写,从而提高数据库开发设计的效率。

     

      经验二:对于多个数据库对象中经常需要用到的数据,最好采用抽象数据类型。

      如在一个ERP系统中,产品基本信息的产品规格可能包含多个部分的内容,如产品的颜色、尺寸、大小、外处理方式等等。而在采购订单、进货单等地方有需要多处进行引用。为了保障数据的一致性与统一性,最好为产品规格设置一个抽象数据类型 。如此的话,一方面在其他对象中引用这个内容的话,不用一个个字段的引用,从而简化应用程序的设计; 另一方面,因为这些信息组合才能够唯一的定位产品,所以,在采购订单或者其他单据中统一的显示,非常的关键。为此,若能够一个数据类型来包含这些内容的话,则应用程序设计时就可以减少错误的发生。

     

      经验三:要考虑不同数据库库的兼容性问题。

      抽象数据类型,它是Oracle数据库对标准SQL语句的一种扩展。所以,虽然Oracle数据库提供了抽象数据类型的功能,但是,其他品牌的数据库不一定支持。这也就是说,这个抽象数据类型的兼容性并不时很好。如果数据库管理员能够预见在以后可能会把数据库迁移到其他平台的数据库中,则这个抽象数据类型就需要慎用。否则的话,在数据库移植的过程中,就会平白的遇到很多麻烦。

      另外,由于标准的SQL语句不支持这个抽象数据类型,所以,如果采用其他的非Oracle数据库出的SQL语句,就可能会造成额外的困扰。如有些数据库管理员喜欢采用Excle等工具作为Oracle数据库管理的辅助工具。若在数据库中采用了抽象数据类型,那么Excle软件将无法很好的支持Oralce数据库。这也是Oracle数据库管理员在考虑采用抽象数据类型需要考虑的内容。

      最后,有一个值得庆幸的就是,这些抽象数据类型的执行计划与其他Oracle数据库系统默认的内部数据类型的执行计划相同。这也就是说,抽象数据类型的引入对SQL语句的执行性能将不会产生任何影响。换一句话说,采用抽象数据类型并不会降低数据库的性能,相反可以提高数据库数据管理的一致性与统一性,从而让数据管理起来更加的容易。所以说,如果不考虑抽象数据类型的兼容性问题的话,那么抽象数据类型将是数据库管理员规划数据的一个好帮手。

    展开全文
  • 从基本数据类型抽象数据类型

    千次阅读 2018-07-03 14:49:40
    在冯 · 诺依曼体系结构中,程序代码和数据都是以二进制存储的,因此,对计算机系统和硬件本身而言,数据类型的概念其实是不存在的。机器指令和汇编语言中,数据对象是用二进制数表示的,内存里存的都是二进制,对于...
  • 、逻辑结构类型集合:数据元素间仅同属个集合,无其他关系。线性结构:1:1关系,开始和终端节点都是唯一的,除了开始节点和终端节点以外,其余节点都有且仅有个前驱节点,有且仅有个后继节点。树形结构:1:n...
  • 数据结构和抽象数据类型

    千次阅读 2016-01-15 16:41:31
    这两个概念,尤其是第个都是特别抽象的概念,没什么具体可对应的实体可以给你举例,我就粘贴复制了,说说我的理解吧。数据结构呢,我们总是为了完成个功能或者目的写程序,但不管什么程序、代码实际上都是一些...
  • 有限的数据类型几乎不能满足程序员的要求,所以编程语言会提供一种机制来使得程序员使用这些基本的预定义数据类型构造新的数据类型。一个简单的应用就是构造集合,如数组,结构体和联合体。而指针集,依照C.A.R
  • 块存储和文件存储是我们比较熟悉的两种主流的存储类型,而对象存储(Object-based Storage)是一种新的网络存储架构,基于对象存储技术的设备就是对象存储设备(Object-based Storage Device)简称OSD。  首先...
  • java:抽象的两实现方式(抽象类和接口)及其比较

    千次阅读 多人点赞 2018-02-23 20:57:38
    对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现面向对象的编程(OOP)的抽象...抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为: abstract v...
  • 我们已经公开继续改进以太坊协议的计划和长期开发路线图相当长段时间了,这个做法也是来自于从1.0版本发布之前或者事后没有能及时处理的错误中学到的经验。不管怎样,以太坊核心协议的周期性开发已经重新启动,...
  • JavaScript是一种动态类型的脚本语言

    千次阅读 2018-11-25 04:16:01
    JavaScript是一种动态类型的脚本语言;在1995年时,由Netscape公司的Brendan Eich,在网景导航者浏览器上首次设计实现而成。因为Netscape与Sun合作,Netscape管理层希望它外观看起来像Java,因此取名为JavaScript。 ...
  • 数据元素:数据的基本单位,一个数据元素可由若干个数据项组成,数据项是数据的不可分割的最小单位数据对象:性质相同的数据元素的集合是数据的一个子集数据结构:相互之间存在一种或多种特定的关系的数据元素的集合...
  • AbstractKnowledgeGraph AbstractKnowledgeGraph, a systematic knowledge graph that concentrate on abstract thing including abstract entity and action. 抽象知识图谱,目前规模50...目标于抽象知识,包括抽象...
  • 数据库复习笔记(全覆盖,包括往年部分真题)

    万次阅读 多人点赞 2020-11-26 18:08:35
    ## 1、数据库系统概述 **1.1 数据库的基本概念** 数据库: 长期储存在计算机内、有组织的、可共享的大量数据的... 数据有结构的:记录是计算机存储数据的一种格式或一种方法 数据库管理系统及其功能: 位于...
  • //数据结构基本概念 ...数据是抽象的概念,将其进行分类后得到程序设计语言中的类型。如:int,float,char等等 数据项:个数据元素由若干数据项组成 数据元素:组成数据对象的基本单位 数据对...
  • Java 的抽象特性:抽象类与接口深度解析

    千次阅读 热门讨论 2016-10-27 11:56:48
    对于面向对象编程来说,抽象是它的四大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。接口和抽象类为我们提供了一种将接口与实现分离的更加...总的来说,抽象类是一种模板,而接口是一种契约。
  • (五)抽象工厂模式详解

    千次阅读 2013-06-12 18:45:03
     前两章我们已经讨论了两种有关工厂的模式,今天我们来看最后一种与工厂相关的模式,抽象工厂模式。  抽象工厂模式算是工厂相关模式的终极形态,如果各位完全理解了上一章的工厂方法模式,那么抽象工厂模式就很好...
  • 抽象

    千次阅读 2012-04-14 15:23:41
    2、 抽象方法声明格式:[修饰符]abstract返回值类型 方法名([形式参数表]); 3、 抽象方法的特点 (1) 抽象方法的返回值类型前有关键字abstract; (2) 抽象方法没有方法体; (3) 抽象方法的定义是
  • 当程序员具备了抽象思维

    万次阅读 2021-03-22 14:32:46
    硕大而抽象,且非常美丽。 作者:张建飞 若想捉大鱼,就得潜入深渊。深渊里的鱼更有力,也更纯净。硕大而抽象,且非常美丽。——大卫·林奇 前言 抽象思维是我们工程师最重要的思维能力。因为软件技术 ...
  • 抽象类与接口

    千次阅读 2016-06-07 18:00:39
    面向对象设计的重点在于抽象,那Java接口和Java...OOP面向对象的编程,如果要提高程序的复用率,增加程序 的可维护性,可扩展性,就必须是面向接口的编程,面向抽象的编程,正确地使用接口、抽象类这些有用的抽象类型
  • 5.1 抽象

    千次阅读 2016-04-14 19:30:07
    5.1 抽象R是个好东西的主要原因是它是一门语言.而语言的魅力便是抽象.在R语言中,函数便是实现抽象的方式.假如我们想要把1到3的整数重复两次.这是个简单的命令: c(1:3, 1:3) 现在假如想要重复这些数字六次或者六...
  • 数据结构和抽象数据类型(ADT)简介

    千次阅读 2006-05-10 20:02:00
    随着计算机应用领域的扩大,数据的范畴包括:整数、实数、字符串、图像和声音等。2. 数据元素(Data Element)数据元素是数据的基本单位。数据元素也称元素、结点、顶点、记录。个数据元素可以由若干个数据项(也...
  • java面试题:面向对象的特征:抽象,继承,封装,多态 ...我们把它们共同的一部分可以详细描述,但是特别的地方就不能 描述了,此时,可以把这部分特别的地方抽象个方法。此时,就形成了抽
  • java 面向对象大特性(封装,继承,多态)以及抽象、接口的介绍,this,super,构造方法的使用介绍
  • 抽象类和接口的区别以及抽象类和接口的使用场景

    千次阅读 多人点赞 2019-05-30 18:15:44
    抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果个类中没有包含足够的信息来描绘个具体的对象,这样的类就可以称之为抽象类。 1.抽象方法...
  • 关于以太坊中的抽象

    万次阅读 2019-05-10 10:45:34
    以太坊项目最初的目标之,甚至可说是她存在的全部意义,在于这个平台提供的高度抽象。相对于限制用户使用特定的交易类型和应用,这个平台允许任何人通过编写脚本然后上传到以太坊区块链的方式,来构建任何种类的...
  • 抽象和接口的区别

    千次阅读 2019-05-11 11:28:06
    在面向对象领域,抽象类主要用来进行类型隐藏。 abstract 关键字只能用于普通方法,不能用于 static 方法或者构造方法中。在抽象类中必须包含至少抽象方法,并且所有抽象方法不能有具体的实现,而应在它们的子类...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 277,673
精华内容 111,069
关键字:

一种抽象类型包括三部分