作業(yè)7:Javascript編程訓練

引言

任務一

制作一個鏈表list,實現(xiàn)鏈表的加入熊尉,刪除膏潮,查詢等操作锻狗。同時把該數(shù)據(jù)保存為json格式的文件;并能從文件讀取到內(nèi)存中。

任務二

生成1000個1-10000的數(shù)字轻纪,插入到以上集合中油额。 利用filter函數(shù)過濾掉那些少于2000的數(shù)字。

提示:可以基于其他語言的代碼進行修改刻帚;但盡量采用面向?qū)ο蟮木幊谭椒ā?/p>


環(huán)境

  • windows10
  • VisualStudio2019()
  • javascript
  • Node.js
  • MicrosoftEdge瀏覽器

先來在vs上配置Node.js環(huán)境

  1. 打開vs潦嘶,選擇“繼續(xù)但無需代碼”。
  2. 在菜單中選擇“工具”->“獲取工具和功能”我擂。
  3. 選中Node,js開發(fā)->修改
  4. 等待安裝完成衬以。
  5. 重新打開vs缓艳。創(chuàng)建新項目校摩。
  6. 選擇基于現(xiàn)有Node.js代碼。下一步阶淘。
  7. 輸入項目名稱和存儲位置衙吩。創(chuàng)建。

8.新創(chuàng)建的工程已經(jīng)有一個實例js文件server.js了溪窒,以后在項目中創(chuàng)建的任何js文件都需要在開頭寫上server中的這些代碼坤塞。

具體過程

任務一:制作一個鏈表list,實現(xiàn)鏈表的加入澈蚌,刪除摹芙,查詢等操作。同時把該數(shù)據(jù)保存為json格式的文件宛瞄;并能從文件讀取到內(nèi)存中浮禾。
  1. 創(chuàng)建一個js文件,將server.js的內(nèi)容復制來份汗。
'use strict';
var http = require('http');
var port = process.env.PORT || 1337;

http.createServer(function (req, res) {
    res.writeHead(200, { 'Content-Type': 'text/plain' });

    res.end('Hello World\n');
}).listen(port);
  1. 寫鏈表結(jié)點類
class Node {//鏈表結(jié)點
    constructor(key) {//構(gòu)造函數(shù)
        this.key = key;//數(shù)據(jù)域
        this.next = null;//指針域
    }
}
  1. 接著寫寫鏈表類和對應的構(gòu)造函數(shù)
class List {//鏈表類
    constructor() {//構(gòu)造函數(shù)
        this.head = null;//頭結(jié)點
    }
}
  1. 首先給List類寫一個display()函數(shù)盈电,用來驗證我們是否對鏈表進行了有效的操作。
    display() {//打印鏈表
        var arr = [];//將鏈表內(nèi)容復制到一個數(shù)組中
        for (let i = this.head; i; i = i.next) {
            arr.push(i.key);
        }
        console.log(arr.join(" "));//將數(shù)組轉(zhuǎn)化為字符串杯活,用空格分隔
    }
  1. 先來測試一下display函數(shù)匆帚。直接在js文件的最后寫上:
var list = new List();
list.display(); 

點擊

沒有輸出任何內(nèi)容,因為鏈表是空的
  1. List類的成員函數(shù): 插入新元素
   insert(key) {//在鏈表頭插入新節(jié)點
        var temp = new Node(key);
        temp.next = this.head;
        this.head = temp;
    }

相應的測試代碼

var list = new List();
console.log("建立鏈表list");
for (let i = 5; i >= 1; i--) {
    list.insert(i);
    console.log("插入" + i);
}
list.display(); 

運行截圖
  1. List類的成員函數(shù): 查找元素
    find(key) {//按key值查找旁钧,返回對應的結(jié)點吸重。若未找到,返回null
        var node;
        for (node = this.head; node && node.key !== key; node = node.next);
        return node;
    }

測試代碼:

var list = new List();
console.log("建立鏈表list");
for (let i = 5; i >= 1; i--) {
    list.insert(i);
    console.log("插入" + i);
}
list.display(); 

for (let i = 5; i >= 1; i--) {
    if (!list.find(i)) {
        console.log('未找到' + i);
    }
    else {
        console.log('找到' + i);
    }
}

