




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
計算機軟件技術(shù)基礎作業(yè)二標記語言的簡單解釋器算法實現(xiàn)1、 源程序見包內(nèi),經(jīng)檢測可以在MSVC++6.0中正確運行。本次作業(yè),還添加了現(xiàn)場輸入測試功能,顯得功能更加強大了。2、 標記語言的簡單解釋器算法實現(xiàn),在本題中是通過構(gòu)造樹和堆棧實現(xiàn)的。3、 算法思路:讀取壓入的字符串,如果讀到一個新的<>組合,則把它添加到子列中,如果讀到了</>組合,則與原有數(shù)據(jù)進行匹配,如果讀到標記的值就把數(shù)據(jù)直接放到樹中去,其他情況就跳出循環(huán)直接輸出樹的內(nèi)容。本題考慮到可以換行輸入,所以計算了'<'和'/'的數(shù)目如果'<'剛好是'/'就表明XML語言就要結(jié)束了!4、 數(shù)據(jù)結(jié)構(gòu)說明本程序使用了數(shù)和指針的結(jié)構(gòu),期間多次使用到了數(shù)組。5、 程序流程說明6程序運行的驗證過程(1)導入文件2)直接輸入代碼
3)括號不匹配情況4)其它選項導入文件請按,即時輸入對L標記語言請按,器,退岀請按其他犍:t您選擇了退出,歡迎您下次的使用???Pressanykeytocontinue7、效果分析本程序不但可以讀取文件,而且可以直接從屏幕輸入XML語言,方便易行,并且能夠進行基本的括號匹配檢查,可以作為簡單的標記語言解釋器進行使用。8、原創(chuàng)內(nèi)容及體會剛開始編寫這個程序時我真的是了無頭緒,后來想到可以用一個字符串數(shù)組傳遞所需要的字符串內(nèi)容,并且篩選掉不必要的空格符和換行符,于是思路就豁然開朗了,我的編寫過程是首先屏幕直接輸入輸出進行檢驗,這一步做好之后,我離成功就不遠了,接下來就是導入文件的問題了,通過文件指針和fgetc()函數(shù),我很快地解決了這個問題,反思整個編寫過程,我發(fā)現(xiàn)最讓我耗時的地方還是數(shù)組和字符串之間的賦值問題,原來數(shù)組使用了gets(數(shù)組名)就能夠很方便地轉(zhuǎn)化為字符串了!另外由于首尾標記名稱和標記值可以分行寫,這就要考慮什么時候停止讀入字符的問題了。通過仔細觀察,我發(fā)現(xiàn)當符號‘<'的數(shù)量剛好是符號'/'的兩倍時,一按下回車鍵就是停止讀入數(shù)據(jù)之時,就這樣我把該解決的問題一個一個地解決掉了!以下是我的最終成果,“軟件2.cpp”:#include<iostream>#include<string>#include<vector>#include<stack>usingnamespacestd;classTree //創(chuàng)建一個樹的類{public:Tree(stringname){n=name;val="";no=++amount;}stringName(){returnn;}voidSetVal(stringvalue){val=value;} //設置元素內(nèi)容voidAddChild(Tree*p){child.push_back(p);}//添加子樹名稱voidPrint()//輸出第n個元素的有關(guān)內(nèi)};{inti;cout<<"Element"<<no<<"-"<<n<<":";voidPrint()//輸出第n個元素的有關(guān)內(nèi)};{inti;cout<<"Element"<<no<<"-"<<n<<":";if(val.size()==0)cout<<"null";elsecout<<val;cout<<",child:";if(child.size()==0)cout<<"null"<<endl;else{for(i=0;i<child.size();++i)cout<<"Element"<<child[i]->no<<"";cout<<endl;for(i=0;i<child.size();++i)child[i]->Print();}}staticintamount;//用來統(tǒng)計元素個數(shù)的靜態(tài)變量stringn;stringval;intno;//樹中記錄元素名字//樹中記錄元素內(nèi)容//樹中統(tǒng)計元素個數(shù)private:vector<Tree*>child;//樹中用于記錄子樹intTree::amount=0;charbuf[80];intGetHead(char*xml)//tree域內(nèi)的amount賦值為0//創(chuàng)建一個buf數(shù)組//獲取標記頭,從'<'開始取遇到intTree::amount=0;charbuf[80];intGetHead(char*xml){return(sscanf(xml,"v%[A>]>",buf)==l);}intGetVal(char*xml) //獲取數(shù)據(jù),取遇到'<'為止字符串{return(sscanf(xml,"%[A<]",buf)==1);}intGetTail(char*xml) //獲取標記尾,從'<'開始取遇到'>'為止字符串{return(sscanf(xml,"</%[A>]>",buf)==1);}voidcut(char*xml,intlen){if(strlen(xml)>len)sprintf(xml,"%s",xml+len);elsestrcpy(xml,"");}intmain(){charstart[800],n,lujing[100];inti=0,kuo=0,kuo2=0,gang=0,k=0;FILE*fp;coutvv"導入XML文件請按T,即時輸入XML標記語言請按2,退出請按其他鍵:"<<endl;cin>>n;getchar();cout<<endl;if(n=='1'){coutvv"請輸入文件路徑:"vvendl;gets(lujing);coutvvendl;//if((fp=fopen("test.xml","r"))==NULL) //此行決定所導入文件的來源(如:d:\\test.xml)!沒有路徑則表示出處在源程序所在文件夾中。if((fp=fopen(lujing,"r"))==NULL){coutvv"Fileopenerror!"vvendl;exit(0);}coutvv"您導入的文件內(nèi)容是:"vvendl;while(!feof(fp)){start[-1]='\0';start[i]=fgetc(fp); //先使用一個數(shù)組start[800]存儲數(shù)據(jù),判別程序是否結(jié)束coutvvstart[i];if(start[i]=='v')kuo++;elseif(start[i]=='>')kuo2++;elseif(start[i]=='/')gang++;else;if(kuo==gang*2&&start[i]=='>')break;elseif(kuo!=2*gang&&start[i]=='\n');elseif(start[i]=='');elsei++;if(kuo2vkuo-1||kuo2>kuo)coutvv"括號不匹配!"vvendl;//cout<<"2"<<endl;exit(0);}//start[i]=fgetc(fp);//coutvvstart[i];//i++;}if(start[i]!='>'){coutvvendlvvendlvv"此文件括號不匹配!"vvendl;//coutvv"2"vvendl;exit(0);}coutvvendl;if(fclose(fp)){coutvv"Cannotclosethefile!"vvendl;exit(0);}}elseif(n==2) //在這種模式下,可以通過屏幕輸出XML語言!{coutvv"請輸入XML語言,首尾標記名稱和標記符可以分行寫,注意括號要匹配:"vvendl;start[-1]='\0';while(k!=1){start[i]=getchar(); 〃先使用一個數(shù)組start[800]存儲數(shù)據(jù),判別程序是否結(jié)束if(start[i]=='v')kuo++;elseif(start[i]=='>')kuo2++;elseif(start[i]=='/')gang++;else;if(kuo==gang*2&&start[i-1]=='>'&&start[i]=='\n'){k=1;i++;}elseif(kuo==gang*2&&start[i-1]!='>'&&start[i]=='\n'){coutvv"括號不匹配!"vvendl;//cout<<"1"<<endl;exit(0);}elseif(kuo!=2*gang&&start[i]=='\n');elseif(start[i]=='');elsei++;if(kuo2vkuo-1||kuo2>kuo){coutvv"括號不匹配!"vvendl;//coutvv"2"vvendl;exit(0);}}}else //按其他鍵則退出!{coutvv"您選擇了退出,歡迎您下次的使用!!!"vvendl;exit(0);}charxml[800];strcpy(xml,start);//gets(xml);//strcpy(xml,"vclass>vstudent>vname>ABCv/name>vid>123456v/id>group1v/student>v/class>");//puts(xml);coutvvendlvv"以下是解釋語言:"vvendl;Tree*root=NULL,*p,*q;stackvTree*>S; //定義堆棧while(1){if(GetTail(xml)) //到達樹根{if(S.empty()){cerrvv"expectvtag>"vvendl;break;}if(S.top()->Name()==string(buf)){S.pop();if(!S.empty())p=S.top();elsebreak;}else{cerr<<"notmatch"<<endl;break;}cut(xml,strlen(buf)+3);}elseif(GetHead(xml))〃到達樹頭{q=newTree(string(buf));if(root==NULL){p=root=q;}else{p->AddChild(q);p=q;}S.push(q);cut(xml,strle
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鄒平買房合同范本
- 2025至2030年中國單面九腳托盤數(shù)據(jù)監(jiān)測研究報告
- 有機化合物概論課件
- 2025至2030年中國兒童玩具灶臺數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國交流磁粉探傷儀數(shù)據(jù)監(jiān)測研究報告
- 2025年度煤炭場地租賃及能源項目投資合作合同
- 2025年度新能源研發(fā)合作期滿終止合同通知書
- 二零二五年度科技創(chuàng)新貸款抵押擔保合同
- 二零二五年度國際商務合作外部專家聘用協(xié)議
- 二零二五年度代持股票信托協(xié)議稅收籌劃指南
- 安全管理組織結(jié)構(gòu)分工圖
- GB/T 2965-2023鈦及鈦合金棒材
- 六西格瑪(6Sigma)詳解及實際案例分析
- 短視頻與直播電商運營高職PPT完整全套教學課件
- 哲學的基本問題 【備課精講精研】 高中政治統(tǒng)編版必修四哲學與文化
- 新聞采訪與寫作課件第八章采訪的準備
- 工程公司“十四五”發(fā)展戰(zhàn)略規(guī)劃(專業(yè)完整模板)
- 部編版三年級下冊語文全冊教案表格版
- 70歲以上老年人考駕照三力測試題
- 2017版銀皮書(中英文完整版)FIDIC設計采購施工交鑰匙項目合同條件
- 部編版五年級下冊第四單元9 古詩三首《秋夜將曉出籬門迎涼有感》一等獎創(chuàng)新教學設計
評論
0/150
提交評論