




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
程序設計基礎課程設計2/14實驗目錄需求分析————————————2整體設計————————————2詳細設計————————————4調試與測試———————————6用戶手冊————————————6總結——————————————6附錄——————————————9一需求分析1目的我們所做的程序課題是一個“簡單的英文詞典排版系統”。該課題目的在于鍛煉我們的自主動手和創新、創造能力,同時通過自己看書學習文件的輸入輸出等功能的實現,提升我們的自學能力。并通過自己思考程序的算法和函數的組建過程來提升我們的邏輯思維能力,最后是利用自我程序測試和改進來增加我們對編程的進一步了解,和提升編程的能力。其大背景是要為同學提供了一個既動手又動腦,獨立實踐的機會,將課本上的理論知識和實際有機的結合起來,鍛煉同學的分析解決實際問題的能力。提高學生適應實際,實踐編程的能力。2預期達到功能(1) 能輸入和顯示所打的單詞。(2) 能分辨出單詞。(3) 對重復的單詞和已經輸入的單詞能自動排除。(4) 能按A-Z的順序排版。(5) 能將運行結果以文本形式存儲。(6) 具有添加新單詞并重新排版的能力。(7)實現以上功能的選擇操作3需解決問題主要解決單詞輸入到文件和從文件輸出以及最后文件保存的問題,但是我們對C++的學習仍不完全,這就要求我們提前把課本上的“文件與流”這一章節的相關內容進行自學并應用于其中。其次我們要解決如何實現查找單詞、分辨單詞、添加單詞以及對單詞進行排序的系列問題,這要求我們能對已學習的內容充分掌握并熟練應用。詞庫文件建立并選擇功能詞庫文件建立并選擇功能添加單詞單詞排序搜索單詞顯示單詞文本形式存儲并退出1程序設計功能模塊圖2程序流程示意圖1)字符排序交換dic[j]和dic[j+1]flag=1交換dic[j]和dic[j+1]flag=1j++結束Flag=0循環控制變量jture開始Flag=1循環控制變量iI<r-1&&flag=1>?falsefalsej<r-i-1?dic[j]>dic[j+1]?tureturefalse 2)檢查模塊輸出輸出”noword”輸出”r=word”結束false輸出dic[r]r++r=0?true開始r=0循環控制變量rdic[r]!=EOF?truefalse三詳細設計1函數功能voidwrite(intr)將單詞寫入文件的函數intread()讀取文件函數voidzhucaidan()主菜單函數intpaixu()排序函數voidjiancha()檢查單詞模塊voidcharu(char*d)插入單詞模塊voidfind(char*s)查找單詞模塊voidxuanze()選擇菜單模塊2參數說明dic[N][20]N為100,即但單詞庫課輸入100個單詞,每個單詞長度不得大于19*p為指向Data文件的指針flag,temp在不同的函數模塊中用于不同情況下的結果判斷與后續的程序執行s[20],d[20],f[20]char類型的數組s、d和f用于臨時的單詞輸入放置t[20]char類型的數組t是用于臨時放置從文件中讀取的單詞way是用于switch語句中功能選項的選擇i,j,c等是普通的int變量函數調用voidxuanze()選擇菜單調用的函數:jiancha()檢查函數、find(d)查找函數、charu(d)插函數以及zhucaidan()主菜單函數voidfind(char*s)查找單詞模塊調用的函數:strcpy復制函數、strcmp比較大小函數、write(r)寫入文件函數voidcharu(char*d)插入單詞模塊調用的函數:read()讀取函數、strcmp比較函數、strcpy復制函數、write(r)寫入文件函數、paixu()排序函數、voidjiancha()檢查單詞模塊調用的函數:write(r)寫入文件函數intpaixu()排序函數調用的函數:read()讀取函數、strcmp比較大小函數、strcpy復制函數、write(r)寫入文件函數intread()讀取文件函數調用的函數:write(r)寫入文件函數main()主函數調用的函數:jiancha()檢查函數、paixu()排序函數、xuanze()菜單選擇函數4算法實現插入模塊voidcharu(char*d)單詞存在情況:先輸入單詞放置于*d指向的d[20]臨時數組中,再利用for循環和strcmp比較函數看輸入的單詞是否已經存在,存在flag=1,不存在將單詞保存break跳出for循環從新輸入單詞,flag仍等于0;單詞不存在情況:若flag=0,利用strcpy復制函數將新輸入的單詞復制到單詞庫已存在單詞的后面,單詞個數r增加1;繼續輸入:利用while語句,只要繼續輸入的字符不為0(即輸入的為單詞,用戶不返回主菜單),就可以執行while語句繼續重復上述的檢查單詞和保存單詞的步驟;返回主菜單:若輸入的字符為0(即用戶要返回主菜單),while語句無法執行,經過從新排序后,利用return返回調用函數,即voidxuanze()菜單選擇函數,可從新選擇功能。查找單詞模塊voidfind(char*s)文件讀取:利用while循環先將文件中以保存的單詞讀取到臨時的數組t[20]中,再從t數組中復制到到dic[r]數組中,最開始r為0,后r++;查找單詞:利用strcmp比較函數查找是否有與臨時存放在s[20]數組中單詞相同的以保存單詞;若strcmp的值為0(即用戶要查找的單詞存在),則c=r,c即為用戶要查找的單詞的序號,此時flag=1,若flag不為1,輸出查找單詞不存在;繼續查找:方法同繼續插入單詞是一樣的,利用輸入的字符不為則執行以上查找步驟,若輸入的字符為0,則不執行查找步驟并return,返回到調用函數即voidxuanze()菜單選擇函數中,從新選擇功能。四調試與測試我們反復輸入從a到z的26個單詞,用很長的單詞和很短的單詞來測試文件的保存能力。曾遇到的問題:1單詞的顯示擠在一起,之后我們在輸出printf中加入:“\t”來解決單詞顯示的美觀問題;2輸入的單詞仍無法保存在文件中,我們在查找和輸入等模塊添加write()讀取函數后,使得單詞真正的保存在文件中;3開始并未建立文件,因此使程序無法運行,后詢問老師問題得以解決;4一開始使用else語句來實現功能模塊的選擇無法運行,后改為使用switch語句問題得以解決;5在進行字符串的復制時開始并未使用字符串函數,而是自行設計了函數來進行字符串的復制及比較,發現無法成功,咨詢其他同學后討論可以利用現成的字符串函數來解決該問題;6在查找和插入單詞的返回主菜單的算法上開始使用的是goto語句,但會跳錯程序,因此討論后改用return語句,直接返回主菜單的方法。以上問題每次調試均要刪除文件中以保存的單詞,從新輸入a到z的26個單詞,從新運行。五用戶手冊進入主菜單后,輸入“1”后開始輸入單詞。輸入完畢可按“0”返回主菜單。在主菜單頁面輸入“2”后可以查找單詞,輸入單詞按回車開始查找,查找完畢按“0”返回主菜單。在主菜單頁面輸入“3”后可以結束操作,同時在文件中保存已輸入的單詞。4.在主菜單頁面輸入“4”后可以檢查所有單詞,按“0”返回主菜單。六總結開始無單詞界面和主菜單:選擇way1(輸入單詞)并輸入單詞apple:選擇way2(查找單詞)界面:選擇way3(結束程序并保存):選擇way4(先檢查所有單詞):選擇0返回主菜單:重新打開程序:優點:程序所要求的功能基本存在且均可以正常執行。缺點:界面不夠美觀,某些算法效率仍不夠高。參考文獻:C++程序設計(第二版)C語言初級教程附錄#include<stdio.h>#include<string.h>#defineN100chardic[N][20];FILE*p;/*file結構輸入讀取*//*寫入文件*/voidwrite(intr){inti;p=fopen("Data.txt","w");//以寫方式打開文件for(i=0;i<r;i++) {fprintf(p,"%s\n",dic[i]);//輸入數組內容,輸入到p指向的data文件里}fclose(p);//關閉文件}/*讀取文件*/intread(){intr=0;p=fopen("Data.txt","r");//r打開讀取文件while(fscanf(p,"%s",dic[r])!=EOF)//只要讀取的dic內容不為結束,繼續增加讀取;讀取出來{ r++;}fclose(p);//關閉datawrite(r);//再從新寫入returnr;//輸入了r個單詞}/*主菜單*/voidzhucaidan(){printf("\n\n");printf("____________way=1:shuruwords______________________\n");printf("_____________way=2:chazhaowords_______________________\n");printf("________________way=3:end___________________________\n");printf("__________________way=4:jianchasuoyou_________________\n");printf("pleasexuanzaway=");}/*字符排序*/intpaixu(){inti,j,flag=1,r;chars[20];r=read(); /*類似于冒泡排序*/for(i=0;i<r-1&&flag==1;i++)//外層掃描一遍{flag=0;for(j=0;j<r-i-1;j++){if(strcmp(dic[j],dic[j+1])>0)//比較字符串的大小,即單詞的長短排序;前面的若長于后面的則交換{flag=1;strcpy(s,dic[j]);strcpy(dic[j],dic[j+1]);strcpy(dic[j+1],s);//通過復制交換}}}write(r);//拍完序再從新寫入return0;}/*檢查模塊————————————小塊————模塊函數*/voidjiancha(){ //檢查模塊在程序的開始,先對文件讀取,然后printf輸出顯示已經保存的單詞intr=0;p=fopen("Data.txt","r");while(fscanf(p,"%s",dic[r])!=EOF){printf("%s\t",dic[r]);r++;}fclose(p);//————————————————————————————————————write(r);//檢查完再從新寫入if(r==0)printf("thereisnowordinData.txt\n");//即文件中尚沒有保存了單詞else{printf("\n\nthereare%dwordsinData.txt!\n",r);//文件中保存了r個單詞}}/*插入單詞———————————————————模塊函數case1———后面插入模塊會先輸入一個單詞,同時將其與以保存單詞作比較———*/voidcharu(char*d)//flag=0即為輸入的單詞未被保存到文件中。flag=1即輸入的單詞已經存在于文件里{inti;charf[20];intr=read();intflag=0;//先對已經保存的單詞做檢查,看剛插入的單詞是否已經存在for(i=0;i<r;i++){if(strcmp(d,dic[i])==0)//通過字符串的比較,找到存在的情況{printf("theword%shasalreadycunzai\n",d);flag=1;//單詞存在flag=1break;}}if(flag==0)//之前保存的0到r-1的單詞里都沒有剛輸入的單詞的情況{printf("theword%sischenggongbaocun\n",d);//則單詞保存strcpy(dic[r],d);//將d指向的后輸入的單詞復制到dic[r]中r++;}printf("\n\njixuzengjiadanci,pleaseshuruaword;backtomainmenu,shuru0:\n");while(scanf("%s",f)&&!(f[0]=='0'&&f[1]==0))//輸入一個內容到f當中,只要不是0就一直可以檢查輸入{flag=0;//先假設輸入到f數組的單詞不已經存在于文件中for(i=0;i<r;i++){if(strcmp(f,dic[i])==0)//從0到r-1單詞已經存在,能夠找到與其相同的{printf("theword%shasalreadycunzai\n",d);//存在的情況flag=1;break;}}if(flag==0)//單詞不存在,并且保存{printf("theword%sissuccessfulbaocun\n",f);strcpy(dic[r],f);//將f復制到r上r++;}printf("\n\ncontinuezengjiadanci,pleaseshuruaword;backtomainmenu,shuru0:\n");}write(r);paixu();//從新排下序 write(r);return;//輸入的f數組為0后跳出while循環,返回調用函數的xuanze函數}//————————————————————————————————————————/*查找已錄入單詞—————————————模塊函數case2———————————*/voidfind(char*s){chart[20];intflag=0;charf[20];intr=0,c,i;inttemp;p=fopen("Data.txt","r");while(fscanf(p,"%s",t)!=EOF)//將已經排好順序的單詞一個個讀取出來{strcpy(dic[r],t);//將t復制到dic;r一開始賦值為0,將t挨個付給dic的0到r-1r++;temp=strcmp(s,t);//比較s與t串的大小,然后返回0左右的值;后查找模塊輸入一個單詞并由s指向他,將其與t中的單詞作比較if(temp==0)//若兩個單詞相同{c=r;flag=1;}}write(r);//從新再將單詞寫入文件中if(flag)//flag=1{printf("%s'snumberis%d!\n",s,c);//s指向的要查找的某個單詞是第c個;}else{printf("cannotfind%s!\n",s);//沒有在存儲的文件中找到單詞}printf("\n\njixuezengjiadanci,pleaseshuruaword;backtomainmenu,shuru0:\n");while(scanf("%s",f)&&!(f[0]=='0'&&f[1]==0))//再次輸入單詞只要其不為0即可從新開始查找{flag=0;for(i=0;i<r;i++){if(strcmp(f,dic[i])==0){flag=1;c=i+1;break;}}if(flag){printf("%s'snumberis%d!\n",f,c);}else{printf("cannotfind%s!\n",f);}printf("\n\njixushurudanci,pleaseshuruaword;backtomainmenu,shuru0:\n");}return;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年學生乘車安全條例:家校合作共育安全學子
- 2025年Python遞歸函數的考試題及答案
- 2025年專升本地質工程真題匯編與押題預測卷
- 2025年學校基建項目招標程序與施工進度監管新規定解讀
- 財務成本管理考試準備全攻略及試題答案
- 2025年歐洲女子數學奧林匹克模擬試卷:幾何證明與組合分析競賽準備策略
- 醫學放射技術課件
- 高中生物人教版 (2019)必修2《遺傳與進化》第3節 DNA的復制當堂達標檢測題
- 2025年注冊會計師CPA會計科目全真模擬試卷(合并報表與長期股權投資)實戰演練與策略
- 高校預算外資金收支管理辦法2025年執行要點與指南
- 江蘇省鹽城市(2024年-2025年小學六年級語文)部編版期末考試(下學期)試卷及答案
- 2024 大模型典型示范應用案例集-1
- 醫院血透室6S管理匯報
- 《小紅帽》繪本故事-課件
- 金融合規培訓
- 感性工學完整版本
- DB21T 3411-2024 城市園林綠化智慧養護技術規程
- 【MOOC】當代社會中的科學與技術-南京大學 中國大學慕課MOOC答案
- 【MOOC】信息檢索與利用-江南大學 中國大學慕課MOOC答案
- 【MOOC】消費者行為學-湖南大學 中國大學慕課MOOC答案
- 南寧紅林大酒店擴建工程籌資方案設計
評論
0/150
提交評論