编写伪代码

计算机程序是为机器阅读而编写的。我们必须按照一定的格式编写程序,编译后机器才能理解。但对于程序员以外的人来说,这些写好的代码往往不容易理解。为了以非正式的方式显示这些代码,以便人类也能理解,我们编写了伪代码。虽然伪代码不是真正的编程语言代码,但它具有与编程语言类似的结构习惯。由于伪代码不能像真正的程序一样运行,因此没有标准的伪代码编写方法。我们可以按照自己的方式编写伪代码。

下面是我们查找图书的算法的伪代码:

Algorithm FindABook(L,book_name)
    Input: list of Books L & name of the search book_name
    Output: False if not found or position of the book we are looking for.

    if L.size = 0 return null
    found := false
    for each item in L, do
        if item = book_name, then
          found := position of the item
    return found

现在,让我们来看看我们编写的伪代码。我们提供了一个图书列表和一个要搜索的名称。我们正在运行一个 foreach 循环,遍历每本书,并与我们要搜索的书名进行匹配。如果找到了,我们将返回找到的书的位置,否则返回假值。因此,我们编写了一个从图书列表中查找图书名称的伪代码。但剩下的其他书呢?我们该如何继续搜索,直到找到所有书籍并将其放在正确的书架上?

Algorithm placeAllBooks
    Input: list of Ordered Books OL, List of received books L
    Output: nothing.

    for each book_name in OL, do
        if FindABook(L,book_name), then
            remove the book from the list L
            place it to the bookshelf

现在我们有了解决图书整理问题算法的完整伪代码。在这里,我们将查看已订购图书的列表,并在已交付部分查找图书。如果找到了,我们就将其从列表中删除,并放到右边的书架上。

编写伪代码这种简单的方法可以帮助我们有条理地解决更复杂的问题。由于伪代码与编程语言和平台无关,因此大多数时候算法都是用伪代码来表达的。

将伪代码转换为实际代码

现在,我们要将伪代码转换为实际的 PHP 7 代码,如图所示:

Unresolved include directive in modules/ROOT/pages/ch01/ch1-05.adoc - include::example$Chapter01/1.php[]

现在让我们来了解一下前面的代码中发生了什么。首先,我们在代码开头定义了一个新函数 findABook。该函数有两个参数。一个是数组 $bookList,另一个是字符串 $bookName。在函数的开头,我们将 $found 初始化为 FALSE,这意味着还没有找到任何内容。foreach 循环遍历图书列表数组 $bookList,并将每本书与我们提供的书名 $bookName 进行匹配。如果我们要查找的书名与 $bookList 中的书名匹配,我们就会将索引(找到匹配的地方)赋值给 $found 变量。

既然我们已经找到了它,就没有必要继续循环了。因此,我们使用了 break 命令来退出循环。退出循环后,我们将返回 $found 变量。如果找到了书,$found 通常会返回大于 0 的整数值,否则会返回 false

function placeAllBooks(Array $orderedBooks, Array &$bookList) {
    foreach ($orderedBooks as $book) {
        $bookFound = findABook($bookList, $book);
        if($bookFound !== FALSE) {
            array_splice($bookList, $bookFound, 1);
        }
    }
}

这个特殊的函数 placeAllBooks 实际上是遍历我们已订购的图书 $orderedBooks。我们迭代已订购图书列表,并使用 findABook 函数搜索已交付图书列表中的每本书。如果在已订购图书列表中找到该图书($bookFound !== FALSE),我们将使用 PHP 的 array_splice() 函数从已交付图书列表中删除该图书:

$bookList = ['PHP','MySQL','PGSQL','Oracle','Java'];
$orderedBooks = ['MySQL','PGSQL','Java'];

这两行实际上显示了两个 PHP 数组,分别用于显示我们收到的图书列表 $bookList 和我们实际订购的图书列表 $orderedBooks。如图所示,我们只是使用一些虚拟数据来测试我们的代码执行情况:

placeAllBooks($orderedBooks, $bookList);

我们代码的最后一部分实际上是调用 placeAllBooks 函数来执行整个操作,即在我们收到的书籍中搜索每本书,如果它在列表中,则将其删除。因此,基本上,我们已经将我们的伪代码实现为实际的 PHP 代码,我们可以用它来解决我们的问题。