什么是伪代码(Pseudocode),它如何改进你的编程?

什么是伪代码(Pseudocode)

如果你是一名程序员,你就会知道编写代码通常是一个耗时且错误百出的过程。弄清如何让程序或网络应用程序按照自己的意愿运行,然后再向团队或股东等其他人解释,这样的过程既令人沮丧,又令人满意。

这就是伪代码的用武之地。

伪代码是一种使用简单、自然的语言和编程语言元素相结合来表示代码的方式。无论你是刚刚开始编程,还是经验丰富的专业人士,了解伪代码都是一种节省时间的技巧,你可以随时将其融入到你的编程过程中。

在本文中,我们将深入探讨什么是伪代码、如何使用伪代码以及为什么它是任何开发人员的必备工具

什么是伪代码?

伪代码(Pseudocode)是一种表示代码的方式,如算法、函数和其他过程,使用自然语言和类似编程语言的元素组合。

之所以称为 “伪” 代码,是因为它实际上不可执行。相反,它是人类理解和规划编码逻辑的一种方式–以人类易于理解的方式描述程序的步骤,同时又足够详细,可以快速转换成特定的编程语言。

下面是一个简单的伪代码示例,在这个示例中,我们正在制定基本的逻辑,以便在访客浏览我们的网站或应用程序时用名字向他们问好:

PROCESS GreetUser
INPUT userName
DISPLAY "Hello, " + userName + "!"
END

正如你所看到的,上述伪代码并不是用任何实际语言或框架的语法编写的。相反,它使用了简单、普遍易懂的语言和编程元素(如 “PROCESS“、”DISPLAY“和 “+“)来代替语法,使任何人都能轻松掌握。

这就是编写伪代码的力量之一: 通过将代码的意图用通用语法表达出来,你可以跳过所有编程和基于技能的语言障碍。我们将在下一节详细讨论这一点。

编写伪代码的好处

伪代码的主要优点之一是,它允许开发人员勾勒出自己的代码,而不必拘泥于任何一种特定语言的语法和结构。这样就更容易发现程序或函数逻辑中的错误,而无需编写或调试任何实际代码。

更重要的是,伪代码可以很容易地适应不同的编程语言,因此对于熟悉多种语言并需要在不同语言间转换想法的开发人员来说,伪代码是一个非常有用的工具。想象一下,你可以向 Laravel 开发人员解释你的 Node.js 脚本!这对于共同完成一个项目的团队来说尤其有用,因为伪代码可以用作交流想法和功能的通用语言。

以下是伪代码为新手和经验丰富的开发人员带来的主要好处:

  • 提高效率:通过用伪代码写出流程的步骤,开发人员可以在深入研究特定编程语言的细节或语法之前规划好代码,从而节省时间。这可以帮助编码人员避免错误,减少调试的需要
  • 更易于阅读:由于伪代码编写得足够简单,任何人都能理解,因此开发人员更容易阅读和理解代码,尤其是在与团队合作或需要重温旧代码的情况下。
  • 灵活性更高:由于伪代码不依赖于任何特定的编程语言,因此可以很容易地适应不同的语言。因此,对于熟悉多种语言并需要在不同语言间转换想法的开发人员来说,伪代码是一个非常有用的工具。
  • 加强协作:伪代码可以作为一种通用语言,供开发人员团队就项目进行交流和协作。这对于共同开发项目的团队尤其有用,因为伪代码可以让开发人员清晰简洁地交流想法。
  • 本地管理:由于伪代码不是可执行的,因此无需像成熟的应用程序那样在线托管或连接到任何外部脚本。它可以创建并保存在本地机器的文件中,也可以保存在云文件中,甚至可以复制到电子邮件中。

此外,编写伪代码可以在开发过程的任何阶段轻松实现。即使您以前从未使用过,也可以现在就开始使用,无论您的编码进度如何,都能立即获得上述好处。

常见的伪代码用例

由于伪代码固有的灵活性,伪代码有很多用途——甚至在编程领域之外。

以下是开发人员常用的几种情况:

  • 规划和设计流程:伪代码可用于规划流程、函数或算法的步骤,让开发人员在用特定编程语言实现之前,就能思考逻辑并确保其正确性。
  • 向非技术利益相关者传达想法:伪代码可用于向非技术利益相关者(如项目经理或客户)清晰解释流程或算法的步骤,让他们轻松掌握概念。
  • 与团队合作:伪代码可作为一种通用语言,供开发人员团队就项目进行沟通和协作,而无需考虑他们各自的编程专长。
  • 使代码适应不同的编程语言:由于伪代码不依赖于任何特定的编程或脚本语言,因此可以快速、轻松地将其改编和翻译成不同的语言。这对于使用多种语言的开发人员和团队尤其有用。
  • 教授编程概念:伪代码是教授编程基础知识的有用工具,因为它可以让学生专注于程序的逻辑和结构,而不会被语法所困扰。

以上只是几个例子,还有更多例子。利用伪代码发挥优势的可能性几乎是无限的。

如何编写伪代码

