jjzjj

计算机组成原理——总线(Bus)

林浩233 2024-01-13 原文

总线

总线的基本介绍

由许多传输线和通路构成,每条线可以一位一位地串行传输二进制代码,若干传输线可以同时传输若干位二进制代码,总线宽度指总线上可以同时传送二进制信息的位数

五大部件互联的方式

  • 分散连接
    • 各个部件之间采用独立的连线
    • 由于无法解决I/O设备和主机的连接的灵活性问题,于是这种连接方式被弃用
  • 总线连接
    • 将各个部件连接到一个公共信息传输线
    • 当两个甚至多个部件同时向总线发送信号的时候,势必会导致信号冲突,传输无效,因此,在同一时刻,只能有一个部件向总线发送信息,其他部件都会接收到相同信息
    • 总线(BUS)印刷在电路板上,这块电路在微型计算机中称为主板,计算机系统的其他部件或者模块(比如,CPU插板、主存插板、I/O插板)可以通过总线上的接口连接在主板上

采用总线连接方式的计算机结构

以CPU为中心的双总线结构

I/O设备和主存交换信息的时候要占用CPU,会影响CPU的工作效率

单总线结构

I/O设备与存储器交换信息时不经过CPU,但是只有一组总线,当某一时刻各部件都要占用总线时,就会发生冲突,于是,必须为此设置总线判优逻辑,让各部件按照优先级高低来占用总线,明显,这样也会对计算机的工作速度有所影响

以存储器为中心的双总线结构

在单总线的基础上又开辟了一条CPU与主存之间的总线,即存储总线,存储总线只供主存和CPU之间进行信息传输,这样既提高了传输效率,又减低了系统总线的负担,还保留了I/O设备与存储器交换信息时不经过CPU的优点

实际上,进行对比即可发现,以存储器为中心的双总线结构为单总线结构或者以CPU为中心的双总线结构加上一根线后的总线结构,即以存储器为中心的双总线结构融合了两种上述总线结构的优势

总线的分类(按照连接部件的不同进行分类)

1.片内总线

指芯片内部的总线,比如寄存器和寄存器之间、寄存器和AUL之间的总线。与片内总线相对的概念是片间总线(用于在各个部件传递信息)

2.系统总线

指CPU、主存、I/O设备(通过I/O接口)各大部件之间连接的总线,由于这些部件通常安放在主板或者插件板(插卡)上,所以系统总线又称为板级总线或板间总线

系统总线的分类(按照传输信息的不同进行分类)

数据总线DB:用来传输各个部件之间的数据信息,为双向传输总线,所以位数和机器字长、存储字长有关(通常数据总线位数要小于机器字长和存储字长),一般为8位、16位或者32位,数据总线的位数也称为数据总线的宽度,值得注意的是,"数据总线"中的"数据"是包括指令的,是一种广义的"数据"概念

地址总线AB:用来指出数据总线上的数据在主存单元的地址或者I/O设备的地址,也就是CPU需要进行访问的主存单元的地址或者I/O设备的地址,比如从存储器读取一个数据,则CPU要将此数据所在的存储单元的地址发送到地址线上;某一个数据要使用I/O设备进行输出,则CPU除了要将该数据发送到数据总线以外,还要将对应的目标I/O设备地址发送到地址线上。地址总线为单向传输总线,位数和存储单元的个数有关

控制总线CB:由于数据总线、地址总线都是被所有挂在总线上的所有部件共享的,控制总线用来控制各个部件在不同时刻的占有总线使用权,控制总线是用来发送各种控制信号的总线,通常对于任一控制线来说,传输是必然是单向的,但是对于控制总线整体来说,传输又可以认为是双向的(所以在各种结构图中凡是涉及控制总线,均以双向线表示),因为数据的读写命令都是由CPU发送的,而当设备准备就绪的时候,会向CPU发送中断请求,当某部件需要获得总线使用权的时候,也会向CPU发送总线请求

控制总线上常见的一些控制信号:

3.通信总线

用于计算机系统之间或者计算机系统和其他系统(如控制仪表、移动通信等)之间的通信,通信总线的类别很多

通信总线的分类(按照传输方式的不同进行分类)

