分类 技术 下的文章

在 Rust 系列的 上一篇文章 中,我介绍了如何使用 ifelse 关键字来处理 Rust 程序的控制流。

这是处理程序控制流的一种方法。另一种方法是使用循环。因此,让我们在本文中看看循环。

Rust 中可用的循环

Rust 编程语言有三种不同的循环,基于你想要实现什么以及可用的内容:

  • for
  • while
  • loop

我假设你对 forwhile 已经很熟悉了,但 loop 对你来说可能是个新概念。让我们先从熟悉的概念开始。

for 循环

for 循环主要用于迭代一种称为迭代器的东西。

这个迭代器可以从任何东西中创建,从数组、向量(很快就会介绍!)、一系列值,或者任何自定义的东西。这里的可能性是无限的。

来看看 for 循环的语法。

for 迭代变量 in 迭代器 {
    <语句>;
}

其中的 迭代变量 在大多数其他编程语言教程中通常被称为 i ; )

迭代器 可以是任何东西,只要它能告诉下一个值是什么,如果有的话。

来通过一个程序来理解这个。

fn main() {
    let my_arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

    println!("迭代数组");
    for element in my_arr {
        println!("{}", element);
    }

    println!("\n迭代一个真正的迭代器");
    for element in my_arr.iter() {
        println!("{}", element);
    }

    println!("\nPython 风格的范围");
    for element in 0..10 {
        println!("{}", element);
    }
}

这里,我声明了一个数组,它包含从 0 到 9 的 10 个数字。在第 5 行的 for 循环中,我只是将这个数组指定为迭代器,Rust 会自动处理对这个数组的所有元素的迭代。不需要花哨的 my_arr[i] 魔法。

但是,在第 10 行,我调用了 .iter() 函数。这是一个明确的提及,它基于 my_arr 的值来获取一个迭代器。这个循环和第 5 行的循环之间唯一的区别是,这里你是通过在数组上调用 .iter() 函数来明确地调用它的。

在这个上下文环境中,在一个数据类型上调用 .iter() 函数不是必须的。因为这是一个数组,是语言本身提供的一种数据类型,Rust 已经知道如何处理它了。但是你 需要 在自定义数据类型中使用它。

最后,在第 15 行,我们有一个循环,它循环遍历一个范围。嗯,差不多是这样。如果你仔细看,这个范围看起来很像切片 “类型”。Rust 也知道这一点,并且 你处理了迭代(哈哈,明白了吗?)。

LCTT 译注:此处的梗是,“为你处理了迭代” 的英文原文是 “handles iteration for you",其中的 “for” 与 “for 循环” 的 “for” 是同一个单词。

输出如下:

迭代数组
0
1
2
3
4
5
6
7
8
9

迭代一个真正的迭代器
0
1
2
3
4
5
6
7
8
9

Python 风格的范围
0
1
2
3
4
5
6
7
8
9

while 循环

while 循环可以被认为是非常类似于 if 条件语句。使用 if 语句,只要用户提供的条件为 trueif 语句体中的代码就会被执行 一次

但是,在 while 循环中,如果条件评估为 true,循环就会开始循环循环体。只要条件继续评估为 true,循环就会继续迭代。

while 循环只有在循环完成当前迭代中所有语句的执行并且在检查条件时,它的结果为 false 时才会停止。

来看看 while 循环的语法...

while 条件 {
    <语句>;
}

看到了吗?和 if 条件语句非常相似!不过没有 else 块 ; )

来看一个程序来更好地理解这个。

fn main() {
    let mut var = 0;

    while var < 3 {
        println!("{var}");
        var += 1;
    }
}

我有一个可变变量 var,它的初始值为 0。只要可变变量 var 中存储的值小于 3,while 循环就会执行。

在循环中,var 的值被打印出来,然后它的值被增加 1。

这是上面代码的输出:

0
1
2

loop 循环

Rust 有一个无限循环。是的,一个没有开始条件和停止条件的循环。它只是一直循环,直到永远。当然,它有触发器来停止代码本身的循环执行。

无限循环的语法如下:

loop {
    <语句>;
}
? 这些循环主要用于 GUI 软件,退出是一个 显式 操作。

在我给你一个例子之前,因为这个循环非常特殊,让我们先看看如何 退出 它 :p

要停止无限循环的执行,需要在循环内使用 break 关键字。

来看一个例子,只有 0 到 3 之间的整数(包括 0 和 3)才会被打印到程序输出。

fn main() {
    let mut var = 0;

    loop {
        if var > 3 {
            break;
        }

        println!("{}", var);
        var += 1;
    }
}

看待这个特定的例子的最好方法是将它看作是一个增加了一堆没有必要的东西的 while 循环 ; )

你有一个可变变量 var,它的初始值为 0,它被用作迭代器。无限循环从一个 if 条件开始,如果 var 的值大于 3,break 关键字就会被执行。后来,就像 while 循环的前一个例子一样,var 的值被打印到标准输出,然后它的值被增加 1。

它的输出如下:

0
1
2
3

标记循环

假设有两个无限循环,一个嵌套在另一个中。由于某种原因,退出条件在最内层循环中被检查,但这个退出条件是为了退出最外层循环。

在这种情况下,标记循环可能是有益的。

? breakcontinue 关键字并不仅仅用于无限循环。它们可以用于 Rust 语言提供的所有三种循环。

接下来是如何标记循环。

'标记: loop {}

