node基础与fs模块学习笔记

news2024/11/23 15:07:48

了解Node.js与内置模块

什么是Node.js?

Node.js® is an open-source, cross-platform JavaScript runtime environment.

node.js是一个开源跨平台的js运行环境

前端的运行环境就是浏览器。

注意:Node.js中无法调用DOM和BOM等浏览器内置API。

Node.js中的顶级对象为global,也可以用globalThis访问顶级对象.
如下代码会报错

// BOM
console.log(window);
console.log(history)
console.log(navigator)
console.log(location)

// DOM
console.log(document)
//AJAX
let xhr = new XMLHttpRequest();

浏览器中的JavaScript的组成部分

js核心语法:变量、数据类型;循环、分支、判断;函数、作用域、this等等

WebAPI:DOM操作、BOM操作,基于XMLHttpRequest的Ajax操作

为什么js可以在浏览器中执行

不同的浏览器有不同的JavaScript解析引擎:

Chrome浏览器的V8解析引擎性能最好。

在这里插入图片描述

为什么js可以操作DOM和BOM

每个浏览器都内置了DOM和BOM的API函数,因此浏览器中的js才可以调用他们。

浏览器中的JavaScript运行环境

运行环境是指代码正常运行所需要的必要环境。
V8引擎负责解析和执行JavaScript代码
内置API是由运行环境提供的特殊接口,只能在所属的运行环境中被调用。

JavaScript能否做后端开发

JavaScript借助node.js可以进行后台开发,单独不行。node.js可以作为后端运行环境和JavaScript完成后端开发。

node的安装和使用

node的安装

node官网可以下载两个版本,LTS是长期支持稳定版本,适用于企业大型项目。

current是最新的,可以尝试新特性但是可能存在漏洞和安全性问题。

终端输入node -v可以查看安装的版本

node的使用

  1. 打开终端win+r输入cmd进入终端
  2. 输入js文件的路径,cd可以切换路径 d:可以切换c盘d盘
  3. 运行命令:node demo.js

如何打开当前路径下的终端,可以在当前路径的地址栏输入cmd回车或者在空白处按住shift不松手鼠标右键打开powershell。

终端快捷键
↑ 快速定位到上次执行的命令
tab 快速补全路径
esc 快速清空当前输入的命令
cls 清空终端

文件写入

fs模块可以实现与硬盘的交互,例如文件的创建、删除、重命名、移动,还有文件内容的写入、读取,以及文件夹的相关操作。


若在js代码中使用fs模块操作文件,需要先导入

const fs=require(‘fs’)

writeFile异步写入

向指定文件中写入内容fs.writeFile(file, data[, options], callback)


file:必选参数,需要指定一个文件路径的字符串,表示文件的存放路径

data:必选参数,表示要写入的内容

options:可选参数,表示以什么编码格式来写入文件内容,默认值是utf8。

callback:必选参数,文件写入完成后的回调函数。

const fs = require('fs')
    fs.writeFile('./files/2.txt', 'hellonodejs', function (err) {
        
        console.log('写入成功!' + err)
        // 文件写入成功,err的值等于null
        // 文件写入失败,err的值等于一个错误对象
    })

运行结果截图
在这里插入图片描述

判断文件是否写入成功

const fs = require('fs')
    fs.writeFile('./files/2.txt', 'hellonodejs', function (err) {
        if (err) {
           return console.log('文件写入失败!'+err.message)
       }
        console.log('写入成功!' )
       
    })

运行截图
在这里插入图片描述
在这里插入图片描述

writeFileSync同步写入

fs.writeFileSync('./data.txt','test');

性能不高的场景可以使用同步写入。

appendFile/appendFileSync追加写入

fs.appendFile('./files/2.txt', '这是中文附加的字', err => {
    if (err) {
        console.log('写入失败');
        return;
    }
    console.log('追加写入成功')
});

fs.appendFileSync('./files/2.txt', '\r\n这是中文附加的字')

在这里插入图片描述

createWriteStream流式写入

语法: fs.createWriteStream(path[,options])

参数说明:

path文件路径

options选项配置(可选)


返回值:Object

代码示例:

// 1.导入fs模块
const fs = require('fs');
// 2.创建写入流对象
const ws = fs.createWriteStream('./files/给翠花的信.txt');
// 3.write
ws.write('亲爱滴翠花\r\n');
ws.write('我喜欢你很久了\r\n');
ws.write('可以借五毛钱嘛\r\n');
// 4.关闭通道
ws.close();

在这里插入图片描述

程序打开一个文件是需要消耗资源的,流式写入可以减少打开关闭文件的次数。

流式写入适用于大文件写入或者频繁写入的场景,writeFile适合与写入频率较低的场景。

写入文件的场景

当需要持久化保存数据的时候,应该想到文件写入

下载文件

安装软件

保存程序日志,如git

编辑器保存文件

视频录制

文件读取

readFile异步读取

fs.readFile(path[, options], callback)
path:必选参数,字符串,表示文件的路径。
options:可选参数,表示以什么编码格式来读取文件。
callback:必选参数,文件读取完成后,通过回调函数拿到读取的结果。

    const fs = require('fs')
    fs.readFile('./files/demo.txt', 'utf8', function (err, dataStr) {
        console.log(err)
        console.log('------')
        console.log(dataStr)
    })

callback回调函数,拿到读取的失败和成功的结果,err,dataStr

通过本路径下的powershell运行node

node 1

脚本文件名称过长使用tab键自动补全。

运行截图
在这里插入图片描述

读取成功err的值是null

读取失败err的值是错误对象,dataStr的值是undefined

判断文件是否读取成功

可以判断err对象是否是null,从而知晓文件读取的结果

    const fs = require('fs')
    fs.readFile('./files/demo.txt', 'utf8', function (err, result) {
        if (err) {
            return console.log('文件读取失败!' + err.message)
        }
        console.log('文件读取成功!' + result)
    })

运行结果截图
在这里插入图片描述

readFileSync同步读取

const fs = require('fs');

fs.readFile('./files/给翠花的信.txt', (err, data) => {
    if (err) {
        console.log('读取失败');
        return;
    }
    console.log(data.toString());
});

运行结果截图
在这里插入图片描述

createReadStream流式读取

const fs = require('fs');
const rs = fs.createReadStream('./files/匆匆那年.mp3');
rs.on('data', chunk => {
    console.log(chunk.length);
    console.log(chunk.toString());
})

流式读取chunk.length=65536字节对应的是64kb,就是流式读取每次在存储中读取64kb的内容。如果打印chunk.toString()会出现乱码,因为mp3音频不能打印成字符。
在这里插入图片描述

// end可选事件
rs.on('end',()=> {
    console.log('读取完成');
});

读取文件应用场景

  • 电脑开机
  • 程序运行
  • 编辑器打开文件
  • 查看图片
  • 播放视频
  • 播放音乐
  • git查看日志
  • 上传文件
  • 查看聊天记录

文件复制

第一种方式可以采用readFile读取文件内容,具体步骤先使用readFileSync读取文件,再用writeFileSync写入文件副本,即可完成。

const fs = require(('fs'));

let data = fs.readFileSync('./files/匆匆那年.mp3');

fs.writeFileSync('./files/匆匆那年-1.mp3', data);

第二种方法就是流式操作,创建读取流对象然后创建写入流对象,绑定data事件。

const fs = require(('fs'));
const rs = fs.createReadStream('./files/匆匆那年.mp3');
const ws = fs.createWriteStream('./files/匆匆那年-2.mp3');

rs.on('data', chunk => {
    ws.write(chunk);
});

运行结果截图
在这里插入图片描述

第二种方式占用资源更少一些,所以第二种方式更好一些。流式读取是块读取,内容一块一块被读取,占用的内存较少。
可以通过引入process模块,调用memoryUsage()方法查看内存占用情况。rss:表示node进程占用的内存总量。

const fs = require(('fs'));
const process = require('process');
let data = fs.readFileSync('./files/匆匆那年.mp3');

fs.writeFileSync('./files/匆匆那年-1.mp3', data);
console.log(process.memoryUsage());//rss
const rs = fs.createReadStream('./files/匆匆那年.mp3');
const ws = fs.createWriteStream('./files/匆匆那年-2.mp3');
//绑定data事件
rs.on('data', chunk => {
    ws.write(chunk);
});
rs.on('end', () => {                     
    console.log(process.memoryUsage());//24383488
})