串行通信和并行通信的数据传输速率都与距离成反比,短距离内并行数据传输速率比串行数据传输速率高得多,对于远距离通信而言,串行通信费用较低

串行通信:指数据在单条1位宽的传输线上,一位一位地按顺序分时传输;适合于远距离数据传输,可以从几米到几千公里。传输的信号可以是数据、指令或者控制信号,这取决于采用的是何种通讯协议以及传输状态。串行信号本身也可以带有时钟信息,并且可以通过算法校正时钟。因此不需要额外的时钟信号进行控制。串行通讯中,两个设备之间通过一对信号线进行通讯,其中一根为信号线,另外一根为信号地线,信号电流通过信号线到达目标设备,再经过信号地线返回,构成一个信号回路(公共地线上存在各种杂乱的电流,可以轻而易举地把信号淹没。因此所有的信号线都使用信号地线而不是电源地线,以避免干扰)。

并行通信:指数据在多条并行1位宽的传输线上,同时由源到目标;适合于近距离数据传输,通常小于30米,因为由于是多条线同时传输,如果距离较长,线与线之间会产生干扰,信号会发生变形。基本原理与串行通讯没有区别,只不过使用了成倍的信号线路,从而一次可以传送更多bit的信号。并行通讯中,数据信号中无法携带时钟信息,为了保证各对信号线上的信号时序一致,并行设备需要严格同步时钟信号,或者采用额外的时钟信号线。

高速信号的传输一般使用串行的原因:随着技术发展,时钟频率越来越高,并行导线之间的相互干扰越来越严重;而串行由于导线少,于是线间干扰容易控制,反而可以通过不断提高时钟频率来提高传输速率

总线标准

为了解决系统、模块、设备与总线之间不适应,不通用以及不匹配的问题,设定总线标准。所谓的总线标准,就是系统与各个模块、模块与模块之间的一个互连的标准界面,这个界面对它两端的模块都是透明的,即界面的任一方只需要根据总线标准满足自身接口的功能要求即可,不需要了解对端接口与总线的连接要求,即按照总线标准设计的接口为通用接口

常见的标准

  • ISA总线
  • EISA总线
  • VESA(VL-BUS)总线
  • PCI总线
  • AGP总线
  • RS-232总线
  • USB总线

总线结构

单总线结构

将CPU、主存、I/O设备(通过I/O接口)都挂在同一组总线上,由于所有的传输都要经过这组总线,而且要解决冲突问题,所以这样的结构容易形成计算机系统的瓶颈,会影响系统工作效率的提高,而且当设备过多,总线较长的时候,信息传播的时延也会影响到系统工作效率,在外部设备对应数据传输数量和传输速率要求较高的情况下,影响尤其严重

双总线结构

I/O总线:用于连接速度较低的I/O设备,通道为一个具有特殊功能的处理器,CPU将一部分功能下发给了通道,使其对I/O设备具有统一管理的能力,以完成外部设备和主存储器之间的数据传输

三总线结构1

主存总线:用于CPU与主存之间的传输
I/O总线:用于CPU与各类I/O设备之间传输信息
DMA(直接存储器访问)总线:用于高速I/O设备(磁盘、磁带等)与主存之间直接交换信息

在这种结构中,任一时刻三总线只能使用一种,因为主存总线与DMA总线不能同时对主存进行存取,而I/O总线只有在CPU执行I/O指令时才能用到

三总线结构2

Cache:由于CPU和主存发展速度相差较大,于是中间加入Cache起到一个缓冲的作用,CPU运行时需要的指令和数据主要从Cache当中获取,而不是向主存获取

局部总线:处理器与Cache之间具有一条局部总线,将CPU与Cache或者与更多的局部设备相连接。Cache的控制机构不仅使Cache与局部总线相连,还与系统总线相连,这样就可以实现Cache通过系统总线与主存传输信息,I/O设备要进行与主存之间信息的传输也不需要通过CPU

扩展总线:扩展总线将局域网、小型计算机接口(SCSI)、调制解调器(Modem)以及串行接口连接起来,通过这些接口,可以实现大量I/O设备的连接,扩展总线通过扩展总线接口与系统总线相连,实现两种总线的信息传递

四总线结构