要告诉编译器一个循环被标记了,从一个单引号字符开始,输入它的标签,然后跟着一个冒号。然后,继续使用你通常定义循环的方式。

当你需要退出某个循环时,只需像这样指定循环标签:

break '标记;

来看一个例子来更好地理解这个。

fn main() {
    let mut a = 0;
    let mut b = 0;

    'parent: loop {
        a += 1;

        loop {
            println!("a: {}, b: {}", a, b);
            b += 1;

            if a + b == 10 {
                println!("\n{} + {} = 10", a, b);
                break 'parent;
            }
        }
    }
}

这里,我使用两个可变变量 ab,它们的初始值都设置为 0。

然后,最外层的循环被标记为 parentparent 循环将变量 a 的值增加 1,并有一个内部/子循环。

这个(在第 8 行的)子循环打印变量 ab 的值。在这个循环内部,变量 b 的值增加了 1。退出条件是 a + b == 10。这意味着只要变量 ab 中存储的值相加,结果为 10,parent 循环就会被打破。即使第 14 行的 break 条件“属于”内部循环,它也会打破 parent 循环。

来看看程序的输出。

a: 1, b: 0
a: 1, b: 1
a: 1, b: 2
a: 1, b: 3
a: 1, b: 4
a: 1, b: 5
a: 1, b: 6
a: 1, b: 7
a: 1, b: 8

1 + 9 = 10

就像从程序输出中可以看出的那样,循环在 ab 分别具有值 1 和 9 时停止。

continue 关键字

如果你已经在其他编程语言(如 C/C++/Java/Python)中使用过循环,你可能已经知道 continue 关键字的用法。

break 关键字用于完全停止循环执行时,continue 关键字用于“跳过”循环执行的 当前迭代 并从下一迭代开始(如果条件允许)。

来看一个例子来理解 continue 关键字的工作原理。

fn main() {
    for i in 0..10 {
        if i % 2 == 0 {
            continue;
        }
        println!("{}", i)
    }
}

在上面的代码中,我有一个 for 循环,它迭代了 0 到 9 之间的整数(包括 0 和 9)。一旦循环开始,我就设置了一个条件检查,看看这个数字是不是偶数。如果这个数字是偶数,continue 关键字就会被执行。

但是如果这个数字是奇数,这个数字就会被打印到程序输出。

来看看这个程序的输出。

1
3
5
7
9

正如你所看到的,循环似乎一直在“进行”,尽管 0 到 9 之间显然有偶数。但是因为我使用了 continue 关键字,当遇到这个关键字时,循环执行就会停止。

这个循环跳过了它下面的任何东西,并继续下一次迭代。这就是为什么偶数没有被打印出来,但是 0 到 9 之间的所有奇数都被打印到了程序输出中。

总结

要总结这篇长文,我演示了 3 种不同循环的用法:forwhileloop。我还讨论了两个关键字,它们影响这些循环的控制流:breakcontinue

我希望你现在能理解每个循环的适当用例。如果你有任何问题,请告诉我。

(题图:MJ/25579e09-ae1c-47d3-8266-3bd9a54456c0)


via: https://itsfoss.com/rust-loops/

作者:Pratham Patel 选题:lkxed 译者:Cubik65536 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在安装完 Debian 12 “Bookworm”要做的一些事情。

我想你已经安装好了 Debian 12 “Bookworm” 或者 准备升级 了。Debian 12 经过一年多的开发,于 2023 年 6 月 10 日发布。它带来了最新的软件包、升级和替换一些关键模块。请在此查看 Debian 12 的一些新特性 指南

如果你在笔记本电脑或台式机上使用 Debian,那么在安装或升级到 Debian 12 后,以下是你可能需要完成的一些步骤。

Debian 12 安装后需要做的几件事情

启用 sudo

如果你将 Debian 12 作为新安装的系统,那么你的用户账户可能没有超级用户访问权限。出于安全原因,Debian 在安装期间不允许任何选项给予用户账户 sudo 访问权限。以下是如何将用户添加到超级用户组。

打开终端并使用 root 密码进入 root 账户。

su

然后运行以下命令,将你的用户账户添加到 sudo 组。请将下面的用户名更改为你的账户。

/sbin/addgroup 用户名 sudo

现在,你可以注销并再次登录该账户。

确保 Debian 已更新至最新版本

在开始工作或进行任何配置之前,确保 Debian 12 已更新至最新版本非常重要。从终端中按以下顺序运行以下命令以刷新 Debian 系统。

sudo apt update
sudo apt upgrade

Debian 12 中的非自由软件

Debian 12 中有一个关于管理“非自由”固件包的根本变化。Debian 创建了一个新的软件源,以便轻松访问那些专有包。因此,如果你想添加非自由软件包,需要确保在 APT 软件源文件 /etc/apt/sources.list 中添加以下行:

sudo nano /etc/apt/sources.list
deb http://deb.debian.org/debian bookworm non-free non-free-firmware
deb-src http://deb.debian.org/debian bookworm non-free non-free-firmware

deb http://deb.debian.org/debian-security bookworm-security non-free non-free-firmware
deb-src http://deb.debian.org/debian-security bookworm-security non-free non-free-firmware

deb http://deb.debian.org/debian bookworm-updates non-free non-free-firmware
deb-src http://deb.debian.org/debian bookworm-updates non-free non-free-firmware

保存并关闭文件。然后刷新 Debian 系统。完成后,你现在可以安装“非自由”软件包。

sudo apt update

安装额外的桌面环境