運行截圖:
  1. List類的成員函數(shù): 刪除元素
    delete(node) {//結(jié)點作為參數(shù)(可以通過find獲得)
        var i;
        if (this.head === node) {//刪除第一個結(jié)點
            this.head = this.head.next;
        }
        else {//刪除除了第一個以外的結(jié)點
            for (i = this.head; i && i.next !== node; i = i.next);
            i.next = node.next;
        }
    }
  1. List類的成員函數(shù): 保存列表為JSON文件
    save(fileName) {//保存列表為JSON文件
        var fs = require("fs");
        fs.writeFileSync(fileName, JSON.stringify(this));
        console.log("寫入文件成功" + fileName);
    }
  1. List類的成員函數(shù): 從JSON文件中讀取鏈表
    read(fileName) {//從JSON文件中讀取鏈表
        var fs = require("fs");
        var buf = new Buffer.alloc(1024);
        fs.openSync(fileName, 'r+');//打開文件
        var data = fs.readFileSync(fileName);
        var obj = JSON.parse(data.toString());//將JSON轉(zhuǎn)化為JS對象
        this.head = obj.head;//賦值給this
        console.log("讀取文件成功" + fileName);
    }
  1. 測試鏈表的功能
//以下為測試
//創(chuàng)建鏈表
var list = new List();
console.log("建立鏈表list");
//插入元素
for (let i = 5; i >= 1; i--) {
    list.insert(i);
    console.log("插入" + i);
}
list.display(); 
//查找元素
for (let i = 5; i >= 1; i--) {
    if (!list.find(i)) {
        console.log('未找到' + i);
    }
    else {
        console.log('找到' + i);
    }
}
//保存鏈表
list.save("E:\\我的本命\\下載\\list.txt");
//讀取鏈表
var newList = new List();
newList.read("E:\\我的本命\\下載\\list.txt");
newList.display();
//刪除元素
list.delete(list.find(3));
console.log('刪除' + 3);
list.display();
list.delete(list.find(1));
console.log('刪除' + 1);
list.display();
list.delete(list.find(5));
console.log('刪除' + 5);
list.display();
list.delete(list.find(2));
console.log('刪除' + 2);
list.display();
list.delete(list.find(4));
console.log('刪除' + 4);
list.display();
  1. 運行結(jié)果:

    創(chuàng)建的文件:
任務二:生成1000個1-10000的數(shù)字歪今,插入到以上集合中嚎幸。 利用filter函數(shù)過濾掉那些少于2000的數(shù)字。
  1. 在原來的項目中新建一個js文件彤委,將任務一的Node和List類復制過來鞭铆。
'use strict';
var http = require('http');
var port = process.env.PORT || 1337;

http.createServer(function (req, res) {
    res.writeHead(200, { 'Content-Type': 'text/plain' });

    res.end('Hello World\n');
}).listen(port);

class Node {//鏈表結(jié)點
    constructor(key) {//構(gòu)造函數(shù)
        this.key = key;//數(shù)據(jù)域
        this.next = null;//指針域
    }
}

class List {//鏈表類
    constructor() {//構(gòu)造函數(shù)
        this.head = null;//頭結(jié)點
    }

    display() {//打印鏈表
        var arr = [];//將鏈表內(nèi)容復制到一個數(shù)組中
        for (let i = this.head; i; i = i.next) {
            arr.push(i.key);
        }
        console.log(arr.join(" "));//將數(shù)組轉(zhuǎn)化為字符串,用空格分隔
    }

    find(key) {//按key值查找,返回對應的結(jié)點车遂。若未找到封断,返回null
        var node;
        for (node = this.head; node && node.key !== key; node = node.next);
        return node;
    }

    insert(key) {//在鏈表頭插入新節(jié)點
        var temp = new Node(key);
        temp.next = this.head;
        this.head = temp;
    }