在这里插入图片描述

在如图所示的rss值当中,流式操作的值更大因为文件太小。文件比较大的时候才会明显显示出流式操作更节约内存.
或者可以不绑定data事件,使用管道命令快速实现复制

rs.pipe(ws)

文件移动与重命名

在node.js中我们可以使用rename或者renameSync来移动和重命名文件或者文件夹

语法

fs.rename(oldPath,newPath,callback)

fs.renameSync(oldPath,newPath)

参数说明:

oldPath文件当前路径

newPath文件新的路径

callback操作后的回调

代码示例

const fs = require('fs')
fs.rename('./6文件赋值.js', './files/6文件复制.js', (err) => {
    if (err) throw err;
    console.log('移动完成')
});
fs.renameSync('./6文件赋值.js', './files/6文件复制.js');

在这里插入图片描述

文件删除

Node.js中使用unlink或者unlinkSync来删除文件

语法

fs.unlink(path,callback)

fs.unlinkSync(path)

参数说明:

path文件路径

callback操作后的回调

代码示例

const fs = require('fs')

fs.unlink('./test.txt', err => {
    if (err) throw err;
    console.log('删除成功');
});
fs.unlinkSync('./test2.txt');

在这里插入图片描述
在这里插入图片描述

// 调用rm方法     rmRync
fs.rm('./论语.txt', err => {
    if (err) {
        console.log('delete successfully');
        return;
    }
    console.log('删除成功');
})

在这里插入图片描述

文件夹操作

借助Node.js的能力,我们可以对文件夹进行创建、读取、删除等操作

mkdir/mkdirSync 创建文件夹

readdir/readdirSync 读取文件夹

rmdir/rmdirSync 删除文件夹

mkdir创建文件夹

fs.mkdir(path[,options],callback)

fs.mkdirSync(path[,options])

options选项配置(可选)

下面的代码可以创建一个名称为html的文件夹

const fs = require('fs');
fs.mkdir('./html', err => {
    if (err) {
        console.log('创建失败');
        return;
    }
    console.log('创建成功');
});

下面看一下递归创建文件夹的代码

fs.mkdir('./a/b/c', { recursive: true }, err => {
    if (err) {
        console.log('创建失败');
        return;
    }
    console.log('创建成功');
});

注意递归创建需要{ recursive: true },才可以成功的创建。

readdir读取文件夹

那么如何读取文件夹呢

fs.readdir('./files', (err, data) => {
    if (err) {
        return console.log('读取失败');
    }
    console.log(data);
});

在这里插入图片描述

rmdir删除文件夹

rm;remove移除
下面的代码用来演示删除html文件夹

const fs = require('fs');
fs.rmdir('./html', err => {
    if (err) {
        return console.log('删除失败')
    }
    console.log('删除成功');
});
// 递归删除
fs.rmdir('./a', { recursive: true }, err => {
    if (err) {
        return console.log('删除失败');
    }
    console.log('删除成功');
});

在这里插入图片描述

查看资源状态

stat或者statSync查看资源的详细信息

代码示例

const fs = require('fs');
fs.stat('./files/匆匆那年.mp3', (err, data) => {
    if (err) {
        return console.log('操作失败')
    }
    console.log(data);
    console.log(data.isFile());
    console.log(data.isDirectory());
});

结果值对象结构:size文件体积,birthday创建时间,mtime最后修改时间
isFile检测是否为文件,isDirectory检测是否是文件夹

相对路径和绝对路径

const fs = require('fs');

// 相对路径
fs.writeFileSync('./index.html', 'love');
fs.writeFileSync('index.html', 'love');
fs.writeFileSync('../index.html', 'love');

// 绝对路径
fs.writeFileSync('D:/index.html', 'love');
fs.writeFileSync('/index.html', 'love');

相对路径参照物:命令行的参照物

相对路径问题

在使用fs模块操作文件时。如果提供的操作路径是以./或者…/开头的相对路径时,很容易出现路径动态拼接错误的问题。
原因:代码在运行的时候,会以执行node命令所处的目录,动态拼接出被操作文件的完整路径。
在这里插入图片描述