高速总线:高速总线上挂接的是一些高速I/O设备,这些设备通过Cache控制机构中的高速总线桥或者高速缓冲器与系统总线和局部总线相连,使得这些高速设备和CPU联系更加密切,对于CPU而言,高速设备可以减少对CPU的依赖,对于高速设备而言,会比扩展总线上的设备更加贴近CPU,于是对于CPU和高速设备双方,各种的性能都会得到极大的提升

扩展总线:其他较低速的设备则挂接在扩展总线上,通过扩展总线接口和高速总线相连接

总线控制

由于总线上连接的众多部件,那么就会有"哪一个部件在何时发送信息?"、“如何给信息的发送定时?”、"如何避免多个部件同时发送信息?"等一系列问题,我们通过总线的判优(仲裁)控制和通信控制来解决这些问题

设备分类(按照是否具有对总线的控制权进行分类)

主设备(模块):对总线有控制权,总线上信息的发送是由主设备启动的,只有接收到总线使用权请求的应答信息的主设备才能开始传输数据

从设备(模块):不具有对总线的控制权,只能响应主设备发送的总线命令

一、判优控制

判优(仲裁):若多个主设备同时要使用总线时,就由总线控制器的判优、仲裁逻辑按照一定的优先等价顺序决定哪个主设备可以使用总线

判优控制的分类(按照控制逻辑集中还是分散)

集中式

  • 链式查询

    • 用于总线控制的线
      BS线:传输表示总线的占用情况的总线忙信号BS
      BG线:传输从总线控制部件发送的总线同意信号BG
      BR线:传输从各个I/O接口发送的总线请求信号BR
    • 原理
      由于BG线是串行地从一个I/O接口送到下一个I/O接口,如果BG信号到达的接口已经发送了总线请求信号,BG信号就不会继续往下传递了,即该接口获得了总线控制权,并且会建立总线忙BS信号,表示该接口占用了总线
    • 特点
      离总线控制部件最近的设备具有最高的优先级;只需要几根线就可以实现按照一定优先次序的总线控制,并且很容易扩充设备;对电路故障敏感,优先级低的设备可能很难获得请求
  • 计数器定时查询

    • 用于总线控制的线
      BS线:传输表示总线的占用情况的总线忙信号BS
      设备地址线(为一组线):传输由总线控制部件发送的地址信号,线数和设备数量有关
      BR线:传输从各个I/O接口发送的总线请求信号BR
    • 原理
      总线控制部件在接收到总线请求信号以后,在总线未被使用的情况下,会使用计数器开始计数,并通过设备地址线向各个设备发送一组地址信号,当某一个发送了总线请求信号的设备地址和计数值一致的时候,该设备就会获得总线使用权,此时总线控制部件会终止计数查询
    • 特点
      每一次计数可以从"0"开始,也可以从上一次计数的终止点开始,为一种循环方法,每一个设备使用总线的优先级相等;计数器的初始值可以由程序设置,优先次序可以被改变;电路故障不如链式查询方式敏感,但是增加了设备地址线,控制比较复杂

  • 独立请求方式
    • 用于总线控制的线
      BG线:传输从总线控制部件发送的总线同意信号BG
      BR线:传输从各个I/O接口发送的总线请求信号BR
    • 原理
      无论是链式查询还是计数器定时查询,都是按顺序进行设备查找,速度比较慢,而独立请求方式则不同,每一台设备均有一对总线请求线和总线同意线。总线控制部件中具有一个排队器,可以根据优先次序确定响应哪一台设备的请求
    • 特点
      响应快,优先次序控制灵活(可以通过程序改变),但是控制线数多,控制复杂

分布式(不进行讲解)

二、通信控制

通过判优控制,我们解决了同一时间不同部件的信息传输问题,即根据各个部件的优先等级排列各个部件的先后顺序,于是就导致了我们在通信时间上采用的是分时方式,即以获得总线使用权的先后顺序分时占用总线
总线通信控制主要解决的是通信双方如何获知传输开始和传输结束,以及在传输过程中通信双方应该如何进行配合

总线(传输)周期

指主模块和从模块之间完成一次完整的、可靠的通信需要的时间

