IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 前言:为了在PTA上用JavaScript做题,如何利用 Node.js 进行输入输出? -> 正文阅读

[JavaScript知识库]前言:为了在PTA上用JavaScript做题,如何利用 Node.js 进行输入输出?

开始之前

PTA的题解网上可以搜到一大堆,但是大多数是C、C++或者其他语言版的,总之,JavaScript版的很少。其原因并不是此处的重点,重点是,由于我主修的是JavaScript,同时我也很想用JavaScript来在PTA上做题,而在PTA上做题需要进行读取输入以及输出的操作,而JavaScript本来是没有标准输入输出这种东西的(和C/C++、Python等相比,它不算是一门后端语言),后来出现的Node.js使之变成了现实。尽管如此,现在网上也不太容易找到一篇专门讲解为了在PTA上用JavaScript做题,输入输出到底应该怎么做的教程,而这恰恰是很多用JavaScript刷PTA的新手的困惑之处。因此这篇文章就是来做这件事,详细讲解为了在PTA上用JavaScript做题,如何利用 Node.js 进行输入输出?

开始之前,假定读者使用的代码编写工具为vscode。因为这是一款颜值高、使用体验好的轻量级代码编辑器(打广告ing)——因为用它来写JavaScript代码还是很方便的,可以配置单独运行JavaScript文件的环境(只要简简单单安装个node还有Code Runner插件就行了,node安装教程推荐
这个
)。

同时建议用vscode运行js代码时放到终端输出,因为在“输出”那一栏输出的话有时候会出现中文乱码的情况,而且没有终端输出体验好。

基本输入操作

现在正式开始,先把Node.js读取输入的最好用的模板放出来:

const readline = require('readline');
const rl = readline.createInterface({
	input: process.stdin,
	output: process.stdout
});

rl.on('line', function(line){
	//做题的主体代码
});

头两个const声明可以说是定式了,用的时候直接复制粘贴过去就行。
重点在于那个on方法。代码执行到on方法时程序将开始持续按行接受输入(控制台输入,放到PTA上就是接受它给出的输入用例)。注意它是按行接受输入,也就是说当它读取输入时碰到换行符(是敲回车键产生的换行符,不是打出来看得见的\n)时就认为这一行输入结束了,然后将这一行输入以字符串的形式赋值给on方法的第二个参数——一个带有一个参数的函数表达式——的参数,也就是上面代码中的函数参数line,不是引号括起来的那个哦,那个是表示line事件。所以line就是最终读取的输入的字符串形式:
在这里插入图片描述

on方法每接受一行输入(碰到换行符认为一行输入完毕时)就会暂停接受输入,转而去执行on方法的第二个参数——那个函数(下文称其为回调函数)
,如果回调函数内部没有写rl.close();结束接受输入的话就会接着处于接受输入的状态,再接受一行输入,就像上面那样执行完一遍回调函数后下一行仍然会出现等待输入的光标。然后接受一行输入完毕后再整个执行一遍回调函数,反复循环:
在这里插入图片描述
除非回调函数内部写了rl.close();,那样的话回调函数碰到这一行代码就会立即停止执行,同时也不会再接受新的输入,程序就结束了:
在这里插入图片描述

对了,回调函数中的这个参数line其实是任意命名的,就像其他任何函数参数一样,比如你把它命名成data、inputs什么的都可以。

何时使用rl.close()方法

关于on方法还有一点需要注意的。上面说做题的主体代码需要放在回调函数里面(除了变量声明部分可以放在外面,我也推荐将变量声明部分放在外面),那么放在外面行不行呢?不行!看下面的图:
在这里插入图片描述
发现了吗?所有放在on方法外面的代码,即使是放在on方法后面的代码都会先于on方法执行,on方法本身放到最后执行。在PTA中所有的主体代码都是基于输入进行操作的,还没有输入就执行了处理代码,这算什么呢?所以一定要将做题的主体代码放在回调函数里面,但同时我推荐将所有用到的变量的声明都放在外面,这样当我们遇到多行输入的情况、回调函数被反复执行时不会将某些变量反复声明或者初始化,从而出现bug。可以看一下我后面的题目的题解代码,变量声明都是放在on方法外面的。

