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

它以编程语言的书写形式指明算法的职能。
相比于程序语言(例如 Java, C++,C, Dephi 等等)它更类似自然语言。
它是半角式化、不标准的语言。
我们可以将整个算法运行过程的结构用接近自然语言的形式(这里,你可以使用任何一种你熟悉的文字,中文,英文 等等,关键是你把你程序的意思表达出来)描述出来。
使用伪代码, 可以帮助我们更好的表述算法, 不用拘泥于具体的实现。
人们在用不同的编程语言实现同一个算法时意识到,他们的实现(注意: 这里是实现, 不是功能)很不同。
尤其是对于那些熟练于不同编程语言的程序员要理解一个 (用其他编程语言编写的程序的) 功能时可能很难,因为程序语言的形式限制了程序员对程序关键部分的理解。
这样伪代码就应运而生了。
当考虑算法功能(而不是其语言实现)时,伪代码常常得到应用。
计算机科学在教学中通常使用虚拟码,以使得所有的程序员都能理解。
综上,简单的说,让人便于理解的代码。
不依赖于语言的,用来表示程序执行过程,而不一定能编译运行的代码。
在数据结构讲算法的时候用的很多。
语法规则
例如,类 Pascal 语言的伪代码的语法规则是: 在伪代码中,每一条指令占一行(else if,例外)。
指令后不跟任何符号(Pascal 和 C 中语句要以分号结尾)。
书写上的 “缩进” 表示程序中的分支程序结构。
这种缩进风格也适用于 if-then-else 语句。
用缩进取代传统 Pascal 中的 begin 和 end 语句来表示程序的块结构可以大大提高代码的清晰性;同一模块的语句有相同的缩进量,次一级模块的语句相对与其父级模块的语句缩进。
算法的伪代码语言在某些方面可能显得不太正规,但是给我们描述算法提供了很多方便,并且可以使我们忽略算法实现中很多麻烦的细节。
通常每个算法开始时都要描述它的输入和输出,而且算法中的每一行都给编上号码,在解释算法的过程中会经常使用算法步骤中的行号来指代算法的步骤。
算法的伪代码描述形式上并不是非常严格,其主要特性和通常的规定如下:
- 算法中出现的数组、变量可以是以下类型:整数、实数、字符、位串或指针。
通常这些类型可以从算法的上下文来看是清楚的,并不需要额外加以说明。 - 在算法中的某些指令或子任务可以用文字来叙述,例如,”设 x 是 A 中的最大项”,这里 A 是一个数组;或者 “将 x 插入 L 中”,这里 L 是一个链表。
这样做的目的是为了避免因那些与主要问题无关的细节使算法本身杂乱无章。 - 算术表达式可以使用通常的算术运算符(
+,-,*,/,以及表示幂的^)。
逻辑表达式可以使用关系运算符=,≠,<,>,≤和≥,以及逻辑运算符与(and), 或(or),非(not)。 - 赋值语句是如下形式的语句:
a<-b。
这里a是变量、数组项,b是算术表达式、逻辑表达式或指针表达式。
语句的含义是将b的值赋给a。 - 若
a和b都是变量、数组项,那么记号a<->b表示a和b的内容进行交换。 - goto 语句具有形式
它将导致转向具有指定标号的语句。1
goto label(goto 标号)
- 条件语句有以下两种形式:
这里 c 是逻辑表达式,s 和 s′是单一的语句或者是被括在 do 和 end 之间的语句串。
对于上述两种形式,
假若 c 为真,则 s 被执行一次。
假若 c 为假,则在第一种形式中,if 语句的执行就完成了,而在第二种形式中,执行 s′。
在所有的情况下,控制就进行到了下一个语句,除非在 s 或 s′中的 goto 语句使控制转向到其它地方。1
2
3if c then s 或者
if c then s
else s′ - 有两种循环指令:
while和for。
while 语句的形式是:
这里 c 是逻辑表达式,而 s 是由一个或更多个语句组成的语句串。
当 c 为真时,执行 s。
在每一次执行 s 之前,c 都被检查一下;
假若 c 为假,控制就进行到紧跟在 while 语句后面的语句。
注意,当控制第一次达到 while 语句时,假若 c 为假,则 s 一次也不执行。for 语句的形式是:1
2
3while c do
s
end
这里 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
3for var init to limit by incr do
s
end - exit 语句可以在通常的结束条件满足之前,被用来结束 while 循环或者 for 循环的执行。
exit 导致转向到紧接在包含 exit 的(最内层)while 或者 for 循环后面的一个语句。 - return 用来指出一个算法执行的终点;
如果算法在最后一条指令之后结束,它通常是被省略的;
它被用得最多的场合是检测到不合需要的条件时。
return 的后面可以紧接被括在引号的信息。 - 算法中的注释被括在 /* */ 之中。
诸如 read 和 output 之类的各种输入或者输出也在需要时被用到。
符号体系:
- 开始和结束(begin end)
- 输入和输出(read write)
- 条件分支(if || case of)
1
if () then
1
2
3
4
5
6
7
8
9case * of
case 常量 1:语句
case 常量 2:语句
default:语句
end - 循环(while for repeat )
1
while(条件表达式成立)do
1
repeat ******** until (条件表达式成立)
单循环与多循环(嵌套)1
for 循换变量初值 to 终值 step 步长 do
循环中的变量:循环控制变量
累积变量
递推变量
不确定变量(每次循环操作初始化) - 函数和过程(procedure function)
定义:1
function F(形参 1,形参 2) 结束需要 return( )
调用:1
procedure Z(形参 1,形参 2)
1
函数:x=F(a,b)
1
过程:Z(a,b)
示例
1 | IF |
在这里 BLOCK 可以理解为左括号,ENDBLOCK 为右括号,把 G 和 N 两个语句括起来放在了上面的 ELSE 中处理。
to be continued…