Debian Linux 提供了所有主要的桌面环境包。如果你使用 Debian 的 Netinst ISO 文件(最小化 ISO 镜像)进行安装,那么你可能已经获得了默认的 Xfce 桌面环境。在 Debian 12 安装期间,你可以选择桌面环境。

如果你想安装任何额外的桌面环境,则可以使用各种软件包管理器进行安装。或者,获取专用的 ISO 文件。从 Debian 12 开始,团队为每个桌面提供单独的 ISO 文件。你可以在以下链接中获取它们。

设置 Flatpak 和 Flathub

你应该在 Debian 中 设置 Flatpak,以便从 Flathub 获取数百款最新的应用程序。要设置它,可以从终端中运行以下命令。

sudo apt install flatpak

如果你想通过浏览器安装 Flatpak 应用程序,则以下软件包是可选的。

sudo apt install gnome-software-plugin-flatpak

添加 Flathub 软件源库,其中包含所有 Flatpak 应用程序。从终端中运行以下命令。

flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

重新启动 Debian 系统就可以使用 Flatpak 应用程序了。

安装最新的 Firefox

Debian Linux 附带的是 Firefox ESR 版本,这个版本的功能略旧。不过它非常稳定和安全。如果你想 安装最新版本的 Firefox,可以从以下官方网站下载预编译的二进制文件,并执行 firefox

下载 Firefox

安装额外的软件 – 图形界面

默认的 Debian 安装只有非常简洁的图形界面应用程序。为了配置你的工作站,你可以考虑安装以下一组应用程序。但是,以下列表非常基本,对于基本用例应该是足够的。

它们包括分区软件、BT 客户端、媒体播放器和图形实用工具。

sudo apt install gparted transmission-gtk vlc pavucontrol geany gimp inkscape audacity filezilla leafpad

安装额外的软件 – 命令行界面

虽然上述图形界面应用程序是必要的,但是你应该始终安装一些超级重要的命令行实用工具。以下是我为你准备的列表。

sudo apt install ffmpeg default-jdk git wget nano vim htop locate p7zip p7zip-full unzip

Debian 12 中的替代包

如果你正在运行 Debian 服务器或桌面系统,你应该注意本版本中一些关键软件包已被替换。以下是其中的一些:

  • 默认系统时钟现在由 systemd-timesyncd 管理,ntp 已被 ntpsec 替换。
  • DNS 选项 dnssec-enable 已经过时。如果遇到无效选项错误,请在 named.conf 文件中注释该行(应该在 /etc/etc/bind9 中)。
  • 不会自动安装 systemd-resolved 包。你需要手动安装和启动它。
  • rsyslog 包不会默认安装,因为 journalctl 接管了该功能。

配置 Debian 多媒体仓库

由社区创建的流行 Debian 多媒体仓库已更新为 Bookworm 版本。你可以在 APT 软件源文件中添加以下行,并利用数百个多媒体软件包来完成你的项目。

deb https://www.deb-multimedia.org bookworm main non-free

你可以访问 官方页面 以了解有关该软件源库的更多信息。

总结

以上是你可以利用的各种提示列表。它们只是指南,可能不适用于你的情况,但它们可以成为你开始 Debian 12 后安装旅程的起点。

在评论框中让我知道你最喜欢的 Debian 后安装提示是什么。


via: https://www.debugpoint.com/things-to-do-debian-12/

作者:Arindam 选题:lkxed 译者:ChatGPT 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

以下是如何从 Debian 11 升级到 Debian 12 “Bookworm” 的步骤。

Debian 12 Bookworm 已经发布。如果你正在运行 Debian 11 “Bullseye”,你可以计划现在升级你的台式机或服务器。但是,建议你等待 Debian “Bookworm” 的第一个小版本,即 12.1 版本,再进行关键服务器升级。

话虽如此,如果你想了解 Debian 12 的新特性,可以查看 这篇文章。以下是详细的升级步骤:

从 Debian 11 升级到 Debian 12

无论你运行的是 Debian 服务器还是任何桌面版本,请确保备份关键数据。例如,你可能需要为桌面文档进行备份。如果是服务器,请记录正在运行的服务。你可以使用 rsync 或其他实用工具来完成此操作。

Debian 12 引入了一个名为 non-free-firmware 的新仓库,用于专有驱动程序和软件包。如果你使用任何“闭源”的网络、显示、图形或其他驱动程序,你可能需要在升级后进行配置。

对于网络驱动程序,请确保在某个地方安全地记录 /etc/network/interfaces/etc/resolv.conf 文件的内容。如果在升级完成后失去了网络连接,可以 按照这个指南 轻松设置它。

从命令提示符运行以下命令,以确保 Debian 11 更新了安全和其他软件包:

sudo apt update
sudo apt upgrade
sudo apt full-upgrade
sudo apt autoremove

完成上述命令后,重新启动 Debian 11 系统:

sudo systemctl reboot

记下关于 Debian 11 的几个信息。这对于服务器很重要。它们包括内核版本和 Debian 版本。这是因为升级后,你可以验证下面的相同命令以确保升级成功。

例如,我尝试升级的系统是 Debian 11.7,内核版本为 5.10。

uname -mr

示例输出:

5.10.0-23-amd64   x86_64
cat /etc/debian_version

示例输出:

11.7

将 APT 源文件备份到你选择的任何目录:

sudo cp -v /etc/apt/sources.list /home/arindam/
sudo cp -vr /etc/apt/sources.list.d/ /home/arindam/

