精华内容
下载资源
问答
  • 本关任务:编写一计算机快递费的程序。上海市的快递公司根据投送目的地距离公司的远近,将全国划分成5...
    千次阅读
    2022-01-14 14:42:26

     

    #include <stdio.h>

    int main() 

    {   int a,t,n;

        float price,z;

        scanf("%d,%f",&n,&z);

        t=z;

        if(t==z){a=1;}

      if(n<=4&&n>=0) {switch(n){

            case 0:if(z<=1)price=10;else {if(a==1)price=(z-1)*3+10;else price=3*(t)+10;};break;

            case 1:if(z<=1)price=10;else {if(a==1)price=(z-1)*4+10;else price=4*(t)+10;};break;

            case 2:if(z<=1)price=15;else {if(a==1)price=(z-1)*5+15;else price=5*(t)+15;};break;

             case 3:if(z<=1)price=15;else {if(a==1)price=(z-1)*6.5+15;else price=6.5*(t)+15;};break;

            case 4:if(z<=1)price=15;else {if(a==1)price=(z-1)*10+15;else price=10*(t)+15;};break;

             

        } 

      

        printf("Price:%6.2f",price);}

       else {

            printf("Error in Area\n");

            printf("Price: 0.00");

        }

        return 0;}

    更多相关内容
  • 程序从最一般的意义来说,程序是对解决某个计算问题的方法(算法)步骤的种描述;...计算机程序主要描述两部分内容:描述问题的每个对象和对象之间的关系,以及描述对这些对象作处理的处理规则。其中...

    260ba147ab3459beb25232b2a1a7a126.png

    程序

    从最一般的意义来说,程序是对解决某个计算问题的方法(算法)步骤的一种描述;而从计算机来说,计算机程序是用某种计算机能理解并执行的计算机语言作为描述语言,对解决问题的方法步骤的描述。计算机执行按程序所描述的方法步骤,能完成指定的功能。所以,程序就是供计算机执行后能完成特定功能的指令序列。

    一个计算机程序主要描述两部分内容:描述问题的每个对象和对象之间的关系,以及描述对这些对象作处理的处理规则。其中关于对象及对象之间的关系是数据结构的内容,而处理规则是求解的算法。针对问题所涉及的对象和要完成的处理,设计合理的数据结构常可有效地简化算法,数据结构和算法是程序最主要的两个方面。

    2.程序设计的任条和主要步骤

    程序设计的任务就是分析解决问题的方法步骤(算法),并将解决问题算法的方法步骤用计算机语言记录下来。程序设计的主要步骤包括:认识问题、设计解决问题的算法、按算法编写程序、调试和测试程序。在程序开发过程中,上述步骤可能有反复,如发现程序有错,严重情况可能会要求重新认识问题和重新设计算法等。

    3.机器语言和汇编语言

    计算机能直接识别和执行的二进制代码称为计算机的机器语言。用有助于记忆的符号来代表二进制代码,称为汇编语言。汇编语言与机器语言几乎有一对一的关系。用汇编语言编写的程序称为“汇编源程序”,汇编源程序不能在计算机上直接执行,需要用汇编程序将汇编源

    程序翻译成机器语言程序,然后执行由汇编程序翻译出来的机器语言程序。机器语言和汇编语言是与具体计算机紧密相关的,称它们是面向机器的语言。

    4.高级语言

    与机器语言和汇编语言相比较,高级语言与具体计算机无关,是一种能方便描述算法过程的计算机程序设计语言。高级语言种类千差万别,但一般包含有以下四种成分:数据成分用来描述程序所涉及的数据;运算成分用来描述运算;控制成分用来表达程序的控制构造;传输成分用来表达数据的传输。由于高级语言程序主要是描述计算机的解题过程,即描述复杂的加工处理过程,所以也称这种高级语言为面向过程语言。

    用高级语言编写的程序称为“源程序”。计算机不能直接技源程序的语句运行,通常有解释方式和编译方式两种方法在计算机上执行源程序。

    解释方式,即让计算机运行解释程序,解释程序逐句取出源程序中的语句,对它作解释执行,输入数据,产生结果。

    编译方式,即先运行编译程序,从源程序一次翻译产生计算机可直接执行的二进制程序(称为目标程序);然后让计算机执行目标程序,输入数据,产生结果。

    解释方式的主要优点是计算机与人的交互性好,调试程序时,能一边执行一边直接改错,能较快得到一个正确的程序。缺点是逐句解释执行,运行速度慢。

    编译方式的主要优点是计算机运行目标程序快,缺点是修改源程序后必须重新编译以产生新的目标程序。

    现在也有将上述两种方式结合起来的,即先编译源程序,产生计算机还是不能直接执行的中间代码,然后让解释程序解释执行中间代码。这样做的好处首先是比直接解释执行快;更大的好处是中间代码独立于计算机,只要有相应的解释程序,就可在任何计算机上运行。

    5.面向问题语言

    面向问题语言是为了易于描述和求解某类特定领域的问题而专门设计的一种非过程语言。用面向问题语言解题时,不仅摆脱计算机的内部逻辑,也不必关心问题的求解算法和求解的过程,只需指出问题是做什么,数据的输入和输出形式,就能由相应的计算机系统得到所需结果。如报表语言、SOL(Structured Query Language)语言等。SQL语言是数据库查询和操纵语言,能直接使用数据库管理系统。由于使用面向问题语言来解题只要告诉计算机做什么,不必告诉计算机如何做,能方便用户的使用和提高程序的开发速度。但实现面向问题语言的系统从最一般的意义下实现问题如何求解,通常实现的效率较低。另外,面向问题语言要求问题已有通用的求解方法,目前其应用范围还比较狭窄。

    ◆◆

    评论读取中....

    请登录后再发表评论!

    ◆◆

    修改失败,请稍后尝试

    展开全文
  • )我们编写的代码如何在计算机上运行

    万次阅读 多人点赞 2019-06-12 10:45:19
    1、计算机指令 计算机的指令即cpu能理解的操作,也就是我们所说的机器语言。... 条汇编指令 可翻译成 计算机指令 (条条的计算机指令 即 条条机器码(由0和1组成) 高级语...

    目录

    1、计算机指令

    2、代码执行过程

    3、函数执行的原理

    4、我们写的代码如何编译链接,被加载到内存并执行

    4.1、背景

    4.2、问题

    4.3、解决方案

    4.4、编译 -> 链接 -> 装载

    4.5、程序如何加载到内存

    4.6、静态/动态链接


    1、计算机指令

    计算机的指令即cpu能理解的操作,也就是我们所说的机器语言。不同的cpu能理解的语言不一样,如intel的cpu,苹果使用的ARM的cpu。不同的语言即不同的计算机指令集。所以电脑上写好的程序COPY到手机运行不了,因为二者cpu指令集不相同

    高级语言,汇编语言,计算机指令的关系

    • 一条高级语言 可翻译成 多条汇编指令(一对多)
    • 一条汇编指令 可翻译成 一条计算机指令 (一对一)
    • 一条条的计算机指令 即 一条条机器码(由0和1组成)
    • 高级语言也可以直接翻译成机器码,也可以先翻译成汇编语言再由汇编器翻译成机器码
    • 通常我们会把高级语言翻译成汇编,来看计算机执行的每个步骤

    2、代码执行过程

    寄存器是cpu内部的组成部分,特殊的有三类:PC寄存器(存储下一条指令的内存地址,也叫作程序计数器)、指令寄存器(存储正在执行的指令码)、条件码寄存器(用里面的一个一个标记位(Flag),存放 CPU 进行算术或者逻辑计算的结果)。除了这些特殊的寄存器,CPU里面还有更多用来存储数据和内存地址的寄存器。这样的寄存器通常一类里面不止一个。我们通常根据存放的数据内容来给它们取名字,比如整数寄存器、浮点数寄存器、向量寄存器和地址寄存器等等。有些寄存器既可以存放数据,又能存放地址,我们就叫它通用寄存器。

    查看高级语言对应的汇编及机器码,以linux下c语言为例

    int main()
    {
        int a = 0;
        for (int i = 0; i < 3; i++)
        {
            a += i;
        }
    }
    

     通过gcc 和 objdump命令查看代码对应的汇编指令

    gcc -g -c test.c
    objdump -d -M intel -S test.o 
    

     下面为代码对应的汇编指令,可以看到for循环是通过 逻辑判断+指令跳转 来实现

        for (int i = 0; i < 3; i++)
       b:   c7 45 f8 00 00 00 00    mov    DWORD PTR [rbp-0x8],0x0
      12:   eb 0a                   jmp    1e <main+0x1e>
        {
            a += i;
      14:   8b 45 f8                mov    eax,DWORD PTR [rbp-0x8]
      17:   01 45 fc                add    DWORD PTR [rbp-0x4],eax
        for (int i = 0; i < 3; i++)
      1a:   83 45 f8 01             add    DWORD PTR [rbp-0x8],0x1
      1e:   83 7d f8 02             cmp    DWORD PTR [rbp-0x8],0x2
      22:   7e f0                   jle    14 <main+0x14>
      24:   b8 00 00 00 00          mov    eax,0x0
        }
    

    对于cpu而言,我们写好的代码变成计算机指令后,是一条一条顺序执行的。CPU 会根据 PC 寄存器里的地址,从内存里面把需要执行的指令读取到指令寄存器里面执行,然后根据指令长度地址自增,开始顺序读取下一条指令。可以看到,一个程序的一条条指令,在内存(虚拟内存上是连续的,虚拟内存映射物理内存即可找到物理内存上的指令数据)里面是连续保存的,也会一条条顺序加载。对于有些指令,则会修改pc寄存器的里的值,达到程序跳转的目的。

    3、函数执行的原理

    https://time.geekbang.org/column/article/93014

    https://time.geekbang.org/column/article/94427

    • 每个线程都有一个自己的栈(内存中开辟的空间),线程执行中,所有方法公用这个栈。栈底到栈顶内存地址不变变小,这样只用判断地址是否小于0即可知道栈内是否还有空间。
    • 每个方法在栈里保存着各自的信息。每个方法占用的栈的空间叫做一个栈帧(逻辑层面的)。
    • RSP是栈顶指针寄存器,一直指向栈顶位置,入栈操作 Push 和出栈操作 Pop 指令,会自动调整 RSP 的值。
    • RBP是栈基地址指针寄存器,指向当前栈帧的最底部。 rsp到rbp 表示当前栈帧范围。
    • RBP和RSP在函数调用的过程中,以及调用完返回的过程中。只需要记住,RSP会一直指向栈顶,RBP会一直指向当前最新栈帧的的栈底即可
    • rdi、rsi、rdx、rcx、r8、r9 这 6 个寄存器,传递的参数会存储在寄存器中。如果超过 6 的时候,还是需要放到调用者自身的栈帧里,其入栈的顺序也是有讲究的,为了方便被调用者访问。

    分析代码如下,可以看汇编中的注释:

    // function_example.c
    #include <stdio.h>
    int static add(int a, int b)
    {
        return a+b;
    }
    
    
    int main()
    {
        int x = 5;
        int y = 10;
        int u = add(x, y);
    }
    
    int static add(int a, int b)
    {
       0:   55                      push   rbp
       1:   48 89 e5                mov    rbp,rsp
       4:   89 7d fc                mov    DWORD PTR [rbp-0x4],edi //获取传入参数
       7:   89 75 f8                mov    DWORD PTR [rbp-0x8],esi //获取传入参数
        return a+b;
       a:   8b 55 fc                mov    edx,DWORD PTR [rbp-0x4]
       d:   8b 45 f8                mov    eax,DWORD PTR [rbp-0x8]
      10:   01 d0                   add    eax,edx //函数结果放入eax
    }
      12:   5d                      pop    rbp
      13:   c3                      ret // 主函数返回地址出栈且更新到pc寄存器
    0000000000000014 <main>:
    int main()
    {
      14:   55                      push   rbp
      15:   48 89 e5                mov    rbp,rsp
      18:   48 83 ec 10             sub    rsp,0x10
        int x = 5;
      1c:   c7 45 fc 05 00 00 00    mov    DWORD PTR [rbp-0x4],0x5
        int y = 10;
      23:   c7 45 f8 0a 00 00 00    mov    DWORD PTR [rbp-0x8],0xa
        int u = add(x, y);
      2a:   8b 55 f8                mov    edx,DWORD PTR [rbp-0x8]
      2d:   8b 45 fc                mov    eax,DWORD PTR [rbp-0x4]
      30:   89 d6                   mov    esi,edx //传递参数,放到寄存器
      32:   89 c7                   mov    edi,eax //传递参数,放到寄存器
      34:   e8 c7 ff ff ff          call   0 <add> // 返回地址入栈
      39:   89 45 f4                mov    DWORD PTR [rbp-0xc],eax // 获取add函数结果
      3c:   b8 00 00 00 00          mov    eax,0x0
    }
      41:   c9                      leave  
      42:   c3                      ret    
    

    1.参数如何传递到另一个函数?

    • 参数不超过六个时,直接通过特定的寄存器传递参数。被调用者直接从寄存器中获取参数即可。
    • 超过六个的参数,则会入栈。被调用者自身知道参数个数,当前RBP栈基地址值,只要越过【前面栈帧的栈基地址】【返回地址】固定大小,则可以拿到第七个参数以及后续参数。

    2.返回值如何返回?

    • 看汇编代码可以看到,add函数的结果存储在EAX寄存器中;在主函数中只需要去EAX寄存器中获取返回结果即可。

    3.被调用的函数执行完后如何回到调用的地方继续往下执行呢?

    • 在主函数中,调用 call 的时候,会把pc寄存器的地址入栈(下一条指令的地址)。
    • 在add函数中,最后调用 ret 的时候,会把入栈的地址出栈且更新到pc寄存器中。

    4.方法为何是线程安全的呢?

    • 一个方法在不同线程并行执行,首先不同线程有各自的栈,每个方法在各自线程的栈里也会有各自的栈帧,里面有方法自己的局部变量。所以是线程安全的。

    5.函数内联有什么利弊?

    • 缺点:我们把可以复用的程序指令在调用它的地方完全展开了。如果一个函数在很多地方都被调用了,那么就会展开很多次,整个程序占用的空间就会变大了。
    • 优点:内联可以提升代码执行效率,不用像调用函数一样有多余的操作(调用,入栈,出栈等),执行的指令变少了
    • 限制:如果a调用b,b里面又调用a。如果直接内联,这样代码会无穷无尽。

    6. 参数过多的坏处?

    • 不利于理解。
    • 参数超过六个,会入栈,比单纯的通过寄存器传递和获取参数,效率更低。

    总结:看汇编代码可以得出,其操作其实都是建立在一个非常严谨的数据结构上。每一步操作会影响指针,会影响下一步操作的数据。数据结构跟代码执行是完全同步的。

    4、我们写的代码如何编译链接,被加载到内存并执行

    4.1、背景

    • 我们自己编写的源代码文件可以有多个,源文件中涉及到变量和函数的引用,可能是单个文件内的引用,也可能是文件之间的引用
    • 除了自己编写的,还有共享代码库。例如glibc共享库。源文件中可能有对glibc库中变量和函数的引用
    • 某个共享库,也会对其他共享库中的变量及函数有引用

    4.2、问题

    • 对于cpu而言,执行指令,其实就是通过获取不同地址的指令数据,译码并执行。所以代码中对变量和函数的引用,最终都应该变成有效的地址。
    • 所以最终要解决的问题就是,源代码变成机器码后,被cpu执行时,我的代码和数据(int b = &a)中涉及到的引用全部都要变成有效的地址。

    4.3、解决方案

    根本问题就是要把对数据和函数的引用替换为有效地址,这个行为叫做重定位

    • 方案一:生成的机器码,在加载到内存前,进行重定位处理

    实现思路:这种方案叫做静态链接,把整个程序用到的所有代码,全部合并成一个大文件,然后把大文件内的所有针对变量和函数的引用全部替换为有效地址

    缺点:对于glibc这种共享库,如果每个程序都要把它合并到文件里,在磁盘存储和内存占用上,都是极大的浪费。

    改良:针对每个程序都会用到的代码(例如glibc共享库),我们就不能采用静态链接这种方式,所以我们有了方案二。

    • 方案二:程序对共享库的引用,共享库和共享库之间的引用,在加载到内存后进行重定位

    实现思路:这种方案叫做动态链接,由于不能把共享库合并到大文件,所以无法提前预知共享库的地址。只能在装载程序到内存时,把依赖的共享库也装载进内存。此时共享库的在物理内存的位置已经确定。而每个程序对应的进程都可以建立‘虚拟地址’到‘物理地址’的映射,来实现不同程序引用同一个共享库代码。此时地址都已经确定,可以进行重定位。

    缺点:每次重定位,都会对代码进行更改

    改良:就像我们写代码,能否把变化转移到数据上,而代码不用变,所以有了方案三

    • 方案三:代码中对其他共享库的引用(地址值),使用自定义的变量,数组的某一项表示

    实现思路:创建一个全局变量数组 GOT[], 代码中针对其他共享库的引用,会使用数组的值来表示。例如: call printf 表示未 call GOT[index],index的值是编译器决定的。这样我们针对printf 重定位的时候,代码是通用的,只需要去更改数据GOT[index]为printf的实际虚拟地址。而GOT在虚拟内存中的位置相对于整个程序而言偏移量是固定的,可以预知。

    缺点:装载程序时,需要把所有共享库的引用全部重定位,启动速度慢

    改良:能否把重定位工作放到运行时去处理呢,所以有了方案四

    ps:共享库数据部分每个程序各自都会有一份副本,各自修改互不干扰。针对数据部分的重定位(int a=&b),使用方案二的方式即可

    • 方案四:cpu执行到该代码时,才去进行重定位

    实现思路:让cpu执行到该代码时,能有如下的逻辑判断,if(已重定位){跳转正确的地址} else{进行重定位}

    这种实现方式叫做延迟绑定(PLT),PLT其实就是一串代码,大致实现如下:

    printf@plt
    // 1. 如果未重定位, GOT[index]其实就是 push n 这条指令的地址(加载的时候初始化)继续执行后续的指令;如果重定位了,则正确跳转到printf的位置,不会继续往下执行
    jmp GOT[index] 
    // 2. 参数传递:哪个函数需要重定位,在哪个模块下
    push n
    push moduleId 
    // 3. 跳转到重定位程序,获取模块和函数,进行重定位,修改GOT[index]的值
    jump 重定位程序 

    4.4、编译 -> 链接 -> 装载

    静态链接:针对某一个程序,程序在链接的时候,把不同文件的代码段,合并到一起,成为最后的可执行文件。这样我们写一个方法,在这个程序每个地方都只需要链接就可以使用,达到复用的目的。

    动态链接:针对很多程序,当他门之间很多功能代码都是重复时。把他们都生成可执行文件并都装载到内存里,会浪费很多的磁盘和内存空间。这时我们可以把这部分功能代码提炼出来,加载到内存,让所有程序在运行时可以通过动态链接来使用。这样可以充分节省磁盘和内存空间。(动态链接库,例如dll文件)既可以在开发阶段复用,也可以在运行阶段复用。

    每个源文件编译得到对应的目标文件,多个目标文件通过链接器链接得到可执行文件(包含静态链接)。可执行文件装载时,也会加载它依赖的动态共享文件,并在加载期间把数据部分进行重定位。在运行期间把代码部分对应的GOT表进行重定位(动态链接)。

     

    可执行文件在linux下是ELF格式,在windows下是PE格式。Linux 下的装载器只能解析 ELF 格式而不能解析 PE 格式。所以在windows下生成的可执行文件在linux下无法执行。

    ELF格式的文件:目标文件,可执行文件,动态共享文件

    ELF格式文件重要结构大致如下:

    • 文件头,表示这个文件的基本属性,比如是否是可执行文件,对应的 CPU、操作系统等等。
    • 代码段,用来保存程序的代码和指令。
    • 数据段,保存程序里面设置好的初始化数据信息。
    • 重定位表,保留的是当前的文件里面,哪些跳转地址其实是我们不知道的。比如调用函数 printf 在链接发生之前,我们并不知道该跳转到哪里,这些信息就会存储在重定位表里。
    • 符号表,保留了当前文件里面定义的函数名称和对应地址的地址簿。
    • 字符串表

    静态链接的过程:链接器会扫描所有输入的目标文件,然后把所有符号表里的信息收集起来,构成一个全局的符号表。然后再根据重定位表,把所有不确定要跳转地址的代码,根据符号表里面存储的地址,进行一次修正。最后,把所有的目标文件的对应段进行一次合并,形成可执行文件。理解下图三个表之间的关系,从而理解静态目标文件的大致结构,并理解静态链接的大致过程。

    动态链接的过程这里就不列举了,有兴趣可以看书《程序员的自我修养 链接装载库》

    4.5、程序如何加载到内存

    虚拟内存:指令里用到的内存地址叫虚拟地址(比如可执行文件中地址)。

    物理内存:指令加载到内存中,实际的硬件的地址。

    虚拟内存与物理内存映射表:指令还是按照虚拟内存中的地址来进行跳转及运行,所以需要一个映射表,通过虚拟地址找到物理地址。

    内存交换:有多个程序需要加载到内存并运行,若内存不够时,则需要把其他程序占用的内存先转移到硬盘,等需要使用时再从硬盘恢复到内存。

    内存分页:由于程序执行的时候,程序计数器是顺序往下读的,所以需要程序在内存中的地址是连续的。但是若整个程序都要求连续,这样多个程序运行内存不足时,需要把整个程序都进行一次内存交换,延迟太高。若把程序拆分成多个固定大小(一般为4kb),这样我们运行程序时可以只加载用到的页进入内存,进行内存交换的时候也可以只针对某些页,不会产生很大的延迟。

    程序运行到某页,若该页未加载到内存,触发cpu缺页异常,操作系统捕捉到异常则把该页加载到内存,再由cpu读取执行。

     

    展开全文
  • 计算机执行用高级语言编写的程序主要有两种途径解释和编译编译专.doc计算机执行用高级语言编写的程序主要有两种途径:解释和编译 编译:专指由高级语言转换为低级语言编译和解释的区别: 是否产生目标程序 编译程序...

    计算机执行用高级语言编写的程序主要有两种途径解释和编译编译专.doc

    计算机执行用高级语言编写的程序主要有两种途径:解释和编译 编译:专指由高级语言转换为低级语言编译和解释的区别: 是否产生目标程序 编译程序的五个阶段:词法分析、语法分析、语义分析和中间代码生成、优化、目标代码生成 此外还包括: 表格处理和出错处理 词法分析器(扫描器)的任务:从源程序中识别出一个个具有独立含义的最小语法单位。 扫描器的输出格式: 二元式序列 (单词种别,单词符号的属性值)状态转换图: 结点代表状态,用圆圈○表示。 状态之间用箭弧→连结,弧上的标记指明在射出弧的结点状态下可能出现的输入字符 初始状态 接受状态

    正规式和有限自动机正规式和正规集的转换给出正规式,要求写出相应的NFA、DFA给出正规集,要求写出相应的NFA、DFA 1、正规式和正规集三种运算: “?”读为“或”, “· ”读为“连接” “*”读为“闭包” 转换正规式等价: 两个正规式所表示的正规集相同,则 称两个正规式等价

    令Σ是一个有限字母表,则Σ上的正规式及其表示的集合递归定义如下: 1. ε和?都是Σ上正规式,它们表示的正规集为 {ε}和? 2. 若a是Σ上的字符,则a是正规式,它表示的正 规集为{a} 3. 若r和s都是Σ上的正规式,他们表示的正规集 记为L(r)和L(s),则 (a) r|s是正规式,表示集合L(r)∪L(s), (b) rs是正规式,表示集合L(r)L(s), (c) r*是正规式,表示集合(L(r))*, (d)(r)是正规式,表示的集合仍然是L(r)。 (加括弧改变优先级、结合性)有限自动机 1、确定的有限自动机 M=(S, Σ,δ,S0, F) 其中:1. S —有穷状态集2. Σ —输入字母表3. δ —映射函数(也称状态转换函数) S×Σ→S δ(s,a)=S’ , S, S’ ∈S, a∈Σ4. s0 —唯一的初始状态 s0 ∈S5. F—终止状态集 ZíS2、不确定的有限自动机 M= (S, Σ,δ,S0, F)

    其中:1. S —有限状态集(非终极符集合);2. Σ —输入字母表(终极符集合);3. δ —转换函数S ′ (è?{e}) ? P(S), 即S ′ ?* 到S的幂集(2S)的一种映射;4. S0 —唯一的初始状态集合 (非空)S0∈S5. F—终止状态集合 FíS

    语法分析器的任务: 按照语言的语法构成规则,识别输入的符号串能否构成一个句子语法分析的理论基础 上下文无关文法和下推自动机

    文法:描述语言语法结构的形式规则。乔姆斯基(Chomsky)对文法的分类: 0型文法 1型文法 2型文法 3型文法文法 G = (VT , VN, S, P)

    0型文法:a ? b,a , b ? (VN èVT)*, | a | 3 1 1型文法:| a | £ | b |,但S ? e可以例外 2型文法:A ? b,A?VN , b ? (VN ∪VT)* 3型文法:A ? aB或A ? a,A, B?VN , a ?VT

    短语文法、上下文有关文法、上下文无关文法、正规文法 分析树:表示语言的句子结构,推导的图形表示(1)子树:除叶子结点之外的任意结点连同它的所有子孙结点构成子树。(2)句型:在一棵语法树生长过程中的任何时刻,所有那些叶子结点排列起来就是一个句型。(3)短语:子树的末端符号自左到右连成串,相对于子树树根而言称为短语。 简单短语(直接短语):若短语事某子树根经过1步推导得到的,则称之为该子树根的简单短语。 (4)句柄:句型中的最左简单短语。

    自上而下: 消除左递归: 消除直接左递归: P ?Pa|b 消除后:P b?P’ P’ ? aP’|e 消除间接左递归:自上而下语法分析包括: 递归下降分析程序和预测分析程序 预测分析程序:预测分析表 是一矩阵M[A,a],其中行标A是非终结符,列

    展开全文
  • 计算机基础知识选择题(1)为解决某一特定问题而设计的指令序列称为______.A、文档B、语言C、程序D、系统(2)下列计算机基础知识选择题(1)为解决某一特定问题而设计的指令序列称为______.A、文档B、语言C、程序D、系统...
  • 如果某计算机的内存寻址空间是1GB,那么这台计算机地址总线的线数为( ; )根。【解析题】从计算机内存中读出条指令并执行完成这条指令所需要的时间是指()【解析题】计算机病毒的生命周期包括()【解析题】现代计算机...
  • 2021年计算机一级Ms Office试题(总)

    千次阅读 2021-07-17 00:59:49
    级Ms Office试题【1】1)世界公认的第1台电子计算机诞生的年份是A)1943B)1946C)1950D)1951答案:B2)最早的应用领域是A)信息处理B)科学计算C)过程控制D)人工智能答案:B3)以下正确的叙述是A)十进制数可用10个数码...
  • 一道c语言的作业,有以下一个函数,编写一个程序,输入x的值,输出y的值.printf("请输入一个整数%d:",x);printf("最大值为:%d\n",x);printf("最小值为:%d",z);我不明白,根据你的题意,应该用多分支的if语句的格式,即...
  • spark-shell计算大学计算机系的成绩

    千次阅读 2020-05-18 11:01:19
    数据集Data01.txt如下 Aaron,OperatingSystem,100 Aaron,Python,50 Aaron,ComputerNetwork,30 Aaron,Software,94 Abbott,DataBase,18 Abbott,Python,82 Abbott,ComputerNetwork,76 Abel,Algorithm,30 ...
  • 单片机程序编写步骤

    千次阅读 2021-06-29 02:37:59
    单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把计算机系统集成到个芯片。相当于个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲:块芯片就成了计算机。它的体积...
  • 《世界公认的第台电子计算机世界公认的第台电子计算机【 】是1946年诞生。A. ENIAC B. EDSACC. EDVAC D. IBM PC下列不属于信息基本特性的是【 】。A. 信息的凝缩性 B. 信息的可共享性C. 信息的有限性 D. ...
  • 1、硬件基础知识:内存:内存分成两个部分ROM(断电也能够保留数据)和RAM(断电时其中的数据就会丢失)显卡:承担显示图形的输出声卡:实现声波/数字信号相互转换的种硬件。网卡:计算机与外界局域网的连接硬件又称...
  • 个概念三、计算机的层次结构1. 计算机系统的基本组成 、考研大纲 1. 计算机发展的历程 2.计算机的层次结构 计算机系统的基本组成 计算机硬件的基本组成 计算机的软件与硬件的关系 计算机
  • 例题:请编写一个函数,用来删除字符串中的所有空格。 例如,输入we l come,则输出为welcome。 请勿改动主函数main与其它函数中的任何内容,仅函数fun的花括号中填入所编写的若干语句。 代码如下: #include<...
  • 利用文本编辑软件磁盘建立个有n个学生的学号、姓名及英语、数学和计算机三门课程成绩的数据文件。  2.编写程序将数据文件读入,且求出每个学生的平均成绩。 过程:  文本编辑软件就是记事本等等,我用...
  • A、CPU执行条指令的过程中至少 占用个机器周期 B、CPU执行条指令的过程中只需要占用个机器周期 C、CPU执行条指令的过程中至少要 占用二.个机器周期 D、CPU执行条指令的过程中只需要占二个机器...
  • 自己学习过程中搜罗了一些优秀的计算机课程网课,这里汇总分享 软件工程 软件工程导论 张海藩 这门课课程质量不是很平稳,中间有一些课是另外个老师讲的,逻辑并不很清楚,可以挑着看 北京大学-软件工程...
  • 统计班3门课(英语、数学、计算机)考试成绩。要求能够输入考生人数,并按学生编号从小到大的顺序依次录入考生的成绩,再统计出每门课程全班平均分、最高分以及每个考生三门课平均分。要求:将学生姓名、编号、3门...
  • 软件的逆向分析与注册机编写
  • 大学里的计算机课程通常专注于讲授计算机操作系统、计算机组成原理、计算机网络等学院派的课程,以及一门具体的编程语言,比如说 Java、C++/C,而对于如何精通工具这个主题往往不讲授的课程之内,需要同学们自行...
  • 用python编写一个掷骰子的小程序

    千次阅读 热门讨论 2020-02-22 12:48:08
    摘要: 编写了一个掷骰子的程序,...成品结果请观看编写一个掷骰子的小程序结果演示视频。 第一节: 介绍 程序PyCharm软件编写,PyCharm为我们提供了很多python模块,并且可以很方便的对所需要的模块进行下载安...
  • 例题:请编写一个函数fun,它的功能是:将s所指字符串中所有下标为奇数位置的字母转换为小写(若该位置上下是字母,则不转换)。 例如,若输入ABC1bCABCabc,则应输出AbC1bcAbCabc。 请勿改动主函数main与其它函数...
  • 计算机组成原理(

    千次阅读 2021-01-14 16:16:25
    冯洛伊曼计算机结构特点:冯洛伊曼结构模型采用存储程序方式计算机有运算器、控制器、存储器、输入设备及输出设备五大基本部件组成存储器用于存放指令和数据;运算器完成算术运算和逻辑运算;操作人员通过输入设备和...
  • 记录次逆向并自己编写游戏mod

    千次阅读 2021-11-17 12:46:20
    图是个调用函数生成随机数的例子 编写函数的人规定R0作为函数的唯一参数,函数生成0至R0-1间的随机数,并保存R0寄存器。 使用这个函数想生成个0-99的随机数,就要把参数100传入。 使用函数的本质 计算机...
  • 计算机基础知识模拟题答案

    千次阅读 2021-07-04 06:18:48
    套1、 天气预报能为我们的生活提供良好的帮助,它应该属于计算机的哪类应用?( A )A、 科学计算 B、信息处理 C、过程控制 D、人工智能2、 已知汉字的区位码是3222,其国标码是( C )A、4252D B、5242H C、...
  • 任何计算机都必须加载相应的操作系统之后,才能构成个可以运转的、完整的计算机系统。操作系统的功能是否强大,决定了计算机系统的综合能力;操作系统的性能高低,决定了整个计算机系统的性能;操作系统本身的...
  • 个简单的学生成绩管理系统
  • 计算机组成原理---期末复习题

    千次阅读 2021-01-13 12:58:59
    1.世界第台通用电子计算机ENIAC,1946 2.第台存储程序式计算机-EDSAC,1949 3.数据校验码主要有奇偶校验码、海明校验码和循环冗余校验码 4.磁表面存储器记录信息是利用磁性材料的磁滞回归线特性 5....
  • 计算机二级python简单应用题(

    千次阅读 2020-03-18 17:00:54
    该文件中编写代码, 以实现如下功能 键盘输入小明学习的课程名称及考分等信息, 信息间采用空格分隔, 每个课程行, 空行回车结束录入, 示例 格式如下 数学 90 语文 95 央语 86 物理 84 生物 87 屏幕输出得分...
  • 计算机科学与技术专业:主要学什么? 本文主要包括如下内容: 程序员职位要求 CS 专业课程列表 怎样寻找资源学习? 程序员高薪排行榜 程序员职位要求 看课程之前,我们先来看看 BAT 的招聘岗位 JD: 新...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 167,978
精华内容 67,191
关键字:

在某一计算机上编写的