前言

伪代码(Pseudocode)是一种算法描述语言。
使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java,etc)实现。
因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。
介于自然语言与编程语言之间。

它以编程语言的书写形式指明算法的职能。
相比于程序语言(例如Java, C++,C, Dephi 等等)它更类似自然语言。
它是半角式化、不标准的语言。
我们可以将整个算法运行过程的结构用接近自然语言的形式(这里,你可以使用任何一种你熟悉的文字,中文,英文 等等,关键是你把你程序的意思表达出来)描述出来。
使用伪代码, 可以帮助我们更好的表述算法, 不用拘泥于具体的实现。

人们在用不同的编程语言实现同一个算法时意识到,他们的实现(注意:这里是实现,不是功能)很不同。

尤其是对于那些熟练于不同编程语言的程序员要理解一个 (用其他编程语言编写的程序的) 功能时可能很难,因为程序语言的形式限制了程序员对程序关键部分的理解。

这样伪代码就应运而生了。

当考虑算法功能(而不是其语言实现)时,伪代码常常得到应用。
计算机科学在教学中通常使用虚拟码,以使得所有的程序员都能理解。

综上,简单的说,让人便于理解的代码。
不依赖于语言的,用来表示程序执行过程,而不一定能编译运行的代码。
在数据结构讲算法的时候用的很多。

语法规则

例如,类Pascal语言的伪代码的语法规则是: 在伪代码中,每一条指令占一行(else if,例外)。
指令后不跟任何符号(Pascal和C中语句要以分号结尾)。
书写上的“缩进”表示程序中的分支程序结构。
这种缩进风格也适用于if-then-else语句。
用缩进取代传统 Pascal 中的 begin 和 end 语句来表示程序的块结构可以大大提高代码的清晰性;同一模块的语句有相同的缩进量,次一级模块的语句相对与其父级模块的语句缩进。

算法的伪代码语言在某些方面可能显得不太正规,但是给我们描述算法提供了很多方便,并且可以使我们忽略算法实现中很多麻烦的细节。
通常每个算法开始时都要描述它的输入和输出,而且算法中的每一行都给编上号码,在解释算法的过程中会经常使用算法步骤中的行号来指代算法的步骤。
算法的伪代码描述形式上并不是非常严格,其主要特性和通常的规定如下:

  1. 算法中出现的数组、变量可以是以下类型:整数、实数、字符、位串或指针。
    通常这些类型可以从算法的上下文来看是清楚的,并不需要额外加以说明。
  2. 在算法中的某些指令或子任务可以用文字来叙述,例如,”设x是A中的最大项”,这里A是一个数组;或者”将x插入L中”,这里L是一个链表。
    这样做的目的是为了避免因那些与主要问题无关的细节使算法本身杂乱无章。
  3. 算术表达式可以使用通常的算术运算符(+-*/,以及表示幂的^)。
    逻辑表达式可以使用关系运算符=,,<,>,,以及逻辑运算符与(and), 或(or),非(not)。
  4. 赋值语句是如下形式的语句:a<-b
    这里 a 是变量、数组项,b 是算术表达式、逻辑表达式或指针表达式。
    语句的含义是将 b 的值赋给 a
  5. ab都是变量、数组项,那么记号a<->b 表示ab的内容进行交换。
  6. goto语句具有形式
    它将导致转向具有指定标号的语句。
    1
    goto label(goto标号)
  7. 条件语句有以下两种形式:
    这里c是逻辑表达式,s和s′是单一的语句或者是被括在do和end之间的语句串。
    对于上述两种形式,
      假若c为真,则s被执行一次。
      假若c为假,则在第一种形式中,if语句的执行就完成了,而在第二种形式中,执行s′。
    在所有的情况下,控制就进行到了下一个语句,除非在s或s′中的goto语句使控制转向到其它地方。
    1
    2
    3
    if c then s或者
      if c then s
    else s′
  8. 有两种循环指令: whilefor
    while语句的形式是:
      这里c是逻辑表达式,而s是由一个或更多个语句组成的语句串。
        当c为真时,执行s。
          在每一次执行s之前,c都被检查一下;
        假若c为假,控制就进行到紧跟在while语句后面的语句。
      注意,当控制第一次达到while语句时,假若c为假,则s一次也不执行。
    1
    2
    3
    while c do 
      s
    end
    for语句的形式是:
    这里var是变量,init、limit和incr都是算术表达式,而s是由一个或多个语句组成的语句串。
    初始时,var被赋予init的值。
    假若incr≥0,则只要var≤limit,就执行s并且将incr加到var上。
    (假若incr<0,则只要var≥limit,就执行s并且将incr加到var上)。
    incr的符号不能由s来该改变。
    1
    2
    3
    for var init to limit by incr do
      s
    end
  9. exit语句可以在通常的结束条件满足之前,被用来结束while循环或者for循环的执行。
    exit导致转向到紧接在包含exit的(最内层)while或者for循环后面的一个语句。
  10. return用来指出一个算法执行的终点;
    如果算法在最后一条指令之后结束,它通常是被省略的;
    它被用得最多的场合是检测到不合需要的条件时。
    return的后面可以紧接被括在引号的信息。
  11. 算法中的注释被括在/* */之中。
    诸如read和output之类的各种输入或者输出也在需要时被用到。

符号体系:

  1. 开始和结束(begin end)
  2. 输入和输出(read write)
  3. 条件分支(if || case of)
    1
      if () then 
    1
    2
    3
    4
    5
    6
    7
    8
    9
      case *  of

        case 常量1:语句

        case 常量2:语句

        default:语句

      end
  4. 循环(while for repeat )
    1
      while(条件表达式成立)do
    1
      repeat  ********   until (条件表达式成立)
    1
      for 循换变量初值 to 终值 step 步长 do
      单循环与多循环(嵌套)
        循环中的变量:

    循环控制变量
    累积变量
    递推变量
    不确定变量(每次循环操作初始化)

  5. 函数和过程(procedure function)
    定义:
    1
      function F(形参1,形参2)  结束需要 return(  )
    1
      procedure Z(形参1,形参2)
    调用:
    1
      函数:x=F(a,b)
    1
      过程:Z(a,b)

示例

1
2
3
4
5
6
7
IF
  S
ELSE
  BLOCK
    G
    N
  ENDBLOCK

在这里 BLOCK 可以理解为左括号,ENDBLOCK 为右括号,把 GN 两个语句括起来放在了上面的ELSE中处理。


to be continued…