    delete(node) {//結(jié)點作為參數(shù)(可以通過find獲得)
        var i;
        if (this.head === node) {//刪除第一個結(jié)點
            this.head = this.head.next;
        }
        else {//刪除除了第一個以外的結(jié)點
            for (i = this.head; i && i.next !== node; i = i.next);
            i.next = node.next;
        }
    }
    save(fileName) {//保存鏈表為JSON文件
        var fs = require("fs");
        fs.writeFileSync(fileName, JSON.stringify(this));
        console.log("寫入文件成功" + fileName);
    }

    read(fileName) {//從JSON文件中讀取鏈表
        var fs = require("fs");
        var buf = new Buffer.alloc(1024);
        fs.openSync(fileName, 'r+');//打開文件
        var data = fs.readFileSync(fileName);
        var obj = JSON.parse(data.toString());//將JSON轉(zhuǎn)化為JS對象
        this.head = obj.head;//賦值給this
        console.log("讀取文件成功" + fileName);
    }
}
  1. 在末尾加上
var arr = [];

//生成1000個1-10000的數(shù)字
console.log("生成1000個1-10000的數(shù)字");
for (let i = 1; i <= 1000; i++) {
    arr.push(Math.random() * 10000);
}
console.log(arr);

//利用filter函數(shù)過濾掉那些少于2000的數(shù)字
console.log("利用filter函數(shù)過濾掉那些少于2000的數(shù)字");
var newArr = arr.filter(function (x) {
    return x>= 2000;
})
console.log(newArr);

//將經(jīng)過過濾的元素插入到鏈表中
var list = new List;
for (let i = 0; i < arr.length; i++) {
    list.insert(newArr[i]);
}

list.display();

運行結(jié)果:


總結(jié)

  1. 我有一些C++編程基礎,所以看JS教程的時候還是很容易看懂的舶担。但是自己寫JS的時候坡疼,還是感覺不太適應這種動態(tài)類型的語言(C++的習慣太頑固了,改不過來)衣陶。以下是
  • 雖然JS也有和C++類似的類柄瑰,但是JS的類的屬性是可以隨時增減的,所以不用聲明成員變量剪况,只需在構(gòu)造函數(shù)中直接添加即可教沾。

  • JS沒有C++中的指針。由于JS中的對象都是引用類型的译断,將下一個結(jié)點直接賦值給next變量授翻,就相當于實現(xiàn)了指針的功能。感覺還是這樣比較簡單孙咪。

  • JS可以直接寫代碼堪唐,不一定要在函數(shù)里寫。C++工程從main函數(shù)開始執(zhí)行翎蹈,而js工程需要將某一個文件設為啟動文件淮菠。

  • JS的成員函數(shù)中,成員變量必須要使用this.變量名的寫法荤堪,不能省略this合陵。

  1. 推薦一些js學習網(wǎng)站
    w3school這個比較詳細
    廖雪峰的官方網(wǎng)站這個適合快速入門
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市逞力,隨后出現(xiàn)的幾起案子曙寡,更是在濱河造成了極大的恐慌,老刑警劉巖寇荧,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件举庶,死亡現(xiàn)場離奇詭異,居然都是意外死亡揩抡,警方通過查閱死者的電腦和手機户侥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來峦嗤,“玉大人蕊唐,你說我怎么就攤上這事∷干瑁” “怎么了替梨?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵钓试,是天一觀的道長。 經(jīng)常有香客問我副瀑,道長弓熏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任糠睡,我火速辦了婚禮挽鞠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘狈孔。我一直安慰自己信认,他們只是感情好,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布均抽。 她就那樣靜靜地躺著嫁赏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪到忽。 梳的紋絲不亂的頭發(fā)上橄教,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機與錄音喘漏,去河邊找鬼。 笑死华烟,一個胖子當著我的面吹牛翩迈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盔夜,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼负饲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了喂链?” 一聲冷哼從身側(cè)響起返十,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎椭微,沒想到半個月后洞坑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡蝇率,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年迟杂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片本慕。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡排拷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锅尘,到底是詐尸還是另有隱情监氢,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站浪腐,受9級特大地震影響何鸡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牛欢,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一骡男、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧傍睹,春花似錦隔盛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至访得,卻和暖如春龙亲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悍抑。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工鳄炉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搜骡。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓拂盯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親记靡。 傳聞我的和親對象是個殘疾皇子谈竿,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容