fs.readFile('./files/1.txt','utf8',function(err.,dataStr){
    if(err){
        return console.log('读取文件失败!'+err.message)
    }
    console.log('读取文件成功!'+dataStr)
})

如果出现了路径拼接错误的问题,是因为提供了./或者…/开头的相对路径

如果要解决这个问题,可以直接提供一个完整的文件存放路径就行

fs.readFile('D:\\VUE\\nodejs\\files\\1.txt','utf8',function(err,dataStr){
    if(err){
        return console.log('读取文件失败!'+err.message)
    }
    console.log('读取文件成功!'+dataStr)
})

_dirname

// __dirname表示当前文件所处目录的绝对路径
console.log(__dirname)

__dirname所代表的值不会随着执行命令node路径动态拼接而变化,是个恒定的值
在这里插入图片描述

最佳实践

fs.readFile(__dirname+'./files/1.txt','utf8',function(err,dataStr){
    if(err){
        return console.log('读取文件失败!'+err.message)
    }
    console.log('读取文件成功!'+dataStr)
})

练习-考试成绩整理

使用fs文件系统模块,将素材目录下成绩.txt文件中的考试数据,整理到成绩-ok.txt文件中

核心实现步骤

  1. 导入需要的fs文件系统模块
  2. 使用fs.readFile()方法,读取素材目录下的成绩.txt文件
  3. 判断文件是否读取失败
  4. 文件读取成功后,处理成绩数据
  5. 将处理完成的成绩数据,调用fs.writeFile()方法,写入新文件成绩-ok.txt中
// 1.导入fs模块
const fs = require('fs')

// 2.调用fs.readFile()读取文件内容
fs.readFile('./素材/成绩.txt', 'utf8', function (err, dataStr) {
// 3.判断是否读取成功
    if (err) {
        return console.log('读取文件失败!'+err.message)
    }

    // console.log('读取文件成功'+dataStr)
// 4.1先把成绩的数据,按照空格进行分割
    const arrOld = dataStr.split(' ')
    
// 4.2循环分割后的数组,对每一项数据进行字符串的替换操作
    const arrNew = []
    arrOld.forEach(items => {
        arrNew.push(items.replace('=',':'))
    })
// 4.3把新数组中的每一项,进行合并,得到一个新的字符串
    const newStr = arrNew.join('\r\n')
    console.log(newStr)
       
    fs.writeFile('./files/成绩-ok.txt', newStr, function (err) {
    if (err) {
        return console.log('成绩写入失败'+err.message)
    }
    console.log('成绩写入成功')
    })
})

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

练习

批量重命名

首先,输出files文件夹的所有文件信息

const fs = require('fs');
// 读取code文件夹
const files = fs.readdirSync('./files');
// 遍历数组
files.forEach(item => {
    console.log(item);
})

终端输出:

PS D:\VUE\nodejs> node .\14批量重命名.js
1.txt
2.txt
3.txt
6文件复制.js
demo.txt
匆匆那年-1.mp3
匆匆那年-2.mp3
匆匆那年.mp3
成绩-ok.txt
给翠花的信.txt
完整的代码

const fs = require('fs');
// 读取code文件夹
const files = fs.readdirSync('./files');
// 遍历数组
files.forEach(item => {
// 拆分文件名
    let data = item.split('-');
    let [num, name] = data;
    // 判断
    if (Number(num) < 30) {
        num = '0' + num;
    }
    // 创建新的文件名
    let newName = num + '-' + name;
    // console.log(newName);
    // 重命名
    fs.renameSync(`./files/${item}`, `./files/${newName}`);
})

总结注意点

fs提供了同步、回调和基于promise的三种形式。同步api会阻塞线程,但对于某些场景,使用同步方法会更方便、更易理解

尽量使用promise方式,回调容易造成嵌套地狱

对于大文件,使用文件流的方式来读写文件 createReadStream 和 createWriteStream 来减少内存占用

三方npm包 fs-extra 是fs的一个拓展,提供了很多更方便的api