打开 /etc/apt/sources.list 文件,并将 Debian 12 的代号 bookworm 添加到该文件中,替换 bullseye

sudo nano /etc/apt/sources.list

以下是我测试系统中的 /etc/apt/sources.list 文件更改之前的内容作为参考:

deb http://deb.debian.org/debian/ bullseye main
deb-src http://deb.debian.org/debian/ bullseye main

deb http://security.debian.org/debian-security bullseye-security main
deb-src http://security.debian.org/debian-security bullseye-security main

deb http://deb.debian.org/debian/ bullseye-updates main
deb-src http://deb.debian.org/debian/ bullseye-updates main

以下是更改后/etc/apt/sources.list 文件。以下镜像网址是默认设置。如果你使用不同的 Debian 镜像,请不要更改它们:

deb http://deb.debian.org/debian/ bookworm main
deb-src http://deb.debian.org/debian/ bookworm main

deb http://security.debian.org/debian-security bookworm-security main
deb-src http://security.debian.org/debian-security bookworm-security main

deb http://deb.debian.org/debian/ bookworm-updates main
deb-src http://deb.debian.org/debian/ bookworm-updates main

deb http://deb.debian.org/debian bookworm non-free non-free-firmware
deb-src http://deb.debian.org/debian bookworm non-free non-free-firmware

deb http://deb.debian.org/debian-security bookworm-security non-free non-free-firmware
deb-src http://deb.debian.org/debian-security bookworm-security non-free non-free-firmware

deb http://deb.debian.org/debian bookworm-updates non-free non-free-firmware
deb-src http://deb.debian.org/debian bookworm-updates non-free non-free-firmware

更新源文件

注意:从 Debian 12 “Bookworm” 开始,Debian 团队创建了一个新的仓库 non-free-firmware 来打包非自由的软件包。因此,在上面的示例中最后三个部分中也包含了它们。

保存文件并退出。

打开终端并运行以下命令以开始升级过程:

sudo apt update
sudo apt full-upgrade

升级过程

Debian 12 升级过程进行中

在升级过程中,安装程序可能会要求你重新启动几个服务。仔细阅读消息后点击 “Yes”。另外,如果你看到带有 : 的提示,请按 q 键退出该消息。

确认服务验证

等待软件包下载和安装完成。

升级完成后,请重新启动你的 Debian 桌面或服务器:

sudo systemctl reboot

检查升级状态

重启后,请验证你是否正在运行 Debian 12。可以使用以下文件检查 Debian 版本:

cat /etc/debian_version

示例输出:

Debian 12 Bookworm Desktop (Xfce)

此外,如果你刚刚升级到 Debian 12 服务器,请确保验证正在运行的服务,例如 HTTP、SSH 等。你可以使用以下 systemd 命令 了解正在运行的服务:

systemctl list-units --type=service

总结和清理

在确认所有步骤都已完成后,你可能希望运行 apt autoremove 命令来清理不需要的软件包。但是,请在执行此操作时格外小心。

sudo apt --purge autoremove

这就是升级到 Debian 12 的简要步骤。希望你的升级顺利进行。如果你正在关键服务器上运行 Debian 11,请勿立即升级,请等到 Debian 12.1 发布。

有关 Debian 升级的更多信息,请访问 官方文档

最后,请别忘了告诉我们你的升级情况。


via: https://www.debugpoint.com/upgrade-debian-12-from-debian-11/