伪代码的编写没有唯一正确的方法。由于没有特定的语法,所以伪代码非常灵活,这也正是它没有特定语法规则的原因。

虽然一些语言(如 Pascal 和 Basic)提供了特定语法的伪代码指南,但实际上你可以使用任何你喜欢的术语来编写伪代码,只要你的术语无处不在且逻辑可循即可。

不过,大多数开发人员都会遵守一些伪代码的基本步骤和准则。接下来我们将深入探讨。

编写伪代码的步骤

以下是编写优秀伪代码的一般步骤:

  1. 打开文本编辑器:伪代码通常在文本或 HTML 编辑器中编写,你可以选择自己喜欢的编辑器并打开一个新文件。
  2. 确定目标:确定程序或函数的目的。你想让它做什么?
  3. 将问题分成几个部分:将问题分解成更小、更容易处理的部分。这可以帮助你更清晰地思考问题,并更容易安排各个部分,使它们在应该工作的时间和地点工作。
  4. 按步骤组织:按照逻辑顺序写出程序步骤。使用自然语言,避免使用特定的编程结构或方法,如控制结构或类型转换。
  5. 缩进你的行:使用缩进来显示程序的结构。例如,您可以缩进属于循环内部的代码行。
  6. 测试:测试你的伪代码,确保它清晰、合理。为此,你可以用口头方式或让其他人阅读你的伪代码,并向你汇报他们认为伪代码应该做什么。

伪代码编写完成后,您需要将其转化为可执行脚本。在项目之外,您还可以通过向开源 Git 仓库投稿、接受代码挑战、在 StackOverflow 或开发社区上提问/回答问题等方式来练习。

伪代码结构

尽管伪代码缺乏定义的语法,但开发人员在编写伪代码时经常会用到几种常见的编程结构。下面让我们逐一介绍。

序列

序列是按特定顺序执行的一组语句。它们用于执行或重复一系列简单的操作。伪代码中常用的序列命令包括 INPUTSETPRINTREADDISPLAYSHOWCALCULATE

下面是一个使用了其中一些命令的伪代码示例:

PROCESS CalculateCost
INPUT price, quantity
SET cost = price * quantity
PRINT "The cost is: " + cost
END

这个伪代码定义了一个名为 CalculateCost 的过程,它接收价格和数量,将它们相乘来计算成本,然后显示结果。

条件语句

条件语句允许程序根据某些条件作出决定,然后在满足(或不满足)某个条件时指示程序执行某些语句。伪代码中经常使用 IF-ELSEIF-IF ELSE-ELSECASE 语句。

下面是一个用伪代码显示 IF-ELSE 脚本的示例:

IF user = returning
PRINT "Welcome back!"
ELSE
PRINT "Welcome!"

在上面的示例中,我们描述的流程是向以前访问过的用户显示 “Welcome back!” 信息,但只向新用户显示 “Welcome!” 信息。

迭代语句

迭代语句在一个更大的函数或流程中重复一组步骤。迭代语句的任务通常是对列表中的多个项目执行相同的操作,或者重复一个流程,直到满足某些条件为止。

迭代对于多次重复一组步骤非常有用,可以使用各种类型的循环来实现,包括 FORWHILEDO-WHILE 循环。

下面我们来看一些使用 FOR 循环遍历数字列表的伪代码:

PROCESS PrintWholeList
INPUT listOfNumbers 
FOR each number in listOfNumbers
PRINT number
END FOR
END

在上述伪代码中,我们的 PrintWholeList 进程接收一个数字列表,然后遍历列表,将每个数字显示在屏幕上。FOR 循环允许进程对列表中的每个项目重复 PRINT 命令。

或者,我们也可以利用常见的伪代码来实现与上述循环相同的功能。在伪代码中,使用关键字 REPEATUNTIL 代替 DO-WHILE 更为常见:

PROCESS PrintWholeList
INPUT listOfNumbers 
SET counter = 0
REPEAT
PRINT listOfNumbers[counter]
SET counter = counter + 1
UNTIL counter = length of listOfNumbers
END

如图所示,我们可以随意更换名称、关键字和语法片段。这只是伪代码灵活性的一个例子。关键是要确保逻辑的稳定性,同时使用足够普遍、任何人都能读懂的名称。

在稍后的伪代码示例中,我们将看到这些结构的应用。

伪代码最佳实践

正如我们前面提到的,编写伪代码没有严格的语法,因为它不是一种真正的编程语言

尽管如此,以下几条一般准则可以帮助你每次都写出清晰、有效的伪代码:

  1. 使用自然语言:伪代码应使用自然语言而非技术术语,以任何人都能轻松理解的方式编写。
  2. 保持简单:避免使用复杂的语言或语法,重点是用简洁明了的方式表达算法或流程的步骤。
  3. 具体:编写伪代码时要尽可能具体,包括变量名和具体值等信息。
  4. 省略不必要的细节: 如果你正在为采用哪种大小写约定或是否使用分号而烦恼,那你就想得太多了。让您的伪代码文本尽可能简单明了。
  5. 使用类似编程的元素:虽然伪代码不应使用特定的编程语言编写,但使用循环、条件语句和函数调用等元素可能会有所帮助,使读者更容易理解您的程序步骤。
  6. 使用缩进显示层次结构:缩进可以用来显示程序中各步骤的层次结构,从而更容易理解程序的逻辑和结构。