.forEach(item => {
// 拆分文件名
    let data = item.split('-');
    let [num, name] = data;
    // 判断
    if (Number(num) < 30) {
        num = '0' + num;
    }
    // 创建新的文件名
    let newName = num + '-' + name;
    // console.log(newName);
    // 重命名
    fs.renameSync(`./files/${item}`, `./files/${newName}`);
})

总结注意点

fs提供了同步、回调和基于promise的三种形式。同步api会阻塞线程,但对于某些场景,使用同步方法会更方便、更易理解

尽量使用promise方式,回调容易造成嵌套地狱

对于大文件,使用文件流的方式来读写文件 createReadStream 和 createWriteStream 来减少内存占用

三方npm包 fs-extra 是fs的一个拓展,提供了很多更方便的api

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/618315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【大数据工具】Zookeeper 分布式集群和伪分布式安装

Zookeeper 安装 zookeeper 安装包下载地址&#xff1a;https://archive.apache.org/dist/zookeeper/ 1. 伪分布式部署 说明&#xff1a;伪分布即在一台服务器上通过不同端口模拟出分布式集群的效果&#xff0c;分布式一般 3 台起&#xff0c;一主两从。 说明&#xff1a;伪…

华为OD机试真题 Java 实现【斗地主之顺子】【2023 B卷 100分】,附详细解题思路

一、题目描述 在斗地主扑克牌游戏中&#xff0c;扑克牌由小到大的顺序为: 3.4.5.6.7.8.9.10.J.Q.K A.2&#xff0c;玩家可以出的扑克牌阵型有: 单张、对子、顺子、飞机、炸弹等。 其中顺子的出牌规则为: 由至少 5 张由小到大连续递增的扑克牌组成&#xff0c;且不能包含 2。 …

RK1126 NPU yolov5 6.2

基于 rk npu &#xff0c; 实现 yolov5 6.2 模型推理 实现过程 ⚡️​ 编译 opencv 需根据自己路径修改. cmake -D CMAKE_BUILD_TYPERELEASE \-D CMAKE_C_COMPILER./gcc-arm-8.3-2019.02-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc \-D CMAKE_CXX_COMPILER./gc…

VMware虚拟机Ubuntu磁盘空间扩充详细教程

文章目录 一、写在前面二、具体步骤三、最后总结 一、写在前面 最近在做Linux内核相关实验的时候&#xff0c;发现有时候我们编译出来的内核太大&#xff0c;如果VMware虚拟机空间分配不足会导致编译Linux内核失败&#xff0c;经过摸索&#xff0c;发现可以扩充Ubuntu的磁盘空间…

【Rust日报】2023-06-05 Effective Rust: 35种提升 Rust 代码的方法

Effective Rust: 35种提升Rust代码的方法 这是一本关于 Rust 的最佳实践指南的电子书&#xff0c;其中包含了很多 Rust 编程的技巧和建议。 这篇指南分为多个章节&#xff0c;涵盖了 Rust 编程的各个方面, 他分别从 类型, 概念, 依赖, 工具 等几大类上阐述了 35 种提高 Rust 代…

记录--你真的能区分JavaScript的各种导入导出方式吗?

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 &#x1f6f0;&#x1f6f0; 我们在无论是在查阅别人的代码&#xff0c;还是在实际项目开发的过程中&#xff0c;肯定都会使用导入导出的功能&#xff0c;有时候我们会搞混这几种方式到底有什么区…

有哪些比较好的游戏图标推荐

游戏图标设计在游戏UI中占有非常重要的地位。例如&#xff0c;当我们看到一个游戏的启动图标时&#xff0c;很容易区分它是哪个游戏。设计游戏图标不仅是一个图形&#xff0c;也是一个标志。 本文将通过各种游戏图标设计素材分享游戏图标的类别和设计游戏图标的思考。 1. 游戏…

基于SSM+JSP的大学生校园兼职系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

wsl连接usb设备,以及挂载u盘

目录 wsl连接usb设备 安装usbinpd-win 配置 在kali中做写的配置 在wsl中的配置 在kali中查看附加结果 报错 挂载u盘&#xff0c;查看u盘的内容 wsl连接usb设备 安装usbinpd-win winget install --interactive --exact dorssel.usbipd-win 配置 在kali中做写的配置 s…