阶段

  • 申请分配
    由需要使用总线的主模块(或主设备)提出申请,经过总线仲裁机构决定,下一个传输周期的总线使用权授予某一个申请者
  • 寻址
    取得了总线使用权的主模块通过总线发出本次要访问的从模块(或从设备)的地址以及有关命令,启动参与本次传输的从模块
  • 传数
    主模块和从模块进行数据交换,数据由源模块发出,经过数据总线进行目的模块
  • 结束
    主模块的有关信息均从系统总线上撤除,总线使用权被让出
控制方式的分类(仅仅针对串行通信而言,并行通信没有这些分类)

同步通信

  • 原理
    通信双方由统一时标控制数据传输,通常该时标由CPU的总线控制部件发送,但是也可以由各个部件中各种的时序发生器发送,但是必须由总线控制部件发送的时钟信号对它们进行同步,这种通信方式规定明确、统一,模块之间的配合简单一致,主、从模块时间配置属于强制性"同步",即必须要在限定的时间段内完成规定的事情
    简单来说,就是通信双方按照一个相同的计划表,按照上面的内容,不同时间段必须要完成相应的事项,否则会导致问题,通信的进程由第三方控制

  • 特点
    对所有的模块都使用同一限时,这样必然会导致对于速度各不相同的部件来说,必须要迁就最慢速度的部件,按照最慢速度的部件来设计公共时钟,影响了工作效率,于是同步通信一般用于总线长度较短,各个部件存取时间比较一致的场合下,因为同步方式对任何两个设备之间的通信都给予同样的时间安排,就总线长度来讲,必须按距离最长的两个设备的传输延迟来设计公共时钟,所以总线长,势必就会降低整体的传输频率。在同步通信的总线系统中,总线传输周期越短,数据线的位数越多,会直接影响总线的数据传输率

  • 过程(以读命令为例)
    主模块在T1上升沿处发送地址信息,在T2上升沿处发送读命令,与地址信号相符的从模块按照命令进行一系列操作并且必须要在T3上升沿来临之前,将主模块所需的数据发送到数据总线上,主模块在T3时钟周期内,将数据线上的信息送入内部的寄存器中,主模块在T4的上升沿撤销读命令,从模块不再向数据总线上传送数据,撤销对数据总线的驱动,如果总线采用的是三态驱动电路,则从T4开始,数据总线为一个浮空状态

  • 同步串行传送
    在同步传送时,数据块的开始处要使用同步字符SYN来指明

