




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、計算機軟件技術(shù)基礎(chǔ)作業(yè)標(biāo)記語言的簡單解釋器算法實現(xiàn)1、源程序見包內(nèi),經(jīng)檢測可以在 MS VC+ 6.0中正確運行。本次作業(yè),還添加了現(xiàn)場輸入 測試功能,顯得功能更加強大了。2、標(biāo)記語言的簡單解釋器算法實現(xiàn),在本題中是通過構(gòu)造樹和堆棧實現(xiàn)的。3、算法思路:讀取壓入的字符串,如果讀到一個新的<> 組合,則把它添加到子列中,如果讀到了 </>組合,則與原有數(shù)據(jù)進行匹配,如果讀到標(biāo)記的值就把數(shù)據(jù)直接放到樹中去,其他情 況就跳出循環(huán)直接輸出樹的內(nèi)容。本題考慮到可以換行輸入,所以計算了''和'的數(shù)目,如果<'剛好是T就表明XML語言就要結(jié)束了!
2、4、數(shù)據(jù)結(jié)構(gòu)說明本程序使用了數(shù)和指針的結(jié)構(gòu),期間多次使用到了數(shù)組。5、程序流程說明6程序運行的驗證過程(1)導(dǎo)入文件(2)直接輸入代碼(3 )括號不匹配情況(4 )其它選項S3,rG : ¥i sual 匚卄 6. Owang:M)ebugwaiig. exe1*_! x|導(dǎo)入文件請按1,即時輸入即L標(biāo)記語宮請按,卽,退岀請按其他撫: t血您選擇了退出歡迎您下級的使用M ? Press Qin* key to continue7、效果分析本程序不但可以讀取文件,而且可以直接從屏幕輸入XML語言,方便易行,并且能夠進行基本的括號匹配檢查,可以作為簡單的標(biāo)記語言解釋器進行使用。&
3、原創(chuàng)內(nèi)容及體會剛開始編寫這個程序時我真的是了無頭緒,后來想到可以用一個字符串?dāng)?shù)組傳遞所需要的字符串內(nèi)容,并且篩選掉不必要的空格符和換行符,于是思路就豁然開朗了,我的編寫過程是首先屏幕直接輸入輸出進行檢驗,這一步做好之后,我離成功就不遠了,接下來就是導(dǎo)入文件的問題了,通過文件指針和fgetc()函數(shù),我很快地解決了這個問題,反思整個編寫過程,我發(fā)現(xiàn)最讓我耗時的地方還是數(shù)組和字符串之間的賦值問題,原來數(shù)組使用了 gets(數(shù)組名)就能夠很方便地轉(zhuǎn)化為字符串了!另外由于首尾標(biāo)記名稱和標(biāo)記值可以分行寫,這就要考慮什么時候停止讀入字符的問題了。通過仔細觀察,我發(fā)現(xiàn)當(dāng)符號<'的數(shù)量剛好是符號
4、7'的兩倍時,一按下回車鍵就是停止讀入數(shù)據(jù)之時,就這樣我把該解決的問題一個一個地解決掉了!以下是我的最終成果,“軟件2.cpp”:#in elude <iostream>#in elude <stri ng>#in elude <vector>#in elude <stack>using n amespace std;class Tree創(chuàng)建一個樹的類public:Tree(stri ng n ame)n=n ame;val=""no=+am ount;string Name()return n;void SetVal
5、(stri ng value)val=value;/ 設(shè)置元素內(nèi)容void AddChild(Tree *p)child.push_back(p);/ 添加子樹名稱void Print()/輸出第 n 個元素的有關(guān)內(nèi)int i; cout<<"Element "<<no<<" - "<<n<<" : " if(val.size()=0) cout<<"null"else cout<<val;cout<<", c
6、hild: "if(child.size()=0) cout<<"null"<<endl;elsefor(i=0;i<child.size();+i) cout<<"Element "<<childi->no<<" "cout<<endl;for(i=0;i<child.size();+i)childi->Print();static int amount; / 用來統(tǒng)計元素個數(shù)的靜態(tài)變量 private:string n;/樹中
7、記錄元素名字string val;/ 樹中記錄元素內(nèi)容int no;/ 樹中統(tǒng)計元素個數(shù)vector<Tree*> child; / 樹中用于記錄子樹;int Tree:amount=0; char buf80;int GetHead(char *xml)/tree 域內(nèi)的 amount 賦值為 0/ 創(chuàng)建一個 buf 數(shù)組/獲取標(biāo)記頭, 從 '<' 開始取遇到 '>' 為止字符串return (ssca nf(xml,"<%F>>",buf)=1);int GetVal(char *xml)/ 獲取
8、數(shù)據(jù),取遇到 '<' 為止字符串return (ssca nf(xml,"%F<",buf)=1);int GetTail(char *xml)/獲取標(biāo)記尾, 從 '<' 開始取遇到 '>' 為止字符串return (ssca nf(xml,"</%F>>",buf)=1);void cut(char *xml,int len)if(strlen(xml)>len)sprintf(xml,"%s",xml+len);elsestrcpy(x
9、ml,"");int main()char start800 ,n ,lujing100; int i=0,kuo=0,kuo2=0,gang=0,k=0; FILE *fp; cout<<" 導(dǎo)入 XML 文件請按 '1' ,即時輸入 XML 標(biāo)記語言請按 '2' ,退出請按其他鍵 "<<endl;cin>>n; getchar();cout<<endl;if(n='1')cout<<" 請輸入文件路徑: "<<e
10、ndl;gets(lujing); cout<<endl;/if(fp=fopen("test.xml","r")=NULL)/ 此行決定所導(dǎo)入文件的來源 ( 如:d:test.xml) !沒有路徑則表示出處在源程序所在文件夾中。if(fp=fopen(lujing,"r")=NULL) cout<<"File open error!"<<endl; exit(0);cout<<" 您導(dǎo)入的文件內(nèi)容是: "<<endl;while(!f
11、eof(fp) start-1='0' starti=fgetc(fp); /先使用一個數(shù)組 start800 存儲數(shù)據(jù),判別程 序是否結(jié)束cout<<starti; if(starti='<') kuo+;else if(starti='>') kuo2+;else if(starti='/') gang+;else;if(kuo=gang*2 && starti='>') break;else if(kuo!=2*gang&&starti='
12、n');else if(starti=' ');else i+;if(kuo2<kuo-1|kuo2>kuo)cout<<" 括號不匹配! "<<endl;/cout<<"2"<<endl;exit(0);/starti=fgetc(fp);/cout<<starti;/i+;if(starti!='>')cout<<endl<<endl<<" 此文件括號不匹配! "<<
13、endl;/cout<<"2"<<endl;exit(0);cout<<endl;if(fclose(fp)cout<<"Can not close the file!"<<endl;exit(0);else if(n='2')/在這種模式下,可以通過屏幕輸出XML 語言!cout<<" 請輸入 XML 語言, 首尾標(biāo)記名稱和標(biāo)記符可以分行寫 , 注意括號要匹 配: "<<endl;start-1='0'while(k!
14、=1)starti=getchar(); /先使用一個數(shù)組 start800 存儲數(shù)據(jù),判別程序 是否結(jié)束if(starti='<')kuo+;else if(starti='>')kuo2+;else if(starti='/')gang+;else;if(kuo=gang*2 && starti-1='>' &&starti='n')k=1; i+;else if(kuo=gang*2 && starti-1!='>' &a
15、mp;&starti='n')cout<<" 括號不匹配! "<<endl;/cout<<"1"<<endl;exit(0);else if(kuo!=2*gang&&starti='n');else if(starti=' ');elsei+;if(kuo2<kuo-1|kuo2>kuo)cout<<" 括號不匹配! "<<endl;/cout<<"2&qu
16、ot;<<endl;exit(0);else/按其他鍵則退出!cout<<" 您選擇了退出 ,歡迎您下次的使用 !"<<endl;exit(0);char xml800;strcpy(xml,start);/gets(xml);/strcpy(xml,"<class><student><name>ABC</name><id>123456</id>group1</student></class>");/puts(xml);co
17、ut<<endl<<" 以下是解釋語言: "<<endl;Tree *root=NULL,*p,*q;stack<Tree*> S; / 定義堆棧while(1)if(GetTail(xml)/ 到達樹根if(S.empty()cerr<<"expect <tag>"<<endl;break;if(S.top()->Name()=string(buf)S.pop();if(!S.empty() p=S.top(); else break;elsecerr<<"not match"<<endl; break;cut(xml,strlen(buf)+3);else if(GetHead(xml)/ 到達樹頭q=new Tree(string(buf);if(root=NULL)p=root=q
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 深圳市育才中學(xué)2025屆高三實驗班暑期第一次月考英語試題含解析
- 山東省淄博沂源縣聯(lián)考2025屆初三第一次適應(yīng)性考試(一模)物理試題含解析
- 江蘇省南菁高中學(xué)2024-2025學(xué)年初三下學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測語文試題理試題含解析
- 遼寧省丹東市五校協(xié)作體2025屆高三12月考-英語試題(含答案)
- 陜西省榆林市名校2024-2025學(xué)年中考模擬(8)語文試題含解析
- 西藏自治區(qū)日喀則市南木林縣2025年初三下期中考試英語試題理試題含答案
- 租賃合同大揭秘
- 機電設(shè)備交易合同樣本2025
- 與建筑公司簽訂的合同賠償協(xié)議
- 版中小學(xué)輔導(dǎo)機構(gòu)合同協(xié)議
- 辦公室設(shè)備設(shè)施清單
- 異常子宮出血診斷與治療指南解讀課件
- 機器學(xué)習(xí)之聚類分析課件
- DB64-T 698-2021危險場所電氣防爆安全檢測技術(shù)規(guī)范-(高清可復(fù)制)
- 運動處方的制定課件
- 腦干聽覺誘發(fā)電位課件
- 輸液泵/微量注射泵使用技術(shù)操作考核評分標(biāo)準(zhǔn)
- 附件1數(shù)據(jù)業(yè)務(wù)品質(zhì)管理指標(biāo)體系
- 康佳led彩電電路原理圖
- 中考英語任務(wù)型閱讀解題技巧課件
- (西北)火力發(fā)電廠汽水管道支吊架設(shè)計手冊
評論
0/150
提交評論