回归正题,何时使用rl.close()方法呢?Emm。。。其实不用也可以,虽然这样会让程序在所有代码执行完后仍然处于等待输入状态,但是对于PTA而言只要输入完了也都处理完了也都输出完了,那就可以评判结果了,所以说不用也可以,没有影响。但是作为强迫症的我是一定要想办法结束输入从而彻底结束整个程序的,而且这里可以顺便一提多行输入时要注意的点。办法也很简单:rl.close();放到整个程序执行的过程里的最后一步,注意不是指回调函数里代码的最后一行!因为只要在程序执行过程中碰到了rl.close();,整个程序就结束了(on方法会放到最后执行),而在一些多行输入的过程中回调函数会被执行多次,如果直接把rl.close();放在回调函数里的最后一行,那么回调函数第一次执行完整个程序就结束了,根本没有去读取接下来几行的输入的机会,对吧?

当然很明显这种影响也只有在多行输入的时候才会有,如果只有一行输入的话rl.close();肯定是直接放在回调函数里的最后一行了。那么多行输入时将rl.close();放在哪里呢(当然是整个程序执行的过程里的最后一步!!!)?看下面的代码:
在这里插入图片描述

这里在on方法外(也必须在on方法外!)声明了一个lineNumber变量来存储输入行的行号(从0开始,当然你想从1开始也可以),假设我们知道这个程序只接受4行的输入(实际上在PTA做题时多数需要多行输入的题目都是事先知道需要接受多少行输入的),那么上图中的 if 语句和lineNumber++;配合起来就能标记当前是第几行输入,对于每一行应当做什么样的处理(很多题目需要对多行输入中的不同行做不同的处理,比如第一行作为数字处理,其他行作为字符串处理),以及如果到了最后一行时在 if 里放一个rl.close();就行了,这样才算是将其放在了整个程序的结束处。这样我们就能处理多行输入的情况了。

后面可以看看我的题解代码是怎么使用lineNumber变量来处理多行输入的,其实也很简单。

关于多行输入还有一个小技巧,就是我们在vscode上自己调试程序时如果在控制台手动一行一行输入的话是很麻烦的,即使是一行一行复制粘贴也是很麻烦的,我推荐在当前js文件的同级位置新建一个文本文件,将多行输入的内容放在里面,输入时可以直接将一整个多行的内容复制粘贴进控制台里,这样跟你一行一行输入进去的效果是一样的。

对了,最后再提一点:在vscode中断点调试js代码时,on方法内部的代码是无法调试的,调试到on方法时会直接跳过去。想要调试其内部代码的话就要把它们拎出来单独调试了。

关于用Node.js读取输入就讲这么多了,想要用得熟练就要在实战中慢慢练习了。

Node.js获取输入微总结

1.回调函数的参数(可命名为line、data等)就是输入的字符串形式。
2.每次只接受一行输入,一行输入完毕就会将回调函数整个执行一遍。
3.多行输入时需借助lineNumber变量来标记当前是第几行输入,便于对不同行进行不同的处理以及将rl.close()方法放在合适的位置。别忘了lineNumber++这行代码!
4.自己本地调试程序时快速多行输入的小技巧。

如何输出

输出其实很简单,即console.log();。只不过只会这个的话就会有点问题,因为PTA的输出格式是要求非常严格的,比如末尾不能有多余的空格、空行等等,否则就会报“格式错误”的错误。而console.log();的输出会在最后面自动加一个换行符,也就是说会让最后一行输出后面多一个空行。为了解决这个问题,如果想要输出不带换行符的输出(类似于C语言中的printf函数那样),可以用process.stdout.write()方法来替代console.log()

process.stdout.write('hello!');
process.stdout.write('hi!');
process.stdout.write('hey!');
//输出:
//hello!hi!hey!

只要是用node运行的js代码都可以直接用这个方法。

有一点要特别注意!就是这个process.stdout.write()方法的参数必须是字符串,不然会报错!如果你的代码报了像下面这样的错误:

在这里插入图片描述
就要认真检查一下你的process.stdout.write()方法的参数是不是有问题了。

好了,关于 Node.js 如何输入输出就讲到这里,剩下的就要靠大家自己去实战练习了。

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-12 23:20:30  更:2021-10-12 23:21:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 22:40:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码