异步通信

  • 原理
    异步通信允许各个模块速度的不一致,没有公共的时钟标准,不要求所有部件严格按照统一时间进行运作,而是采用应答(握手)方式,即当主模块发送通信请求信号时,一直等待,直到接收到对方反馈回来的"响应"后,才会开始通信过程,这种通信方式也就要求主、从模块之间要增加两条应答线(握手交互信号线)
    简单来说,就是通信的双方无一个统一的时间规划,要准备做一件事情或者做完了某一件事情,就发送一个信息让对方知晓自身的进度即可,通信的进程由通信双方决定

  • 分类(按照应答方式的不同)

    • 不互锁

      • 过程
        主模块发送通信请求信号以后,不必等待接收到从模块的响应信号,而是自行等待一段时间,基本可以确定从模块已经接收到请求信号以后,便自行撤销请求信号
        从模块接收到请求信号以后,在条件允许时发送响应信号,并自行经过一段时间,基本可以确定主模块已经接收到响应信号以后,便自行撤销响应信号
        例子
        CPU向主存写信息的过程中,CPU先后给出地址信号、写命令、以及写入数据,都是才用这种方式
    • 半互锁

      • 过程
        主模块发送通信请求信号以后,需要等待接收到从模块的响应信号以后,才能撤销请求信号,具有互锁关系
        从模块接收到请求信号以后,发送响应信号,但是不必等待获知主模块的请求信号已经撤销,而是自行经过一段时间,基本可以确定主模块的请求信号已经撤销以后,便自行撤销响应信号(这里其实就会出现问题:如果主模块一直没接收到从模块的响应,从模块一段时间后又会停止发送响应信号,这就会导致主模块不断发送请求信号)
        例子
        在多机系统中,某一个CPU需访问共享存储器(供所有CPU访问的存储器)时,该CPU发送访存命令以后,必须接收到存储器表示未被占用的响应信号后才能真正开始访存操作
    • 全互锁

      • 过程
        主模块发送通信请求信号以后,需要等待接收到从模块的响应信号以后,才能撤销请求信号
        从模块接收到请求信号以后,必须等待获知主模块请求信号已撤销的消息以后,才能撤销响应信号,双方存在互锁关系
        例子
        网络通信中的双方就是采用全互锁方式
  • 异步串行传送
    不需要在数据传送中传送同步信号,为了确认被传送的字符,通信双方约定字符格式统一为:1个起始位(低电平)、5-8个数据位(比如ASCII码为7位)、1个奇偶校验位(用来检测是否出错)、1或1.5或2个终止位(高电平),并且起始位后面紧跟着的为要传送字符的最低位。起始位到终止位构成一帧,两帧之间的间隔可以是任意长度的

    • 波特率异步串行传送的数据传送速率使用波特率来衡量,波特率是指单位时间内传送的二进制的位数,单位为bps(位/秒)表示,记为波特
    • 比特率:由于异步串行通信字符格式中包含若干附加位,比如,起始位、终止位、校验位,而且终止位又有1位、1.5位、2位之分,如果我们取出这些附加位,只看有效位,则可以使用比特率来衡量异步串行通信的数据传输速率,即单位时间内传送二进制有效数据的位数
  • 对图片内容的解析:
    图片中的凸起表示相应的信号存在,凹陷表示相应的信号消失

    不互锁:
    只有主模块请求信号发送(从模块接收到主模块的请求信号),才能触发从模块的响应信号发送,然后二者的信号都自行经过一段时间以后消失
    半互锁:
    只有主模块请求信号发送(从模块接收到主模块的请求信号),才能触发从模块的响应信号发送,然后只有从模块的响应信号出现(主模块接收到从模块的响应信号),才能触发主模块的请求信号消失,而从模块的响应信号在一段时间后自行消失
    全互锁:
    只有主模块请求信号发送(从模块接收到主模块的请求信号),才能触发从模块的响应信号发送,然后只有从模块的响应信号出现(主模块接收到从模块的响应信号),才能触发主模块的请求信号消失,并且只有主模块的请求信号消失(从模块接收到主模块的撤销信号),才能触发从模块的响应信号消失

半同步通信

  • 原理
    半同步通信既保留的同步通信的特点,比如,所有的地址、命令、数据信号的发送时间都严格参照系统时钟信号的某一个上升沿开始,而接收方都采用系统时钟信号的某一个下降沿时刻进行判断识别;同时又具有异步通信的特点,比如允许不同速度的模块协调运作。半同步通信的要点就在于添加了一条"等待"响应信号线,采用插入时钟周期的方法来解决通信双方的速率不一致问题
    简单来说,就是虽然通信进程受到了第三方的控制,但是通信过程中通信双方,可以根据自身情况对通信进程进行调整,即通信进程受到第三方以及通信双方的控制

  • 特点
    对所有的模块都使用同一限时,这样必然会导致对于速度各不相同的部件来说,必须要迁就最慢速度的部件,按照最慢速度的部件来设计公共时钟,影响了工作效率,于是同步通信一般用于总线长度较短,各个部件存取时间比较一致的场合下,因为同步方式对任何两个设备之间的通信都给予同样的时间安排,就总线长度来讲,必须按距离最长的两个设备的传输延迟来设计公共时钟,所以总线长,势必就会降低整体的传输频率。在同步通信的总线系统中,总线传输周期越短,数据线的位数越多,会直接影响总线的数据传输率

  • 过程(以读命令为例)
    主模块在T1的上升沿处发送地址信息,在T2的上升沿处发送读命令,与地址信号相符的从模块按照命令进行一系列操作,根据自身的情况进行分析,如果工作速度较慢,无法在T3上升沿来临之前,将主模块数据发送到数据总线上,则必须在T3上升沿来临之前,通知主模块,给出等待信号。如果主模块在T3上升沿处测得等待信号为低电平,就会知晓对方速率较慢,无法完成工作,会插入一个等待周期Tw(宽度和时钟周期相同),而不会立即从数据线上取数据,继续等待。如果主模块在下一个时钟周期的上升沿处再次对等待信号进行检测,依旧为低电平,则继续插入一个等待周期Tw,继续进行等待…直到主模块在后续的一个上升沿处检测到等待信号为高电平时,才会吧此刻的下一个时钟周期当作正常周期T3,从数据线上取得数据,在T4的上升沿结束传输