遵循这些指导原则,您就能编写出清晰有效的伪代码,供您和他人用作在特定编程语言或脚本语言中实现函数或算法的指南。

伪代码示例和转译

让我们来看看一些伪代码示例,以及它们在各种语言和框架中被转译成可执行代码的情况。

PHP

首先,让我们编写一些伪代码,模仿将给定列表中的所有数字相加的逻辑:

PROCESS FindTotal
INPUT listOfNumbers
SET sum = 0
FOR EACH number IN listOfNumbers
SET sum = sum + number
END FOR
PRINT sum
END

我们的伪代码逻辑遵循以下步骤:

  1. 为函数命名。
  2. 从最终用户处获取数字列表。
  3. 创建一个名为 sum 的变量,用于存储计算出的数字总和。
  4. 逐一遍历列表中的每个数字,将每个数字加到总和中。
  5. 添加完所有数字后,结束迭代(循环)。
  6. 显示所有数字相加后的最终总和。
  7. 结束函数。

既然我们已经知道了函数的逻辑,就可以将这个伪代码翻译成任何其他语言或框架。让我们看看转译成 PHP 会是什么样子:

function findTotal($listOfNumbers) {
$sum = 0;
foreach ($listOfNumbers as $number) {
$sum += $number;
}
echo $sum;
}

Node.js

接下来,让我们编写一些伪代码,用来检查访客的当前时间,然后根据他们的时间向他们发送适当的问候语:

PROCESS TimedGreeting
GET userTime
IF userTime > 6:00 + < 12:00
PRINT "Good morning!"
ELSE IF userTime > 12:00 + < 18:00
PRINT "Good afternoon!"
ELSE
PRINT "Good evening!"
END

我们的伪代码逻辑遵循以下步骤:

  1. 为函数命名。
  2. 查找用户的时间。
  3. 如果用户的时间在早上 6:00 至中午 12:00 之间,则显示消息 “Good morning!”
  4. 如果用户的时间在中午 12:00 至下午 6:00 之间,则显示信息 “Good afternoon!”
  5. 其他时间则显示 “Good evening!”。
  6. 结束函数。

转译成 Node.js 可能是这样的:

function timedGreeting() {
const userTime = new Date();
if (userTime.getHours() > 6 && userTime.getHours() < 12) {
console.log('Good morning!');
} else if (userTime.getHours() > 12 && userTime.getHours() < 18) {
console.log('Good afternoon!');
} else {
console.log('Good evening!');
}
}

Python

在下一个示例中,让我们编写一些伪代码,概述反转用户提供的字符串(在本例中为句子)的逻辑:

PROCESS ReverseString
INPUT string
SET reversed_string = reverse of string
PRINT "The reversed sentence is: ", reversed_string
END

我们的伪代码逻辑遵循以下步骤

  1. 为函数命名。
  2. 提示用户输入字符串,并接受用户提供的字符串。
  3. 存储用户字符串变量的值。
  4. 对存储的字符串值进行切分,使其反转,并将结果存储到一个新变量中。
  5. 在屏幕上显示反转后的字符串。
  6. 结束函数。

如果转译成 Python,可能会是这样的:

string = input("Enter a sentence: ")
reversed_string = string[::-1]
print("The reversed sentence is: ", reversed_string)

在某些情况下,您的实际翻译代码会比您的伪代码短。这没有问题。只要您的伪代码逻辑合理,翻译后的代码也能发挥应有的功能,您就可以忽略长度上的差异。

现实世界的流程

由于伪代码的可读性和灵活性,它甚至可以用来定义编码世界之外的流程。

比方说,你想列出粉刷卧室的步骤。这样的伪代码可能是这样的:

PROCESS PaintBedroom
INPUT color
PREPARE bedroom
REMOVE furniture from room
COVER floors with drop cloth
TAPE off trim
PAINT walls
SETUP ladder
LOAD paint roller with paint
ROLL paint onto walls
ALLOW paint to dry
FINISH
REMOVE tape and drop cloth
REPLACE furniture
DISPOSE of trash
END

当然,由于粉刷卧室是一项与计算机无关的物理操作,因此不需要将其转化为编程语言。但是,只要遵守伪代码的最佳实践和惯例,你就会发现通过伪代码来描绘和交流现实世界中的流程是多么容易。

小结

作为一名开发人员,您应该清楚自己的时间有多么宝贵。您应该尽可能通过实施能节省时间、精力和挫折感的策略来保护自己的时间。

对于各种语言和技能水平的开发人员来说,编写伪代码都是一项省时省力的绝佳措施,而且无需额外的工具或开销,就能将其顺利集成到工作流程中。通过伪代码,开发人员可以清晰简明地规划出代码,然后再深入细致地编写和测试代码,从而节省时间、避免错误,并更轻松地与团队成员协作。

评论留言