作者:Arindam 选题:lkxed 译者:ChatGPT 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如果你和我一样,在 20 世纪七八十年代使用计算机长大,你可能学过一种常见的个人计算机编程语言,名为 BASIC(全称是 “ 初学者的通用符号指令代码 Beginner's All-purpose Symbolic Instruction Code ”)。那个时期,包括 TRS-80、Apple II 和 IBM PC 在内的每台个人计算机都可以找到 BASIC 实现。当时,我是一个自学的 BASIC 程序员,在尝试了 Apple II 上的 AppleSoft BASIC 后,转向 IBM PC 上的 GW-BASIC,后来在 DOS 上学习了 QuickBASIC。

我通过编写一个示例程序来探索 BASIC 和 FORTRAN 77 中的 FOR 循环,以将数字列表从 1 加到 10。

但是曾经,一种在科学编程领域受欢迎的语言是 FORTRAN(即 “ 公式翻译 FORmula TRANslation ”)。尽管在 1990 年对该语言进行的规范以后,该名称更常见的风格是 “Fortran”。

当我在 1990 年代初作为大学本科物理学生学习物理学时,我利用自己在 BASIC 上的经验学习了 FORTRAN 77。那时我意识到 BASIC 许多概念都来源于 FORTRAN。当然,FORTRAN 和 BASIC 在很多其他方面也存在差异,但我发现了解一点 BASIC 可以帮助我快速学习 FORTRAN 编程。

我想通过使用两种语言编写相同的程序,展示它们之间的一些相似之处。通过编写一个示例程序来探索 BASIC 和 FORTRAN 77 中的 FOR 循环,这个程序将把 1 到 10 之间的数字相加。

Bywater BASIC

BASIC 存在许多种不同的版本,这取决于你的计算机,但该语言总体保持不变。我喜欢的一种 BASIC 版本是 Bywater BASIC,这是一种开源的 BASIC 实现,适用于包括 Linux 和 DOS 在内的不同平台。

要在 FreeDOS 上使用 Bywater BASIC,你必须首先从 FreeDOS 1.3 Bonus CD 中 安装该软件包。然后进入 C: 目录并输入 bwbasic 命令,这将启动 BASIC 解释器。你可以在这个提示符下输入程序:

bwBASIC:

Bywater BASIC 使用较早的 BASIC 编程标准,需要你在每个程序指令上编写一个行号。将行号视为索引。你可以使用行号轻松地引用程序中的任何指令。当你将程序键入 Bywater BASIC 解释器时,请在每个指令前添加行号:

bwBASIC: 10 print "Add the numbers from 1 to 10 ..."
bwBASIC: 20 sum = 0
bwBASIC: 30 for i = 1 to 10
bwBASIC: 40 sum = sum + i
bwBASIC: 50 next i
bwBASIC: 60 print sum
bwBASIC: 70 end

可以使用 list 命令查看你已经输入到解释器中的程序:

bwBASIC: list
10 print "Add the numbers from 1 to 10 ..."
20 sum = 0
30 for i = 1 to 10
40 sum = sum + i
50 next i
60 print sum
70 end

这个简短的程序演示了 BASIC 中的 FOR 循环。 FOR 是任何编程语言中最基本的循环构造,允许你迭代一组值。在 Bywater BASIC 中,FOR 循环的一般语法看起来像这样:

FOR 变量 = 起始值 TO 终止值

在这个示例程序中,指令 for i = 1 to 10 开始一个循环,迭代值为 1 到 10。在每个循环中,变量 i 被设置为新值。

在 BASIC 中,所有到 next 指令前的指令都将作为 FOR 循环的一部分执行。因为你可以将一个 FOR 循环放入另一个 FOR 循环中,Bywater BASIC 使用语法 NEXT 变量 来指定要迭代的循环变量。

在提示符下键入 run 来执行程序:

bwBASIC: run
Add the numbers from 1 to 10 ...
55

Bywater BASIC 被称为 BASIC 解释器,因为只能从 Bywater BASIC 环境中运行程序。这意味着解释器会处理与操作系统的交互的所有繁重工作,因此你的程序不需要自己完成这个工作。 这样做的代价是,程序在解释环境中运行会比它作为编译程序运行慢一些。

FreeBASIC

另一个流行的 BASIC 实现是 FreeBASIC,这是一个开源的 BASIC 编译器,适用于多个平台,包括 Linux 和 DOS。要使用 FreeBASIC,你需要从 FreeDOS 1.3 Bonus CD 安装 FreeBASIC 包,然后进入 C: 目录,你会在这里找到 FreeBASIC 程序。

FreeBASIC 是一个编译器,因此你首先需要创建一个包含程序指令的源文件,然后使用源代码运行编译器以创建一个可运行的程序。我编写了一个类似于“将 1 到 10 的数字相加”的程序版本,将其保存为 BASIC 文件,并命名为 sum.bas

dim sum as integer
dim i as integer
print "Add the numbers from 1 to 10 ..."
sum = 0
for i = 1 to 10
sum = sum + i
next
print sum
end

如果你将这段代码与 Bywater BASIC 版本的程序进行比较,你可能会注意到 FreeBASIC 不需要行号。FreeBASIC 实现了一种更现代的 BASIC 版本,使得编写程序时不需要跟踪行号更容易。

另一个主要的区别是你必须在源代码中定义或声明变量。使用 DIM 指令在 FreeBASIC 中声明变量,例如 dim sum as integer,以定义一个名为 sum 的整数变量。

现在可以在命令行上使用 fbc 编译 BASIC 程序:

C:\DEVEL\FBC> fbc sum.bas

如果你的代码没有任何错误,编译器将生成一个可以运行的程序。例如,我的程序现在称为 sum。运行我的程序将从 1 加到 10:

C:\DEVEL\FBC> sum
Add the numbers from 1 to 10 ...
55

FORTRAN 77

FORTRAN 编程语言类似于旧式和现代 BASIC 之间的混合体。FORTRAN 比 BASIC 更早出现,而 BASIC 显然从 FORTRAN 中汲取灵感,就像后来的 FORTRAN 版本从 BASIC 中获得启示一样。你可以将 FORTRAN 程序以源代码的形式写成文件,但并不需要在每个地方使用行号。但是,FORTRAN 77 在某些指令中使用行号(称为标签),包括 FOR 循环。在 FORTRAN 77 中,FOR 实际上被称为 DO 循环,它执行相同的功能并具有几乎相同的用法。

在 FORTRAN 77 中,DO 循环的语法如下:

DO 行号 变量 = 起始值, 终止值

这种情况是需要行号来指示 DO 循环结束位置的一种情况。你在 BASIC 中使用了 NEXT 指令,但 FORTRAN 需要一个行标签。通常,该行是一个 CONTINUE 指令。

查看这个示例 FORTRAN 程序,了解如何使用 DO 循环来循环一组数字。我将此源文件保存为 sum.f

PROGRAM MAIN
      INTEGER SUM,I
      PRINT *, 'ADD THE NUMBERS FROM 1 TO 10 ...'
      SUM = 0
      DO 10 I = 1, 10
        SUM = SUM + I
   10 CONTINUE
      PRINT *, SUM
      END

在 FORTRAN 中,每个程序都需要以 PROGRAM 指令开始,并指定程序名称。你可能会将此程序命名为 SUM,但随后在程序中不能使用变量 SUM。当我学习 FORTRAN 时,我从 C 编程中借鉴了一些东西,并以 PROGRAM MAIN 开始了我的所有 FORTRAN 程序,做法类似于 C 程序中的 main() 函数,因为我不太可能使用名为 MAIN 的变量。

FORTRAN 中的 DO 循环类似于 BASIC 中的 FOR 循环。它迭代从 1 到 10 的值。变量 I 在每次循环中获取新值。这样可以将 1 到 10 的每个数字相加,并在完成时打印总和。

你可以在每个平台上找到适合的 FORTRAN 编译器,包括 Linux 和 DOS。FreeDOS 1.3 的 Bonus CD 中包括 OpenWatcom FORTRAN 编译器。在 Linux 上,你可能需要安装一个包来安装 GNU Fortran 支持(在 GNU 编译器集合(GCC)中)。在 Fedora Linux 上,你可以使用以下命令添加 GNU Fortran 支持:

$ sudo dnf install gcc-gfortran

然后你可以使用以下命令编译 sum.f 并运行程序:

$ gfortran -o sum sum.f
$ ./sum
ADD THE NUMBERS FROM 1 TO 10 ...
55

一点不同之处

我发现 FORTRAN 和 BASIC 非常相似,但也存在一些不同之处。这些语言的核心是不同的,但如果你了解一些 BASIC,你可以学习 FORTRAN,同样,如果你了解一些 FORTRAN,你也可以学习 BASIC。

如果你想探索这两种语言,有几点需要注意:

  • FORTRAN 77 使用全大写,但后来的 FORTRAN 版本允许大小写混用,只要对变量、函数和子程序使用相同的大小写。大多数 BASIC 实现都不区分大小写,这意味着你可以自由地混合大小写字母。
  • 有许多不同版本的 BASIC,但它们通常做同样的事情。如果你学会了一种 BASIC 实现方式,很容易学会另一种。注意 BASIC 解释器或编译器的警告或错误信息,查阅手册了解差异。
  • 某些 BASIC 实现需要使用行号,例如 Bywater BASIC 和 GW-BASIC。更现代的 BASIC 版本允许你编写不使用行号的程序。FreeBASIC 需要使用 -lang 废弃选项编译带有行号的程序。

(题图:MJ/dba28597-dd62-4ffe-bb4a-e38874a65239)


via: https://opensource.com/article/23/4/basic-vs-fortran-77

作者:Jim Hall 选题:lkxed 译者:ChatGPT 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

上一篇文章 中,你学习了函数。在这篇文章中,我们将学习使用条件语句来管理 Rust 程序的控制流。

什么是条件语句?

在编写代码的时候,最常见的任务之一就是检查某些条件是否为 truefalse。“如果温度高于 35°C,打开空调。”

通过使用 ifelse 这样的关键字(有时候结合使用),程序员可以根据条件(例如提供的参数数量、从命令行传递的选项、文件名、错误发生等)改变程序的行为。

所以,对一个程序员来说,了解任何语言的控制流都是至关重要的,更不用说 Rust 了。

条件运算符

下表列出了所有常用的单个条件运算符:

运算符示例解释
>a > ba 大于 b
<a < ba 小于 b
==a == ba 等于 b
!=a != ba 不等于 b
>=a >= ba 大于等于 b
<=a <= ba 小于等于 b

以及下表是逻辑运算符,它们用于一个或多个条件之间:

运算符示例解释
` ` (逻辑或)`条件1 条件2`条件1条件2 中至少有一个为 true
&& (逻辑与)条件1 && 条件2所有 条件都为 true
! (逻辑非)!条件条件 的布尔值的相反值
? 与数学相似,你可以使用圆括号来指定操作的优先级。

使用 if else

要控制 Rust 代码的基本流程,使用两个关键字:ifelse。这可以根据提供的条件的状态创建两个“执行路径”。

一个简单的带有替代执行路径的 if 块的语法如下:

if 条件 {
    <语句>;
} else {
    <语句>;
}
? 当只有一个条件时,将其括在圆括号中并不是强制性的。根据语法,使用圆括号是可选的。你仍然应该使用它们来指定优先级并优化可读性。

来看看一个例子。

fn main() {
    let a = 36;
    let b = 25;

    if a > b {
        println!("a 大于 b");
    } else {
        println!("b 大于 a");
    }
}

这里,我声明了两个整数变量 ab,它们的值分别为 '36' 和 '25'。在第 5 行,我检查变量 a 中存储的值是否大于变量 b 中存储的值。如果条件计算结果为 true,则会执行第 6 行的代码。如果条件计算结果为 false,由于我们有一个 else 块(可选),第 8 行的代码将被执行。

来看看程序的输出。

a 大于 b

完美!

来修改一下变量 a 的值,使其小于变量 b 的值,看看会发生什么。我将把 a 的值改为 '10'。修改后的输出如下:

b 大于 a

但是,如果我将相同的值存储在变量 ab 中呢?为了看到这一点,我将两个变量的值都设置为 '40'。修改后的输出如下:

b 大于 a

嗯?从逻辑上讲,这没有任何意义... :frowning:

但是这可以改进!我们继续。

使用 else if 条件

与其他任何编程语言一样,你可以使用 else if 块来提供多于两个的执行路径。语法如下:

if 条件 {
    <语句>;
} else if 条件 {
    <语句>;
} else {
    <语句>;
}

现在,通过使用 else if 块,我可以改进程序的逻辑。下面是修改后的程序。

fn main() {
    let a = 40;
    let b = 40;

    if a == b {
        println!("a 与 b 是相等的");
    } else if a > b {
        println!("a 大于 b");
    } else {
        println!("b 大于 a");
    }
}

现在,我的程序的逻辑是正确的。它已经处理了所有的边缘情况(我能想到的)。第 5 行处理了 a 等于 b 的情况。第 7 行处理了 a 可能大于 b 的情况。而 a 小于 b 的情况则由第 9 行的 else 块隐式处理。

现在,当我运行这段代码时,我得到了以下输出:

a 与 b 是相等的

现在这就完美了!

示例:找到最大值

我知道使用 ifelse 很容易,但是让我们再看一个程序。这次,我们来比较三个数字。我还将在这个实例中使用逻辑运算符!

fn main() {
    let a = 73;
    let b = 56;
    let c = 15;

    if (a != b) && (a != c) && (b != c) {
        if (a > b) && (a > c) {
            println!("a 是最大的");
        } else if (b > a) && (b > c) {
            println!("b 是最大的");
        } else {
            println!("c 是最大的");
        }
    }
}

这个程序第一眼看上去可能很复杂,但是不要害怕,我会解释的!

最开始,我声明了三个变量 abc,并赋予了我能想到的随机值。然后,在第 6 行,我检查了没有变量的值与其他变量相同的条件。首先,我检查 ab 的值,然后是 ac,最后是 bc。这样我就可以确定没有变量中存储了重复的值。

然后,在第 7 行,我检查了变量 a 中存储的值是否是最大的。如果这个条件计算结果为 true,则会执行第 8 行的代码。否则,将检查第 9 行的执行路径。

在第 9 行,我检查了变量 b 中存储的值是否是最大的。如果这个条件计算结果为 true,则会执行第 10 行的代码。如果这个条件也是 false,那么只有一种可能。3 个变量中的最大值既不是 a 也不是 b

所以,自然地,在 else 块中,我打印出变量 c 拥有最大值。

来看看程序的输出:

a 是最大的

这是预期的结果。尝试修改分配给每个变量的值,并自己测试一下! :smiley:

总结

你学习到了如何使用 ifelse 语句。在你继续使用大量 if else if 语句制作自己的 AI 之前(哈哈),让我们在本系列的下一篇文章中学习 Rust 中的循环。

持续关注。

(题图:MJ/3eea3bbb-b630-4470-ae21-391ab86cd5bf)


via: https://itsfoss.com/rust-if-else/

作者:Pratham Patel 选题:lkxed 译者:Cubik65536 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

这份逐步指南教你如何将旧电脑重新翻新,使其继续发挥作用。

我们生活在一个激动人心的时代。不久之前,我们都被束缚在“升级跑步机”上,被迫每隔几年购买昂贵的新电脑。

今天,借助开源软件的好处,你可以打破这种循环。其中一种方法是 翻新旧电脑,让它们继续发挥作用。本文告诉你如何实现。

1、找一台旧电脑

也许你的地下室或仓库里有一台闲置的旧电脑,为什么不利用一下呢?

或者你可以从朋友、家人或二手广告中得到一台旧机器。许多电子回收中心会让你四处翻找并带走一台你看上的被抛弃的机器。如果可以的话,务必多带回来几台,因为你可能需要从几台被弃置的电脑中获取零件来组装成一台好的电脑。

看看机器前面的贴纸,确保选择的是好的可供翻新的机器。带有 Windows 7 和 8 标志的电脑非常适合运行 Linux。对于 8.1,其扩展支持已于今年 1 月份结束,所以我看到很多这样的电脑被丢弃。

很多这些 Windows 电脑提供了完全良好的硬件。它们只是因为计划性过时而被丢弃了,因为它们不能运行 Windows 11。但是它们可以很好地运行开源软件。

2、确认并清洁所有零件

在打开你的“新”机器之前,确保通过触摸金属物品消除静电。有可能一点点的静电都会破坏精细的电路。

你需要马上查看是否缺失了零件。许多人在丢弃电脑之前会取出它们的硬盘或内存条。你要么需要获取多台机器来解决这一点,要么就需要购买一两个零件来使它完整。

在进一步操作之前,给机器做彻底的清洁非常重要。特别注意 CPU 的复杂结构、风扇和所有表面。请记住,你不能用抹布来清洁电子设备,否则会有损坏的风险,因此使用压缩空气来清洁。

3、确保所有硬件均正常工作

在安装任何软件之前,你需要验证所有硬件是否正常工作。不要省略测试!如果你在进行下一步操作之前只是短暂运行了内存测试,并在以后发现你的计算机存在内存错误,那么这将会浪费你很多的时间。我发现在夜间运行耗时的测试非常方便。

大多数计算机都有内置的硬件专用诊断程序。你通常可以通过启动时的 UEFI/BIOS 面板或在启动时按下功能键来访问这些诊断程序。如果你的机器没有测试工具,请尝试使用 Ultimate Boot Disk,该工具提供了大量有用的测试工具。

确保你彻底测试了所有组件:

  • 内存
  • 磁盘
  • CPU 和主板
  • 外部设备(USB 端口、声音、麦克风、键盘、显示器、风扇等)

如果你发现问题,请下载我的免费 快速修复硬件指南。这加上一些在线搜索可以让你修复几乎任何东西。

4、准备硬盘

你已经评估了你的硬件并使其正常工作。如果你的计算机配备了硬盘驱动器(HDD),下一步是将其准备好以供使用。

你需要完全擦除硬盘,因为它可能包含违法获取的电影、音乐或软件。为了彻底清除 HDD,请运行类似 DBAN 的工具。运行完成后,你可以放心使用干净的硬盘。

如果你有一个固态硬盘(SSD),情况就会有点棘手。旨在清洁硬盘的磁盘擦除程序不能用于 SSD。你需要一个专用的“安全擦除”程序来清除 SSD。

一些计算机在其 UEFI/BIOS 中配备了“安全擦除”实用程序。你只需访问启动配置面板即可运行它。

另一个选择是访问硬盘制造商的网站。许多制造商为其 SSD 提供免费下载的安全擦除实用程序。

不幸的是,一些供应商并没有为其部分消费级驱动器提供安全擦除实用程序,而其他供应商仅提供一个 Windows 可执行文件。对于 SSD,Parted Magic 的安全擦除功能是最佳选择。

5、引导、数据存储和备份

你的翻新计算机的硬盘策略必须解决三个需求:引导、数据存储和备份。

几年前,如果你的翻新机器包含存储设备,它肯定是硬盘。你可以使用 DBAN 清除它,然后安装你喜欢的 Linux 发行版,并将其用作引导和存储设备。问题解决了。

今天的技术提供了更好的选择。这些解决了之前使用旧设备总是存在的硬盘访问慢等问题。

一种选择是购买一款现有的低端 SSD。这些现在提供了与成熟计算机兼容的 SATA 和外部 USB 接口。

它的价格已经暴跌。我最近以 $25 的价格购买了一块 480GB 的 SSD/SATA 硬盘。这么便宜,即使你的旧计算机配备了硬盘,你可能仍然愿意购买一块新的 SSD。它引导和访问数据的速度比硬盘快得多。

轻巧的 2.5 英寸 SSD 也解决了旧台式机常常面临的安装困境。使用一个螺丝钉,你可以将它们连接到几乎任何地方。不再需要处理轨道、硬盘架和所有其他傻瓜专有部件,企业曾用于安装它们的笨重的 3.5 英寸硬盘。

另一种选择是通过 USB 存储设备 引导。如今,U 盘提供了足够的空间来托管你喜欢的任何操作系统,同时还为你的数据留下一些存储空间。除了速度,通过将系统安装在便携式设备上,你还获得了灵活性。

所以考虑安装操作系统到快速的 SSD 或 USB 上,并从其中引导和运行它。

那其他驱动器呢?我喜欢将任何随计算机附带的硬盘作为我的启动 SSD 的备份磁盘。或将其用作大规模存储。

我通常会拆卸旧台式机中的光驱。由于 USB 存储设备更快且可存储更多数据,几乎没有人再使用光盘。现在大多数人通过流媒体观看电影、音乐和软件程序,而不是把它们收集在光盘上。

拆卸光驱会腾出额外的一组磁盘连接器。它也会在机箱中留出大量的空间,并改善了空气流动。如果你正在处理小体积的台式机,如微型塔式机或超薄机箱,则这可以有很大的影响。

最后,花几分钟时间来确定备份策略。你需要备份两个不同的东西:你的数据和操作系统。

你会备份到 PC 内的第二个驱动器、可拆卸存储设备还是云服务?你的决定有助于确定你是否需要在翻新的计算机中再添加一个硬盘。

6、选择并安装软件

不同的人有不同的需求,这些需求驱动他们选择软件。以下是一些一般性的指南。

如果你的计算机配备了英特尔 i 系列处理器和至少 4GB 内存,它几乎可以舒适地运行任何 Linux 发行版和任何 桌面环境(DE)

如果内存为 2 到 4GB,请安装一个 轻量级界面 的 Linux 系统。因为高端显示图形会大量占用内存资源。我发现像 XFCE、LXDE 和 LXQt 等 DE 的 Linux 发行版效果不错。

如果只有 1GB 内存,请选择“超轻量级”的 Linux 发行版。如果你拥有旧的双核 CPU 或相当的 CPU,这也应该是你的选择。

我已经在这样最小配置的硬件上使用了 Puppy LinuxAntiX 实现了很好的效果。它们都采用轻量级的窗口管理器作为用户界面,而不是完整的桌面环境,并且都捆绑了特别选择的应用程序,以最小化资源使用。

7、高效地浏览网页

在过去的五年中,网页已经大幅增长。许多受欢迎网站所需的计算机资源的一半以上现在都被广告和追踪器消耗了。所以在浏览网页时,要阻止所有这些广告和追踪器。如果可以将广告拦截从浏览器转移到 VPN,那么就更理想了。不要让自动播放的视频在没有得到你明确许可的情况下运行。

寻找最适合你设备的浏览器。有些浏览器采用多线程思想设计,如果你的 PC 可以支持,那就很棒。其他浏览器尝试最小化整体资源使用。许多人不知道有 相当多的 能够胜任的精简 Linux 浏览器可供选择。最终,选择最符合你设备和上网方式的浏览器。

8、玩得开心

不论你是想利用放在地下室的旧计算机,延长计算机的生命周期 来践行环保,还是只想找到一个免费的计算机,翻新都是一个值得追求的目标。

任何人都可以成功地实现翻新。除了投入你的时间,成本是很小的。在这个过程中,你肯定会学到一些技能。请在评论区中与大家分享你自己的翻新技巧。

(题图:MJ/44ebfc73-72a3-43ef-afec-663bbbc1c14b)


via: https://opensource.com/article/23/3/refurbish-old-computer-linux

作者:Howard Fosdick 选题:lkxed 译者:ChatGPT 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出