分离式通信

  • 原理
    在以上三种通信方式中,自从主模块发送地址和读写命令开始,一直到数据传输结束,在这一整个传输周期中,系统总线的使用权完全由占有总线使用权的主模块和由它选中的从模块双方占据着,如果细看整个过程,会发现,对于系统总线来说,从模块按照主模块发送的命令进行内部读数据的过程中并没有实质性的信息传输,即这个时间段内,总线是空闲的,没有信息在总线上传输,资源被浪费了
    为了解决这个问题,分离式通信应运而生了,基本方法是将一个传输周期划分为两个小的子周期,第一个子周期中,由主模块进行相关命令、地址以及其他信息的发送,发送完毕,立即转让总线控制权,第二个子周期中从设备接收到命令信息,经过准备,准备完成以后,就会申请总线使用权。每一个子周期中都只有单方向的信息流,每一个模块都变成了主模块,都可以申请总线使用权,在第二个子周期中,从模块在准备数据的那一段时间内,由于第一个子周期中主模块进行了总线控制权的转让,于是这一段时间内,为其他主从模块的数据传输时间,总线上依旧有信息正在传输,实现了总线在多个主从模块之间进行信息交叉重叠并行式的传送,解决了上面提到的总线资源被浪费的问题
  • 特点
    充分挖掘了系统总线每一瞬间的潜力,使系统总线发挥其最大效能。整个过程实际为一个同步通信的过程
  • 过程
    在第一个子周期中,主模块在获得总线使用权以后将命令、地址以及其他有关信息,包括该主模块的编号发送到系统总线上,由目标从模块接收,主模块一旦发送完毕,立即让出总线使用权,以便其他模块使用
    在第二个子周期中,当从模块接收到主模块发送的有关命令信号之后,经过一系列内部操作,将主模块需要的数据准备好时,就会申请总线使用权,一旦获准,从模块就会将主模块的编号,从模块的地址,主模块需要的数据等一系列信息发送到总线上,主模块进行接收

总线特性

  • 机械特性:指总线在机械连接方式上的一些性能,比如插头和插座使用的标准、几何尺寸、引脚个数等
  • 电气特性:指总线的每一根传输线上信号的传递方向和有效电平的范围(即高电平的电压范围,低电平的电压范围),通常规定由CPU发送的为输出信号,由CPU接收的为输入信号,比如,地址总线属于单输出线、数据总线属于双向传输线,它们都定义为高电平为"1",低电平为"0",控制总线从整体看有输入,也有输出,有的定义为高电平有效,有的定义为低电平有效
  • 功能特性:指总线中每一根传输线的功能,每一根传输线上所传输的信号类型,比如,地址总线是用来指出地址码的,数据总线是用来传输数据的,控制总线是用来发送控制信号的
  • 时间特性:指总线中的任一根线的有效时间,每一条总线上的各种信号互相之间存在一种有效时序关系,一般时间特性可以使用信号时序图来描述

总线性能指标

  • 总线宽度:通常是指数据总线的根数,用比特位表示,比如,8位对应8根,16位对应16根
  • 总线带宽:单位时间内总线上传输数据的位数,可以理解为总线的数据传输速率,通常使用每秒传输信息的字节数来表示,单位可用MBps(兆字节每秒)
  • 时钟同步/异步:总线上的数据与时钟同步工作的总线称为同步总线,相应地,与时钟不同步(不同步也可以细分为多种类型)工作的总线为异步总线
  • 总线复用:一条总线上分时传输两种信号,比如,为了提高总线的利用效率,减少管脚数,会将地址总线和数据总线共用一组物理线路,在这组物理线路上分时传输地址信号和数据信号,典型的就是8086CPU的地址线和数据线复用,20根地址线中有16条同时也作为数据线使用
  • 信号线数:指地址总线、数据总线、控制总线三种总线数之和
  • 总线控制方式:包括突发工作、自动配置、仲裁方式、逻辑方式、计数方式等
  • 其他指标:包括负载能力(即驱动能力,可以挂载多少个I/O设备)、电压电压(5V或者3.3V)、总线宽度是否可以扩展等