Java 21 将不再有public static void main !

之前的Java是这样&#xff1a; Java 21会是这样&#xff1a; 看到这个消息&#xff0c;我最大的感受是&#xff1a; 卧槽&#xff0c;怎么就Java 21了&#xff1f;&#xff01;我还在用Java 8 呢&#xff01; 实际上&#xff0c;从Java 8 到Java 21&#xff0c;中间也就是Java…

“Pull”和“Push”支付的区别

下图展示了“Pull”和“Push”支付的工作原理。 当我们在商家处刷信用卡/借记卡时&#xff0c;这是一种“Pull”支付&#xff0c;资金从持卡人的账户发送到商家。商家从持卡人的账户中取款&#xff0c;而持卡人批准交易。 通过Visa Direct或Mastercard Send&#xff0c;推送支付…

WebRTC实战 | 视频云

前言 WebRTC是当前实时通信领域的重要技术之一&#xff0c;具有广泛的应用前景。可以实现音频、视频和数据的实时传输。支持点对点通信、多方会议、屏幕共享等多种应用场景&#xff0c;同时具有高质量、低延迟、强安全性等特点&#xff0c;是开发实时通信应用的理想选择。可以应…

从“嘿,Siri”到元宇宙,苹果还有多远距离要走?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 在当前的科技浪潮中&#xff0c;元宇宙的概念凭借其无限的想象力和可能性&#xff0c;像一颗耀眼的新星吸引着世界的目光。巨大的发展潜力&#xff0c;吸引着一波又一波的企业&#xff0c;前赴后继地向元宇宙发起冲锋。 在这…

27.打包项目

目录 1 打包成dist 2 flask配合dist 3 以文件形式打开 1 打包成dist 项目路径下输入 npm run build 在项目路径下会出现一个dist 打包后直接双击打开index.html是没有用的 因为你双击打开是file协议&#xff0c;你需要一个http协议 2 flask配合dist 我们可以搞一个fla…

「企业信息架构」EA874:信息架构治理概述

信息治理是一个程序&#xff0c;它实现决策权和支持机制&#xff0c;以确保整个企业信息的准确性、完整性、一致性、可访问性和安全性。为了维持信息治理&#xff0c;需要在业务&#xff08;而不是IT&#xff09;中确定和建立几个角色。这三个角色可能单独存在&#xff0c;也可…

分布式光伏消纳的微电网群共享储能配置策略研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【AUTOSAR】Bootloader说明(四)---- 升级主函数

刷新主函数uds_refresh_main() 当执行完初始化后&#xff0c;DSP进入刷新主函数。 主函数是一个无穷循环函数&#xff0c;完成诊断消息的接收、处理&#xff0c;诊断状态的刷新等。 函数原型 void bblk_normal_isr(void) 函数作用 完成看门狗服务&#xff0c;清楚定时器中…

如何在ImageSpan上面绘制文本?

简介&#xff1a;TextOnImageSpan 前阵子碰到一个需求&#xff1a;在文本中内嵌图标&#xff0c;并在图标上面绘制特定文本。很自然就会想到用SpannableString去实现&#xff0c;但经过一系列的研究捣鼓&#xff0c;发现根本就没有能在图标上绘制文本的span类&#xff0c;于是乎…

单马达可换档六足机器人前进功能的实现

1. 运动功能说明 本文示例将实现R046样机单马达可换档六足机器人前进的功能。 2. 结构说明 本样机只有一个圆周舵机&#xff0c;却可以通过换挡机构实现前进和转向两种行走姿态。 样机由一个圆周舵机带动一个等速齿轮组&#xff08;下图所示两枚蓝色齿轮&#xff09;&#xff0…

C#,码海拾贝(26)——求解“一般带状线性方程组”之C#源代码

在大型稀疏方程组中&#xff0c;最常见的是带状方程组&#xff0c;其系数矩阵是带状矩阵&#xff0c;非零元素仅集中在对角线附近的带状区域内。 特别的&#xff0c;当上下带宽相等时我们A称方程组为等带宽方程组。总带宽为3的等带宽方程组我们又叫三对角方程组。 using Syste…