有关计算机组成原理——总线(Bus)的更多相关文章

  1. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  2. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  3. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  4. ruby - 使用 Ruby,计算 n x m 数组的每一列中有多少个 true 的简单方法是什么? - 2

    给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in

  5. arrays - 计算数组中的匹配元素 - 2

    给定两个大小相等的数组,如何找到不考虑位置的匹配元素的数量?例如:[0,0,5]和[0,5,5]将返回2的匹配项,因为有一个0和一个5共同;[1,0,0,3]和[0,0,1,4]将返回3的匹配项,因为0有两场,1有一场;[1,2,2,3]和[1,2,3,4]将返回3的匹配项。我尝试了很多想法,但它们都变得相当粗糙和令人费解。我猜想有一些不错的Ruby习惯用法,或者可能是一个正则表达式,可以很好地回答这个解决方案。 最佳答案 您可以使用count完成它:a.count{|e|index=b.index(e)andb.delete_at

  6. ruby - 在 Ruby 中,为什么 Array.new(size, object) 创建一个由对同一对象的多个引用组成的数组? - 2

    如thisanswer中所述,Array.new(size,object)创建一个数组,其中size引用相同的object。hash=Hash.newa=Array.new(2,hash)a[0]['cat']='feline'a#=>[{"cat"=>"feline"},{"cat"=>"feline"}]a[1]['cat']='Felix'a#=>[{"cat"=>"Felix"},{"cat"=>"Felix"}]为什么Ruby会这样做,而不是对object进行dup或clone? 最佳答案 因为那是thedocumenta

  7. ruby-on-rails - 如何计算 Ruby/Rails 中 JSON 对象的数量 - 2

    Ruby中如何“一般地”计算以下格式(有根、无根)的JSON对象的数量?一般来说,我的意思是元素可能不同(例如“标题”被称为其他东西)。没有根:{[{"title":"Post1","body":"Hello!"},{"title":"Post2","body":"Goodbye!"}]}根包裹:{"posts":[{"title":"Post1","body":"Hello!"},{"title":"Post2","body":"Goodbye!"}]} 最佳答案 首先,withoutroot代码不是有效的json格式。它将没有包

  8. ruby - 如何计算自 Ruby 中给定日期以来的周数? - 2

    目标我正在尝试计算自给定日期以来周的距离,而无需跳过任何步骤。我更喜欢用普通的Ruby来做,但ActiveSupport无疑是一个可以接受的选择。我的代码我写了以下内容,这似乎可行,但对我来说似乎还有很长的路要走。require'date'DAYS_IN_WEEK=7.0defweeks_sincedate_stringdate=Date.parsedate_stringdays=Date.today-dateweeks=days/DAYS_IN_WEEKweeks.round2endweeks_since'2015-06-15'#=>32.57ActiveSupport的#weeks

  9. 最新版人脸识别小程序 图片识别 生成二维码签到 地图上选点进行位置签到 计算签到距离 课程会议活动打卡日常考勤 上课签到打卡考勤口令签到 - 2

    技术选型1,前端小程序原生MINA框架cssJavaScriptWxml2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云开发数据库(基于MongoDB)云存储4,人脸识别算法基于百度智能云实现人脸识别一,用户端效果图预览老规矩我们先来看效果图,如果效果图符合你的需求,就继续往下看,如果不符合你的需求,可以跳过。1-1,登录注册页可以看到登录页有注册入口,注册页如下我们的注册,需要管理员审核,审核通过后才可以正常登录使用小程序1-2,个人中心页登录成功以后,我们会进入个人中心页我们在个人中心页可以注册人脸,因为我们做人脸识别签到,需要先注册人脸才可以进行人脸比对,进

  10. ruby - 如何计算两个字符串共有的字符数? - 2

    如何计算两个字符串之间的字符交集?例如(假设我们有一个名为String.intersection的方法):"abc".intersection("ab")=2"hello".intersection("hallo")=4好的,男孩女孩们,感谢你们的大量反馈。更多示例:"aaa".intersection("a")=1"foo".intersection("bar")=0"abc".intersection("bc")=2"abc".intersection("ac")=2"abba".intersection("aa")=2一些补充说明:维基百科定义intersection如下:Int

随机推荐