第一篇:數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí)報(bào)告(中國(guó)地質(zhì)大學(xué))
1、需求規(guī)格說明
【問題描述】
利用哈夫曼編碼進(jìn)行對(duì)已有文件進(jìn)行重新編碼可以大大提高減小文件大小,減少存儲(chǔ)空間。但是,這要求在首先對(duì)一個(gè)現(xiàn)有文件進(jìn)行編碼行成新的文件,也就是壓縮。在文件使用時(shí),再對(duì)壓縮文件進(jìn)行解壓縮,也就是譯碼,復(fù)原原有文件。試為完成此功能,寫一個(gè)壓縮解壓縮軟件。
【基本要求】
(1)壓縮準(zhǔn)備。讀取指定被壓縮文件,對(duì)文件進(jìn)行分析,建立哈夫曼樹,并給出分析結(jié)果(包括數(shù)據(jù)集大小,每個(gè)數(shù)據(jù)的權(quán)值,壓縮前后文件的大?。谄聊簧陷敵?。
(2)壓縮。利用已建好的哈夫曼樹,對(duì)文件進(jìn)行編碼,并將哈夫曼編碼及文件編碼后的數(shù)據(jù)一起寫入文件中,形成壓縮文件。
(3)解壓縮。打開已有壓縮文件,讀取其中的哈夫曼編碼,構(gòu)建哈夫曼樹,讀取其中的數(shù)據(jù),進(jìn)行譯碼后,寫入文件,完成解壓縮。
2.總體分析與設(shè)計(jì)
【設(shè)計(jì)思想】
將一待壓縮的文件以二進(jìn)制形式進(jìn)行讀寫。壓縮過程中,將待壓縮文件一次性讀入內(nèi)存,隨后對(duì)其中出現(xiàn)的字符進(jìn)行判斷和統(tǒng)計(jì),將所得的字符頻率創(chuàng)建HuffMan樹,并對(duì)其進(jìn)行編碼,將源文件的字符用其HuffMan編碼代替,組合成滿字節(jié)寫入壓縮文件?!驹敿?xì)設(shè)計(jì)表示】
變 量 數(shù)據(jù)類型 Maxsize int *Key input_char KeyNum int *Huffman_node huffmantree 成員函數(shù)說明: char_judge 功能:判斷字符出現(xiàn)的函數(shù);
原型:bool char_judge(char c);//判斷字符出現(xiàn)的函數(shù); 返回類型:bool型 參數(shù):c char型 [in] char_add
功能:添加新出現(xiàn)字符的函數(shù); 原型:void char_add(char c);返回類型:無
參數(shù):c char型 [in] CreateHuffTree 功能:創(chuàng)建哈夫曼樹
原型:void CreateHuffTree();返回類型:無 參數(shù):無
CreateHuffCode
功能:創(chuàng)建哈夫曼編碼
原型:void CreateHuffCode();返回類型:無 參數(shù):無
其它函數(shù)說明: ArrayOpp 功能:將一個(gè)字符數(shù)組中的1 字符順序顛倒 原型:void ArrayOpp(char a[],int n)返回類型:無
參數(shù):數(shù)組 a char型 [in&out] n int型
CompressFile 功能:壓縮文件
原型:void CompressFile(FILE *ifp,FILE *ofp);//壓縮 返回類型:無
參數(shù):指針ifp FILE型 [in&out]
指針ofp FILE型 [in&out]
DecompressionFile 功能:解壓文件
原型:void DecompressionFile(FILE *ifp,FILE *ofp);//解壓 返回類型:無
參數(shù):指針ifp FILE型 [in&out]
指針ofp FILE型 [in&out]
FindMax
功能:尋找數(shù)組中最大元素下標(biāo) 原型:void FindMax(int index[],int n,int &flag);//尋找數(shù)組中最大元素下標(biāo) 返回類型:無
參數(shù):數(shù)組index int型 [in&out] n 數(shù)組長(zhǎng)度 [in] flag int型 [in&out] 3. 編碼
【遇到的問題及解決方法】(1)選取合適的數(shù)據(jù)結(jié)構(gòu)
對(duì)于一個(gè)工程的實(shí)現(xiàn),到底采用怎樣的數(shù)據(jù)結(jié)構(gòu),應(yīng)該考慮到程序的性能和代碼的可讀性。由于起初對(duì)工程的不熟,對(duì)于用什么樣的數(shù)據(jù)結(jié)構(gòu)來存儲(chǔ)我一直都處在試探中,缺乏一種長(zhǎng)久的考慮,這也使得后面的編碼過程效率不高。最終冷靜下來,自定義了一個(gè)文件類和兩個(gè)輔助結(jié)構(gòu)體,大體的實(shí)現(xiàn)框架在總體設(shè)計(jì)中已給出。
(2)哈夫曼樹該如何建立
首先,字符的頻率作為關(guān)鍵值,用一個(gè)循環(huán),每次找出關(guān)鍵值最小的兩個(gè)字符,將其組合加入到哈夫曼樹中,同時(shí)將每個(gè)哈夫曼樹節(jié)點(diǎn)用結(jié)構(gòu)體huffman_node數(shù)組存放,每個(gè)節(jié)點(diǎn)都有其左右孩子和父節(jié)點(diǎn)的下標(biāo),這有便于后面的哈夫曼編碼。(3)哈夫曼編碼的具體實(shí)現(xiàn)
哈夫曼編碼的具體實(shí)現(xiàn)方法:由于哈夫曼樹的建立過程中為每個(gè)哈夫曼節(jié)點(diǎn)標(biāo)明了左右孩子和父節(jié)點(diǎn),可以從關(guān)鍵值開始,從下往上通過父節(jié)點(diǎn)與子節(jié)點(diǎn)的關(guān)系為子節(jié)點(diǎn)進(jìn)行編碼,如果父節(jié)點(diǎn)的左孩子是當(dāng)前子節(jié)點(diǎn),則子節(jié)點(diǎn)(含關(guān)鍵值)的哈夫曼編碼標(biāo)為0否則標(biāo)為1,如此循環(huán)下去。這樣得到每個(gè)葉節(jié)點(diǎn)對(duì)應(yīng)的哈夫曼編碼的逆序表示,且存放在數(shù)組bits中。然后用一個(gè)函數(shù)ArrayOpp將其逆序過來,從而真正得到哈夫曼編碼。(4)文件的二進(jìn)制形式讀寫操作及其壓縮的實(shí)現(xiàn)
最主要的還是怎樣實(shí)現(xiàn)文件的壓縮,由于壓縮文件中的字符是用其相應(yīng)的哈夫曼編碼代替的,如果只是把字符的哈夫曼編碼(也使字符型的數(shù)組存放的)寫入,將會(huì)適得其反,只有將相鄰字符的編碼組合成一個(gè)一個(gè)的字節(jié)數(shù)字寫入才能達(dá)到節(jié)省空間的效果,例如:某字符哈夫曼編碼為bits 1 1 1 1 1 1 1 這字符數(shù)組內(nèi)容通過移位可轉(zhuǎn)化為char型數(shù)128,如果滿一個(gè)字節(jié)就寫入,若未滿則繼續(xù)組合。
4.程序及算法分析
【壓縮】
1、先整體掃描文本,統(tǒng)計(jì)文本的字符個(gè)數(shù),種類,以及頻率記錄下來。
2、根據(jù)字符的頻率生成相應(yīng)的huffman樹,生成huffman樹之后再根據(jù)樹的結(jié)構(gòu)生成huffman編碼。
3、生成壓縮文件,文件頭部分寫入待壓縮文件的字符個(gè)數(shù),字符種類以及相應(yīng)的頻率,分別用int型,char型數(shù)組以及int型數(shù)組寫入。
4、寫入帶壓縮文件中每個(gè)字符對(duì)應(yīng)的huffman編碼,按位寫入。
按位寫入采用移位思想,滿8位一寫。如源文件中一段字符“ABC”,A的huffman編碼為001,B的huffman編碼為010,C的為11,剛好滿8位。則定義一個(gè)unsigned char型變量如c_out(初值為0),用移位將c_out賦值使其機(jī)器編碼為00101011,剛好8位,再將其作為一個(gè)字符寫入壓縮文件中,直至將帶壓縮文件的最后一個(gè)字符寫滿。要注意的是:若帶壓縮文件最后一個(gè)字符的huffman編碼賦值給c_out后c_out不滿8位,則將c_out的其余位都補(bǔ)0。
【解壓】
1、讀壓縮文件的頭部分,定義幾個(gè)變量記錄字符個(gè)數(shù),種類以及對(duì)應(yīng)的頻率。
2、根據(jù)字符種類及頻率生成huffman樹。
3.繼續(xù)循環(huán)讀壓縮文件每次讀一個(gè)字符,每讀一個(gè)字符根據(jù)其8位機(jī)器碼來遍歷huffman樹,當(dāng)遇到huffman樹的葉子節(jié)點(diǎn)時(shí)終止,將葉子節(jié)點(diǎn)的字符寫入解壓后的新文件中。當(dāng)讀完最后一個(gè)字符后終止循環(huán)。
解壓正文時(shí)每讀一個(gè)字符,利用移位將該字符的8位機(jī)器碼取出存入鏈表中,方便huffman樹的遍歷?!痉治觥?/p>
主要的程序集中在兩個(gè)函數(shù)中:CompressFile和DecompressionFile考慮到程序的性能,在對(duì)文件的讀寫過程中,我選擇在內(nèi)存中對(duì)文件進(jìn)行操作,在壓縮時(shí),將待壓縮文件一次性讀入內(nèi)存,在解壓文件時(shí),將待解壓文件一次性讀入內(nèi)存,而不是一個(gè)字節(jié)一個(gè)字節(jié)地讀寫文件。
5.小結(jié)
通過這次課題實(shí)驗(yàn)的程序?qū)嵺`,我實(shí)在獲益匪淺!數(shù)據(jù)結(jié)構(gòu)是上個(gè)學(xué)期開展的一門學(xué)科,學(xué)習(xí)這門學(xué)科也是艱辛的,因?yàn)樗容^難懂,但是這門學(xué)科是非常重要的,在以后的程序設(shè)計(jì)方面這門學(xué)科能給我們很大的幫助。
這次的程序設(shè)計(jì)對(duì)我來說無疑是一個(gè)具大的考驗(yàn),從接起課題后,我就一直為實(shí)現(xiàn)程序而努力,翻閱相關(guān)書籍、在網(wǎng)上查找資料。因?yàn)檎n本上的基礎(chǔ)知識(shí)掌握不好,過程中遇到了不少的阻礙,編寫程序的進(jìn)度也比較慢。雖然如此,但是通過自己的努力與老師的指導(dǎo),我對(duì)這次實(shí)驗(yàn)的原理有了一定的理解,通過參照從網(wǎng)上找到的源程序,終于在其它源程序的基礎(chǔ)下寫出了本次實(shí)驗(yàn)的核心算法,并使其能夠正常的運(yùn)行。
近兩周的程序設(shè)計(jì),讓我體會(huì)到了作為一個(gè)編程人員的艱難,一個(gè)算法到具體實(shí)現(xiàn),再到應(yīng)用層面的開發(fā)是需要有一段較長(zhǎng)的路要走的,不是一朝一夕就可以實(shí)現(xiàn)的,而且在編好程序后,編程人員還要花很多的時(shí)間去完善它,其中包含的心酸,外人是不會(huì)明白的。
這次課程設(shè)計(jì)涉及對(duì)大量數(shù)據(jù)的處理,要做到精益求精,不能忽略任何一處,否則結(jié)果將會(huì)有很大的不同,總之,最大的感受就是完美源于細(xì)節(jié)!編程不僅要有一定的理論基礎(chǔ)和實(shí)踐經(jīng)驗(yàn),還需要一定的毅力和關(guān)注細(xì)節(jié)的習(xí)慣。這次對(duì)文件的壓縮和解壓的實(shí)習(xí),使我的調(diào)試有了進(jìn)一步的提高。同時(shí)也使我在編程中對(duì)文件的存儲(chǔ)形式的采取有了一定的了解。希望在以后的實(shí)習(xí)中,我會(huì)有有進(jìn)一步的提高。
6.附錄
【部分核心代碼】
void CompressFile(FILE *ifp,FILE *ofp){
if(!ifp){
cout<<“InPutFile cannot be
opened!”< fseek(ifp, 0, SEEK_END);//定位到文件結(jié)尾處 int orignflen = ftell(ifp);char *orignfile=new char [orignflen+1];fseek(ifp,0,SEEK_SET);//定位到文件起始處 fread(orignfile,1,orignflen,ifp);//將文件內(nèi)容一次性讀到內(nèi)存中 orignfile[orignflen]=0; C_file file(512);char c;for(int i=0;i c=orignfile[i]; if(!file.char_judge(c))//對(duì)原文件字符進(jìn)行判斷和統(tǒng)計(jì) file.char_add(c);} for(int i=1;i cout< } file.CreateHuffTree();//創(chuàng)建HuffMan樹 file.CreateHuffCode();//創(chuàng)建HuffMan編碼 //*******************************************************************// //寫入文件信息 fseek(ifp,0,SEEK_SET);fwrite(&orignflen,sizeof(int),1,ofp);fwrite(&file.MaxSize,sizeof(int),1,ofp);fwrite(&file.KeyNum,sizeof(int),1,ofp);for(int i=1;i fwrite(&file.Key[i].data,sizeof(char),1,ofp); fwrite(&file.Key[i].count,sizeof(int),1,ofp);} //*******************************************************************// unsigned char o_c=0;//o_c中存入二進(jìn)制的位數(shù) int bitnum=0; char x; for(int k=0;k c=orignfile[k];//從內(nèi)存中取出源文件內(nèi)容 for(int i=1;i {//在文件類對(duì)象中檢索出相應(yīng)的關(guān)鍵碼 if (c!=file.Key[i].data)continue; else {//將哈夫曼編碼組合成char型數(shù)字 for(int j=0;j { if(bitnum==8) {//若滿8位則構(gòu)成一字節(jié)寫入 fwrite(&o_c,1,1,ofp); bitnum=0; o_c=0; } x=file.huffman_node[i].bits[j]; if(x=='1')o_c=(o_c<<1)+1; else o_c=o_c<<1; bitnum++; } break; } } } while(bitnum<8)//最后一個(gè)字節(jié)未寫滿則補(bǔ) { o_c=o_c<<1; bitnum++;} fwrite(&o_c,1,1,ofp);//將最后一個(gè)字節(jié)寫入文件 fclose(ifp);fclose(ofp);cout<<“Already Compressed!”< } void FindMax(int index[],int n,int &flag){//找出數(shù)組中最大值的下標(biāo) 由flag返回 for(int i=1;i<=n;i++){ if(index[i]>=index[i+1]) { flag=i; } else flag=i+1;} } void DecompressionFile(FILE *ifp,FILE *ofp){ unsigned char i_c=' ';char o_c=' '; //**************************************************************// //讀取壓縮文件信息 fseek(ifp,0,SEEK_SET);int orignflen=0;int MaxSize=0;int KeyNum=0; fread(&orignflen,sizeof(int),1,ifp); char *depressfile;depressfile=new char[orignflen+1]; fread(&MaxSize,sizeof(int),1,ifp); C_file file(MaxSize); fread(&file.KeyNum,sizeof(int),1,ifp); for(int i=1;i fread(&file.Key[i].data,sizeof(char),1,ifp); fread(&file.Key[i].count,sizeof(int),1,ifp);} //**************************************************************// //重構(gòu)HuffMan樹和編碼 file.CreateHuffTree();file.CreateHuffCode(); fseek(ifp, 12+((file.KeyNum-1)*5), SEEK_END); long flen = ftell(ifp);char *compressfile=new char [flen+1]; fseek(ifp,0,SEEK_SET);fseek(ifp, 12+((file.KeyNum-1)*5), SEEK_SET); char t_buff[255],z_buff[255];t_buff[0]=0;z_buff[0]=0; //獲取最長(zhǎng)編碼的長(zhǎng)度 int *index;index=new int [file.KeyNum-1];int flag=0;for(int i=1;i index[i]=file.huffman_node[i].count;} FindMax(index,file.KeyNum-1,flag); int p=file.huffman_node[flag].count;int curr_index=0;int l=0;while(true){ int i; while(strlen(z_buff) {//保證能夠取到最長(zhǎng)編碼的全部?jī)?nèi)容 fread(&i_c,1,1,ifp); itoa(i_c,t_buff,2);//將讀取的一個(gè)(字符型)字節(jié)的內(nèi)容轉(zhuǎn)換為char型字符數(shù)組 strcat(z_buff,t_buff); 【參考資料】 } for(i=1;i if(memcmp(file.huffman_nod e[i].bits,z_buff,file.huffman_node[i].count)==0) break; } strcpy(z_buff,z_buff+file.huffman_node[i].count); //獲得目標(biāo)字符并存入目標(biāo)數(shù)組 o_c=file.Key[i].data; depressfile[l++]=o_c; if(l==orignflen) { break; } } fseek(ofp,0,SEEK_SET); fwrite(depressfile,1,l,ofp);//將解壓后的文件一次性地寫入文件 fclose(ifp);fclose(ofp);cout<<“Already DeCompressed!”< } 《數(shù)據(jù)結(jié)構(gòu)(用面向?qū)ο蠓椒ㄅcC++語言描述)》 殷人昆 等編著,清華大學(xué)出版社 《數(shù)據(jù)結(jié)構(gòu)題集》嚴(yán)蔚敏,吳偉民 編著,清華大學(xué)出版社 《數(shù)據(jù)結(jié)構(gòu)及應(yīng)用算法》嚴(yán)蔚敏,陳文博 編著,清華大學(xué)出版社 Practice Report for Data Structures and Algorithm Analysis Data Structures Course Report Candidate: Student Number: Major: Communication Engineering Supervisor: Wu rangzhong China University of Geosciences(Wuhan)Wuhan, Hubei 430074, P.R.China May 18, 2013 China University of Geosciences, Faculty of Mechanics and Electronic Information 刪除程序代碼 void DeletekTh(int position, pNode L){ pNode Tmp=L, TmpPre=NULL; int i=0; for(i=0;i { if(Tmp->next!=NULL) { TmpPre = Tmp; Tmp=Tmp->next; } else if(Tmp->next==NULL && i { printf(“The Deletion position is invalid!n”); return; } } TmpPre->next=Tmp->next; free(Tmp);} 這是程序主函數(shù),以此來完成以上子函數(shù)的功能 #include int main(){ int i,x,position;pNode m; pNode LinkLists; { printf(“輸入元素來建立鏈表,0為結(jié)束輸入的標(biāo)志”); LinkLists = CreateLinkLists(); printf(“鏈表為:”); PrintLists(LinkLists); } printf(“選擇你需要的操作,輸入序號(hào):n”); printf(“ 1.建立一個(gè)鏈表 n”); printf(“ 2.輸出鏈表 n”); } 2.數(shù)組實(shí)現(xiàn)線性表 用數(shù)組實(shí)現(xiàn)的功能和用鏈表表示的相同 部分子函數(shù)如下 //初始化順序表:給出初始化長(zhǎng)度 int initialArray(arrayList arrLst,int len) { arrLst->length=0; arrLst->size=len; arrLst->Array=(ElemType*)malloc(len*sizeof(ElemType)); if(arrlst->Array==NULL) return 0; else return 1; } //刪除順序表 void deleteArray(arrayList arrLst) { arrLst->length=0; arrLst->size=0; free(arrLst->Array); arrLst->Array=NULL; } //清空順序表 void clearArray(arrayList arrLst) { } printf(“n”); } //判斷某個(gè)元素的位置 int locateElem(arrayList arrLst,ElemType e) { int i; for(i=0;i { if(e==arrLst->Array[i]) return i; } return-1; } 堆棧 主要是實(shí)現(xiàn)元素的進(jìn)棧、出棧、判斷棧中元素個(gè)數(shù) 堆棧的源函數(shù) #include STACK CreatStack(){ STACK S; S=(STACK)malloc(sizeof(struct Stack)); if(S==NULL) { printf(“無法建立堆棧!”); return 0; } S->top=-1; return S;} int IsFull(STACK S){ return(S->top==MAX-1);} int IsEmpty(STACK S){ int StackLen(STACK S){ if(!IsEmpty(S)) return S->top;else return 0;} 堆棧的主函數(shù) #include void main(){ STACK liliS; liliS=CreatStack(); Push(1,liliS); Push(2,liliS); Push(3,liliS); Pop(liliS); Pop(liliS); DisposeStack(liliS);} 設(shè)置斷點(diǎn)可以看到棧中的元素 主函數(shù) void main(){ STRING *Str, *Pat;int position=0;Str=(STRING *)malloc(sizeof(STRING));Pat=(STRING *)malloc(sizeof(STRING));char S_str[20]=“ababcabcacbab”;char P_str[20]=“abcac”; Str->p_str = S_str;Str->length = strlen(S_str);Pat->p_str = P_str;Pat->length = strlen(P_str); int *next=(int *)malloc(sizeof(int)*(Pat->length +1)); GetNext(Pat, next);position=IndexKMP(Str, Pat, next); printf(“%dn”,position);} 顯示兩個(gè)字符串是在第6個(gè)元素開匹配的。 } //插入新元素 M->data[p].i=row; M->data[p].j=col; M->data[p].e=e; M->tu++; return OK; } 稀疏矩陣的的轉(zhuǎn)置 Status TransposeSMatrix(const TSMatrix *M,TSMatrix *T){ int col,p,q; T->mu=M->nu; T->nu=M->mu;T->tu=M->tu; if(T->tu){ q=1; for(col=1;col<=M->mu;col++) for(p=1;p<=M->tu;p++) if(M->data[p].j==col){ T->data[q].i=M->data[p].j; T->data[q].j=M->data[p].i; T->data[q].e=M->data[p].e; q++; } } return OK; } 稀疏矩陣的乘法 Status MultSMatrix(const TSMatrix *M,const TSMatrix *T,TSMatrix *Q){ int i,j,k,p; ElemType m,t,s; if(M->nu!=T->mu){ printf(“Sorry,these two matrice can't multiply.n”); return ERROR; } Q->mu=M->mu; Q->nu=T->nu; Q->tu=0; p=1; for(i=1;i<=Q->mu;i++){ for(j=1;j<=Q->nu;j++){ s=0; for(k=1;k<=M->nu;k++){ if(FALSE==FindElem(M,i,k,&m)) 查找 采用的是快速查找法 源程序 #include int SequenceSearch(int array[],int n,int x){ int i=0; while(i i++; if(i==n) return-1; else return i;} 建立一個(gè)數(shù)組后查找元素,輸入元素后,返回元素所在數(shù)組的下標(biāo)。 5用數(shù)組儲(chǔ)存數(shù)據(jù),在用冒泡法排序后將排序好的數(shù)組輸出。 AVL樹 程序主要是在向二叉樹插入節(jié)點(diǎn)后,最終生成AVL樹 AVL樹中的單旋轉(zhuǎn) static Position SRL(Position K2) { Position K1 = NULL; K1 = K2->left; K2->left = K1->right; K1->right = K2; K2->height = MAX(Height(K2->left), Height(K2->right))+ 1; K1->height = MAX(Height(K1->left), Height(K2))+ 1; return K1;} static Position SRR(Position K2) { Position K1 = NULL; #else Position K1 = NULL; Position K2 = NULL; K1 = K3->right; K2 = K1->left; K1->left = K2->right; K2->right = K1; K3->right = K2->left; K2->left = K3; return K2; #endif } 主程序 #include void PrintTree(AvlTree T) { if(T!= NULL) { PrintTree(T->left); printf(“h=%d, e=%dn”, T->height, T->ele); PrintTree(T->right); } } int main(void) { AvlTree T = NULL; T = MakeEmpty(T); T = Insert(3, T); T = Insert(2, T); T = Insert(1, T); T = Insert(4, T); T = Insert(5, T); T = Insert(6, T); T = Insert(7, T); T = Insert(16, T); T = Insert(15, T); T = Insert(14, T); T = Insert(13, T); s->bottom=0; s->top=0; memset(s->printout,0,sizeof(int)*MAX_LEN);} void push(mstack *s,int m){ s->printout[s->top++]=m;} int pop(mstack *s){ return s->printout[--s->top];} void InitGraph(Graph *g,int n){ int i,j; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(i==j)g->matrix[i][j]=0; else g->matrix[i][j]=INFINITE; } for(i=1;i<=n;i++) { in[i]=0; Len[i]=INFINITE; path[i]=0; } } Practice Report for Data Structures and Algorithm Analysis Data Structures Course Report Candidate: 吳澤光 Student Number: 20121001873 Major : Communication Engineering Supervisor : Wu rangzhong China University of Geosciences(Wuhan)Wuhan, Hubei 430074, P.R.China October 18, 2012 China University of Geosciences, Faculty of Mechanics and Electronic Information 一、線性表(用鏈表實(shí)現(xiàn)): 1、目的: 通過程序的運(yùn)用,使得線性表的插入、刪除等功能更加容易實(shí)現(xiàn),節(jié)約了時(shí)間和精力。 2、程序說明: typedef struct LNode * LinkList;typedef int Status;struct LNode { int data;struct LNode * next;};void Insert(LinkList &L,int i,int b);void Delete(LinkList &L,int i);int Length(LinkList &L);void Print_LinkList(LinkList &L);插入函數(shù): void Insert(LinkList &L,int i,int x){ LinkList p, q;p=L;q=(LinkList)malloc(sizeof(LNode));q->data=x;if(i==1){ q->next=p;L=q;} else 定義結(jié)構(gòu)體。插入函數(shù)。刪除函數(shù)。輸出長(zhǎng)度。輸出線性表內(nèi)容。 } { } while(--i>1)p=p->next;q->next=p->next;p->next=q; 3、運(yùn)行過程: 二、堆棧和隊(duì)列 1、目的: 通過程序的運(yùn)用,使得隊(duì)列的插入、刪除等功能更加容易實(shí)現(xiàn),節(jié)約了時(shí)間和精力。 2、程序說明: struct My_Queue { int Element[MaxLength];int Length;int head;int rear;};定義結(jié)構(gòu)體。int Head_Queue(My_Queue &Que);功能:返回隊(duì)列頭結(jié)點(diǎn)的值 參數(shù):Que,引用類型,指向隊(duì)列的頭。 void Print_Queue(My_Queue &Que);輸出隊(duì)列的內(nèi)容。void In_Queue(My_Queue &Que,int Element);輸入隊(duì)列。void Out_Queue(My_Queue &Que, int &Element);輸出隊(duì)列。主函數(shù): void main(){ } My_Queue My_Fst_Que;My_Fst_Que.Length = 0;int data = 0;My_Fst_Que.head = My_Fst_Que.rear =0;Input_Queue(My_Fst_Que, 2);Print_Queue(My_Fst_Que);Input_Queue(My_Fst_Que, 4);Print_Queue(My_Fst_Que);Input_Queue(My_Fst_Que, 6);Print_Queue(My_Fst_Que);Input_Queue(My_Fst_Que, 8);Print_Queue(My_Fst_Que);Input_Queue(My_Fst_Que, 10);Print_Queue(My_Fst_Que); Out_Queue(My_Fst_Que, data);Print_Queue(My_Fst_Que);Out_Queue(My_Fst_Que, data);Print_Queue(My_Fst_Que);Out_Queue(My_Fst_Que, data);Print_Queue(My_Fst_Que);Out_Queue(My_Fst_Que, data);data = Head_Queue(My_Fst_Que);Print_Queue(My_Fst_Que); 3、運(yùn)行過程: 三、字符串的模式匹配 1、目的: 輸入目標(biāo)串和模式串,運(yùn)用KMP算法判斷是否匹配。 2、程序說明: typedef struct String String_KMP;struct String { char * data;int length;};定義結(jié)構(gòu)體。 int KMPMatch(String_KMP &s, String_KMP &t , int next[]);功能:用于檢測(cè)返回值情況。主函數(shù): void main(){ String_KMP s, p1;int *next_KMP, position=0;p1.data = “&&aaaaa”; } p1.length = strlen(p1.data);s.data =“&&&aaaaabaabcwwww”;s.length = strlen(s.data);next_KMP=(int *)malloc(sizeof(int)* strlen(p1.data));next(p1, next_KMP);position = KMPMatch(s, p1 , next_KMP);if(position == 0)printf(“No match!n”);else printf(“The match position is %dn”, position); 3、運(yùn)行過程: 1、匹配成功: 2、不能匹配: 四、稀疏矩陣(表示轉(zhuǎn)置和乘法) 1、目的: 通過對(duì)矩陣的基本操作,了解多維數(shù)組的邏輯結(jié)構(gòu)和存儲(chǔ)結(jié)構(gòu)。本程序是用三元數(shù)組表示矩陣,并進(jìn)行相關(guān)的操作,將矩陣表示出來,以及快速轉(zhuǎn)置的應(yīng)用。 2、程序說明: typedef struct { Triple data[MAXSIZE+1];int mu,nu,tu;} TSMatrix; int InputMatrix(TSMatrix &M);void PrintM(TSMatrix M);void PrintM3(TSMatrix M);void trantup(TSMatrix M, TSMatrix &T);主函數(shù): void main(){ } int a;TSMatrix M,T;a=InputMatrix(M);printf(“n按三元組方式輸出:n”);PrintM3(M);printf(“n下面進(jìn)行矩陣轉(zhuǎn)置的操作:n”);system(“PAUSE”);system(“cls”);printf(“n要轉(zhuǎn)置的矩陣為:n”);PrintM(M);trantup(M,T);printf(“n轉(zhuǎn)置后的矩陣為:n”);PrintM(T); 3、運(yùn)行過程: 五 AVL樹實(shí)現(xiàn) 1、目的: 通過程序的運(yùn)用,使得樹的相關(guān)功能更加容易實(shí)現(xiàn),節(jié)約了時(shí)間和精力。 2、程序說明: 求根深度的實(shí)現(xiàn)所用到的: Status InitBiTree(SqBiTree T);Status CreateBiTree(SqBiTree T);Status BiTreeEmpty(SqBiTree T);int BiTreeDepth(SqBiTree T);Status Root(SqBiTree T,TElemType *e); 3、運(yùn)行過程: 六、圖的實(shí)現(xiàn): 1、目的: 通過程序的運(yùn)用,使得圖的有關(guān)功能更加容易實(shí)現(xiàn),節(jié)約了時(shí)間和精力。 2、程序說明: 實(shí)現(xiàn)圖的輸出和遍歷用到的: void CreateGraph(Graph *ga);void DFS(Graph g,int i,bool visited[]);void DFSTraverse(Graph g);void BFSTraverse(Graph g,Queue *que); 3、運(yùn)行過程: 七、排序(希爾排序與歸并排序): 1、目的: 通過程序的運(yùn)用,使得數(shù)據(jù)的排序更加容易實(shí)現(xiàn),節(jié)約了時(shí)間和精力。 2、程序說明: 1)希爾排序的具體實(shí)現(xiàn): void ShellSort(RecType R[],int n){ int i,j,gap,k;RecType tmp;gap=n/2;while(gap>0){ for(i=gap;i { tmp=R[i]; j=i-gap; while(j>=0 && tmp.key { R[j+gap]=R[j]; j=j-gap;} R[j+gap]=tmp; j=j-gap;} printf(“gap=%d:”,gap); for(k=0;k printf(“%d ”,R[k].key);printf(“n”);gap=gap/2;} } 2)歸并排序: 歸并排序的實(shí)現(xiàn)所用到的: int randGenerator(double vArray[],int n);int Merge(double vArray[],double Lr[],int i,int m,int n);int Msort(double vArray[],double Lr[],int s,int t); 3、運(yùn)行過程: 總結(jié) 通過本次的實(shí)習(xí),使我掌握了模塊化設(shè)計(jì)方法,理解和運(yùn)用結(jié)構(gòu)化程序設(shè)計(jì)的思想和方法。提高了利用C語言進(jìn)行程序設(shè)計(jì)能力。 第一次設(shè)計(jì)這么多程序,感覺壓力很大,很難完成,雖然看起來設(shè)計(jì)流程感覺很輕松,但是正真完成的時(shí)候并不能通過程序表達(dá)出來。通過同學(xué)和老師的幫助最終還是完成了自己的程序設(shè)計(jì),雖然程序還不是很完美,但能滿足題目的各項(xiàng)要求,相信以后再次進(jìn)行程序設(shè)計(jì)的時(shí)候會(huì)得心應(yīng)手。 空間數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí)報(bào)告 學(xué)生姓名:孫國(guó)歡 班 學(xué) 號(hào):113131-05 指導(dǎo)老師:周琪 中國(guó)地質(zhì)大學(xué)信息工程學(xué)院 2015年10月 線簡(jiǎn)化算法的程序?qū)崿F(xiàn)及比較研究 一、實(shí)習(xí)內(nèi)容:程序?qū)崿F(xiàn)兩種或以上的線簡(jiǎn)化算法,并比較各種算法的優(yōu)劣。 二、實(shí)習(xí)要求:程序?qū)崿F(xiàn)以下四種線簡(jiǎn)化算法中的兩種或以上。 三、實(shí)習(xí)原理 i.基于點(diǎn)數(shù)的線簡(jiǎn)化算法(Num of points) ii.基于長(zhǎng)度的線簡(jiǎn)化算法(Length) iii.基于角度的線簡(jiǎn)化算法(Angle) iv.基于垂距的線簡(jiǎn)化算法(Perpendicular distance) v.Douglas-Peucker(1988) vi.Whirlpool(1980) 四、實(shí)習(xí)過程與成果 過程分析: 這次空間數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí)主要是圍繞幾個(gè)課上講的基本算法和Douglas-Peucker、Whirlpool算法來實(shí)現(xiàn)線簡(jiǎn)化算法。 我做了基于點(diǎn)數(shù)的線簡(jiǎn)化算法、基于長(zhǎng)度的線簡(jiǎn)化算法、基于角度的線簡(jiǎn)化算法、Douglas-Peucker和Whirlpool算法。 前三個(gè)算法的思想十分明確,是利用C++中的點(diǎn)的坐標(biāo)結(jié)合基本函數(shù)可以實(shí)現(xiàn)。Douglas-Peucker算法的基本思路是對(duì)每條曲線的首末點(diǎn)虛線連接一條直線,求所有點(diǎn)與直線的距離并求出最大距離Dmax,再用Dmax與限差d相比較然后進(jìn)行取舍。Whirlpool算法則是利用每個(gè)點(diǎn)設(shè)定r值畫圓進(jìn)行分類和取舍,成果展示: 基于點(diǎn)數(shù)的線簡(jiǎn)化算法 point=3 基于長(zhǎng)度的線簡(jiǎn)化算法 length=40 基于角度的線簡(jiǎn)化算法 angle=90° DP算法 垂距d=20 Whirlpool算法 r=40 基于點(diǎn)數(shù)的線簡(jiǎn)化算法 point=3 基于長(zhǎng)度的線簡(jiǎn)化算法 length=60 基于角度的線簡(jiǎn)化算法 angle=75° DP算法 垂距d=30 Whirlpool算法 r=50 ---------------分界線------------------ 基于點(diǎn)數(shù)的線簡(jiǎn)化算法 point=3 基于長(zhǎng)度的線簡(jiǎn)化算法 length=50 基于角度的線簡(jiǎn)化算法 angle=60° Whirlpool算法 r=40 DP算法得線簡(jiǎn)化結(jié)果為點(diǎn)(39,62) -------分界線------------------- 基于點(diǎn)數(shù)的線簡(jiǎn)化算法 point=4 基于長(zhǎng)度的線簡(jiǎn)化算法 length=40 基于角度的線簡(jiǎn)化算法 angle=90° DP算法 垂距d=20 Whirlpool算法 r=30 --------分界線------------------ 基于點(diǎn)數(shù)的線簡(jiǎn)化算法 point=3 基于長(zhǎng)度的線簡(jiǎn)化算法 length=30 基于角度的線簡(jiǎn)化算法 angle=60° DP算法 垂距d=30 Whirlpool算法 r=25 五、思考與感想 實(shí)習(xí)思考: 針對(duì)基于點(diǎn)數(shù)的線簡(jiǎn)化算法、基于長(zhǎng)度的線簡(jiǎn)化算法、基于角度的線簡(jiǎn)化算法、Douglas-Peucker和Whirlpool算法,我共采取了五組實(shí)驗(yàn)數(shù)據(jù),分別表示五種圖形數(shù)據(jù)。源數(shù)據(jù)1是一個(gè)普通的彎折直線圖,源數(shù)據(jù)2是一個(gè)起伏相當(dāng)明顯且角度多變的圖形,源數(shù)據(jù)3是一個(gè)閉合的多邊形,源數(shù)據(jù)4是一個(gè)近乎一端開口的矩形,源數(shù)據(jù)5是一個(gè)彎折且有重疊的折線圖。 我認(rèn)為這五種情況的線性矢量數(shù)據(jù)采用不同的線簡(jiǎn)化算法產(chǎn)生的結(jié)果也決然不同。其中值得一提的是源數(shù)據(jù)3(閉合多邊形)在Douglas-Peucker算法下簡(jiǎn)化為一個(gè)點(diǎn),這與DP算法的原理有關(guān),所有除首尾的點(diǎn)被舍去因而結(jié)果簡(jiǎn)化完只有一個(gè)頂點(diǎn)。而源數(shù)據(jù)4(一端開口的近矩形)在基于角度的線簡(jiǎn)化算法去angle=90°時(shí)完全簡(jiǎn)化成一個(gè)矩形,也反映了基于角度的線簡(jiǎn)化算法的原理使其去了四方頂點(diǎn)。 比較我所探索的這五種線簡(jiǎn)化方法:基于點(diǎn)數(shù)的線簡(jiǎn)化算法、基于長(zhǎng)度的線簡(jiǎn)化算法、基于角度的線簡(jiǎn)化算法、Douglas-Peucker和Whirlpool算法。我認(rèn)為它們都具有鮮明的優(yōu)劣勢(shì)。 ① 基于點(diǎn)數(shù)的線簡(jiǎn)化算法:取相對(duì)應(yīng)的隔點(diǎn)數(shù)并保留首尾點(diǎn),方便快捷但效果一般 ② 基于長(zhǎng)度的線簡(jiǎn)化算法:取相對(duì)應(yīng)的點(diǎn)與點(diǎn)的距離并保留首尾點(diǎn),刨去了冗余的點(diǎn),簡(jiǎn)化效果良好。 ③ 基于角度的線簡(jiǎn)化算法:取相對(duì)應(yīng)的點(diǎn)與點(diǎn)的角度并保留首尾點(diǎn),基本上擇彎取直,簡(jiǎn)化效果良好。 ④ Douglas-Peucker算法:求所有點(diǎn)與對(duì)每條曲線的首末點(diǎn)連接的直線的距離并求出最大距離Dmax,再用Dmax與垂距d比較后取舍。舍去了一些線性矢量數(shù)據(jù)上的點(diǎn),形成了鮮明的結(jié)果,但是過程比較冗雜。⑤ Whirlpool算法:對(duì)設(shè)定的半徑r給每個(gè)點(diǎn)作圓并進(jìn)行取舍,使線性矢量數(shù)據(jù)的點(diǎn)的分布更加清晰,刨去了密集區(qū)的重復(fù)點(diǎn),但不簡(jiǎn)便。 實(shí)習(xí)感想: 通過這次空間數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí),我學(xué)到了很多。在此次實(shí)習(xí)中,我對(duì)這門課有了更加深刻的認(rèn)識(shí),學(xué)會(huì)了把所學(xué)的理論知識(shí)和實(shí)踐聯(lián)系起來。 對(duì)于我來說不僅是設(shè)計(jì)算法來實(shí)現(xiàn)線簡(jiǎn)化算法,最為珍貴的是在我準(zhǔn)備這次實(shí)習(xí)所鞏固的以前不熟悉的知識(shí)。它培養(yǎng)了我們由書面文字要求到轉(zhuǎn)化這種要求到現(xiàn)實(shí)模型的能力,即很大程度上培養(yǎng)了我們的建模能力,分析問題,總結(jié)歸納問題的能力。這次實(shí)習(xí)也遇到了一些難關(guān),但它們給了我們思索的機(jī)會(huì)。我們通過克服這一個(gè)個(gè)困難,讓我們重新又對(duì)目前腦子里所掌握的知識(shí)進(jìn)行審理,進(jìn)行了再次的糾正或者完善,這些都是書本上學(xué)不來的。理論聯(lián)系實(shí)際就在這里自然地得到實(shí)現(xiàn)。這對(duì)我們鞏固已學(xué)知識(shí),鍛煉實(shí)踐動(dòng)手能力大有裨益。 在這次實(shí)習(xí)中,我覺得我最大的收獲就是學(xué)會(huì)了為了實(shí)現(xiàn)這些算法,我該如何去構(gòu)建這樣的框架。實(shí)習(xí)的這幾周,我從只理解書面上的線簡(jiǎn)化算法原理,到現(xiàn)在實(shí)現(xiàn)這樣的過程,中間也遇到了很多困難和挫折。在程序的編寫過程中,也出現(xiàn)了很多錯(cuò)誤,經(jīng)過我認(rèn)真修改,查閱資料,向老師和同學(xué)們請(qǐng)教,終于把那些錯(cuò)誤都改正過來,最終使程序能夠結(jié)合要求的算法正確的運(yùn)行。我再通過繪制excel表格來進(jìn)一步了解各種不同的線簡(jiǎn)化算法會(huì)出現(xiàn)什么樣的結(jié)果。所以說,這次實(shí)習(xí)不僅是讓我學(xué)到了各種線簡(jiǎn)化算法的方法,更重要的是它提高了我理論轉(zhuǎn)化為實(shí)踐的能力。謝謝老師在空間數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí)過程中給予的幫助。最后祝老師工作順利,身體健康。 學(xué)生姓名:孫國(guó)歡 班 學(xué) 號(hào):113131-05 中國(guó)地質(zhì)大學(xué)信息工程學(xué)院 2015年10月 生產(chǎn)實(shí)習(xí)目的測(cè)量學(xué)實(shí)習(xí)是測(cè)量學(xué)教學(xué)的重要組成部分,其目的使學(xué)生鞏固、擴(kuò)大和加深從課堂學(xué)到的理論知識(shí),獲得實(shí)際測(cè)量工作的初步經(jīng)驗(yàn)和基本技能,進(jìn)一步掌握測(cè)量?jī)x器的操作方法,提高計(jì)算和繪圖能力,對(duì)測(cè)繪小區(qū)域大比例尺地形圖的全過程有一個(gè)全面和系統(tǒng)的認(rèn)識(shí),會(huì)認(rèn)識(shí)地形圖,能夠根據(jù)給定的地形圖在實(shí)際中尋找到圖上所示的點(diǎn),并在實(shí)習(xí)的過程中增強(qiáng)其獨(dú)立工作與團(tuán)隊(duì)協(xié)作意識(shí),為今后解決實(shí)際工作中的有關(guān)測(cè)量問題打下堅(jiān)實(shí)的基礎(chǔ)。學(xué)生通過本次實(shí)習(xí)應(yīng)達(dá)到如下要求: 1.掌握經(jīng)緯儀、視距尺等測(cè)量?jī)x器的操作方法; 2.掌握地形測(cè)圖的基本方法,能夠具有初步測(cè)繪小區(qū)域大比例尺地形圖的工作能力; 3.能夠根據(jù)給定的地形圖在實(shí)際中尋找到圖上所示的點(diǎn); 4.各小組分工明確、通過合作完成測(cè)量任務(wù),增強(qiáng)獨(dú)立工作能力與團(tuán)隊(duì)協(xié) 生產(chǎn)實(shí)習(xí)時(shí)間及地點(diǎn) 1.地形圖測(cè)繪實(shí)習(xí)地點(diǎn):中國(guó)地質(zhì)大學(xué)北區(qū)南望山 時(shí)間:2011年10月15日至2011年10月16日.2.地形圖識(shí)圖實(shí)習(xí)地點(diǎn):九峰山 時(shí)間:2011年10月19日 實(shí)習(xí)小組信息 組別:地空學(xué)院061113班 測(cè)量3組 指導(dǎo)老師:XX 組員:XX、XX、XX、XX、XX組員分工: 選點(diǎn)與跑尺:XX 記錄與計(jì)算:XX/XX 描點(diǎn)與繪圖:XX 實(shí)習(xí)內(nèi)容 (一)大比例尺地形圖的測(cè)繪: 1.地點(diǎn):中國(guó)地質(zhì)大學(xué)北區(qū)南望山 2.任務(wù):通過兩天的地形圖測(cè)繪實(shí)習(xí),每小組要取得200個(gè)左右的測(cè)點(diǎn)數(shù)據(jù),并根據(jù)得到的數(shù)據(jù)完成一幅比例尺1:500,等高距1m的30cmx30cm的地形圖 3.內(nèi)容:(1)2011年10月14日下午,劉甜甜、魯凱跟老師去踩點(diǎn).我和其他組員到學(xué)校出版社領(lǐng)儀器(經(jīng)緯儀),工具及用品的準(zhǔn)備(包括測(cè)量記錄手簿、2H繪圖鉛筆、三棱尺、半圓儀、圖板、計(jì)算器、直尺等基本物品); (2)2011年10月14日晚上,我、XX/XX按照使測(cè)繪更加方便、有效、快捷的原則,根據(jù)測(cè)區(qū)位置,在圖板上布設(shè)控制點(diǎn);我先按圖紙對(duì)角畫兩條對(duì)角線,然后等距量取四條對(duì)角邊,連線,各取每10cm每條邊取點(diǎn)連線得到30cmx30cm的圖根,然后XX按比例尺計(jì)算出控制點(diǎn)的位置,最后XX在圖上找出對(duì)應(yīng)坐標(biāo)位置點(diǎn)出控制點(diǎn),最后完成了全部展點(diǎn)工作。 (3)過程: 測(cè)區(qū)面積有150mx 150m,中間有一座小山丘,山丘上面有一個(gè)房子、畢業(yè)墻、一個(gè)圓柱體??刂泣c(diǎn)是已知高程(海拔)的點(diǎn),我們需要在這些控制點(diǎn)上架設(shè)經(jīng)緯儀,以它們?yōu)榛鶞?zhǔn)來測(cè)它與其他位置點(diǎn)的高差,進(jìn)而推算位置點(diǎn)的高程(海拔)。因?yàn)榭刂泣c(diǎn)的個(gè)數(shù)有限,尤其是位置好的控制點(diǎn)更是稀少,所以我們必須要有搶占有利控制點(diǎn)的意識(shí)與沖動(dòng)。只有如此,我們的測(cè)繪才會(huì)更加高效。實(shí)習(xí)的前一天,所有人都在搶占有利控制點(diǎn)上做了充分準(zhǔn)備。2011年10月15早上因?yàn)檫\(yùn)動(dòng)會(huì)耽誤了一點(diǎn)時(shí)間所以到中午我們組才這全部到達(dá)南望山,因此有利的控制點(diǎn)基本被占領(lǐng)了!但是為期兩天的測(cè)量實(shí)習(xí)就這樣開始了! 第一天大家都沒有一點(diǎn)經(jīng)驗(yàn),我們找到了山上的房子旁邊的一個(gè)控制點(diǎn)——43號(hào)點(diǎn),XX用 他新的對(duì)中、整平方法快速對(duì)中整平了可是他說要用直尺測(cè)量房子的邊長(zhǎng),我認(rèn)為不妥!因?yàn)檫@就是和用經(jīng)緯儀測(cè)距違背了!我提出了疑義,我們?nèi)タ磿粩嗟拿?,最后提出一個(gè)到后面才知道是錯(cuò)的方法!就是用兩個(gè)控制點(diǎn)定出一個(gè)點(diǎn)!一天到下午測(cè)不了幾個(gè)碎步點(diǎn),分工也很亂!有時(shí)后我們隊(duì)員都不知道做什么,后來,我們換到離43號(hào)點(diǎn)較近的21號(hào)點(diǎn),準(zhǔn)備測(cè)量,可是從早上到現(xiàn)在我們的測(cè)量方法一直在變,一直有爭(zhēng)議,在這兩個(gè)點(diǎn)測(cè)到得數(shù)據(jù)也不懂怎么用!到這時(shí)天色準(zhǔn)備暗下來了! 老師看到我們組的進(jìn)度緩慢就叫一個(gè)測(cè)得快的組的一名組員來幫忙,聽著這名同學(xué)講解,我們明白了整個(gè)測(cè)量的基本過程: 1:將架設(shè)好的經(jīng)緯儀對(duì)準(zhǔn)另一個(gè)控制點(diǎn),調(diào)節(jié)水平度盤使讀數(shù)為零。 2:讓選點(diǎn)跑尺的組員選好碎步點(diǎn),是山坡的,一般應(yīng)該在大概認(rèn)為同一高度選出若干個(gè)碎步點(diǎn),立尺。 3:讓觀察者將經(jīng)緯儀轉(zhuǎn)向標(biāo)尺讀出上絲讀數(shù)、中絲讀數(shù)、下絲讀數(shù)、水平度盤讀數(shù)、豎直度盤讀數(shù),讓記錄員記錄 4:計(jì)算者計(jì)算出上絲讀數(shù)減下絲讀數(shù)、用公式計(jì)算出實(shí)際距離、高程、根據(jù)比例尺算出圖上距離,填入手簿,同時(shí)告訴繪圖者角度、圖上距離和高程。 5:繪圖者根據(jù)所得到的數(shù)據(jù)用半圓儀、直尺、鉛筆繪出碎步點(diǎn)標(biāo)出高程。 明白整個(gè)過程之后我們知道之前的數(shù)據(jù)都作廢了!太陽(yáng)開始落山,我們趕快行動(dòng),天色真的已經(jīng)很黑了,連看度盤讀數(shù)都只能用手機(jī)照明才能看清!就這樣在天完全黑之后我們只完成兩個(gè)控制點(diǎn)的測(cè)量,我們托著疲憊的身體回來了,我們組設(shè)最后一組回來的,但是我們已經(jīng)完全清楚明天我們?cè)撟鍪裁?、該怎么做,相信我們明天一定能完成任?wù)! 經(jīng)過昨天的教訓(xùn)2011年10月16日這天早上6點(diǎn)我們就起床,早早的到達(dá)了北區(qū)南望山,這一天我們是第一組到達(dá)的!我們有明確的分工,明確的測(cè)量步驟,明確的測(cè)量路。我們的效率很高,第一個(gè)地點(diǎn)是上山的路口階梯從6號(hào)點(diǎn)到22號(hào)點(diǎn)選擇拐點(diǎn)....。就這樣一片片山坡、山谷、低地....被我們選點(diǎn)、觀察、記錄、計(jì)算、繪圖描繪出來了。 就這樣到了兩點(diǎn)我們因?yàn)樵缟隙贾怀粤艘粋€(gè)餅而體力不支了!個(gè)個(gè)臉色慘白,又不能休息,因?yàn)槲覀冞€有很多點(diǎn)沒測(cè)。這時(shí)食堂只有面食了!我們只好輪流去吃,去了兩個(gè)組員,就在這時(shí)我們發(fā)現(xiàn)39號(hào)點(diǎn)的數(shù)據(jù)全部有誤,原來是所標(biāo)的39號(hào)點(diǎn)本來就是有誤的!我們很氣憤,但是我們必須堅(jiān)持,我們繼續(xù)測(cè)到35號(hào)點(diǎn)終于測(cè)完了!這時(shí)我們已經(jīng)累得趴在山坡上了!看看表離交儀器的時(shí)間還有一個(gè)小時(shí),強(qiáng)忍著疲憊、饑餓、困意我們扛著感覺比以前重了很多的儀器到學(xué)校出版社交了,讓我們感到欣慰的是還有許多組還沒測(cè)完! 心得體會(huì) 1.經(jīng)過這次實(shí)習(xí)讓我感受到學(xué)會(huì)理論和實(shí)際的結(jié)合是很重要且是一個(gè)循序漸進(jìn)的過程。要達(dá)到實(shí)踐貫通,把課本知識(shí)很好的運(yùn)用到實(shí)際中是會(huì)受到許多挫折的,比如我們組在實(shí)習(xí)第一天基本沒什么收獲。我作為計(jì)算員我用到的公式有:....., 式中Hi是碎步點(diǎn)高程,Da1是測(cè)站至碎步點(diǎn)的水平距離,k 視距乘常數(shù);t為(尺間距)上絲、下絲讀數(shù)之差;l為中絲讀數(shù);i為儀器高;a為豎直角??墒窃趯?shí)際計(jì)算時(shí)不能死搬硬套公式,比如a角是豎直角當(dāng)這角是90度是用計(jì)算器算時(shí)是輸入0度,當(dāng)這角大于90度時(shí)用這角減去90度所得的角度加上負(fù)號(hào)在輸入,小于是用90度減去所得讀數(shù)直接輸入,還有一些簡(jiǎn)便一點(diǎn)的計(jì)算方法也是實(shí)際操作后才慢慢摸索出來的,同樣繪圖員、記錄員、觀察員、跑尺選點(diǎn)員都會(huì)遇到不一樣的實(shí)際問題。所以說實(shí)習(xí)是把我們從課本學(xué)到的知識(shí)用到實(shí)際的一個(gè)過程。 2.通過這次實(shí)習(xí)也讓我感受到以前的艱苦條件下做一幅全國(guó)地形圖是多么的困難和來之不易??!也為我們作為地大人能為人們作出的貢獻(xiàn)而感到自豪和敬佩! (二)持圖實(shí)地跑點(diǎn)實(shí)習(xí): 1.地點(diǎn):九峰山 2.任務(wù):到達(dá)圖上表示的指定地點(diǎn)中的至少5個(gè),將實(shí)地編號(hào)標(biāo)注到地圖上.3.內(nèi)容: (1)全組成員集中分析地圖,確定初始路線; (2)按照初始路線尋找指定點(diǎn); (3)過程: 2011年10月19日晨,我們從中國(guó)地質(zhì)大學(xué)出版社拿到的不再是經(jīng)緯儀、三角架和視距尺,而是一張九峰山地區(qū)的地圖。是一張已經(jīng)泛黃的,1973年繪成的地圖,上面采用的最接近成圖時(shí)間的數(shù)據(jù)是1969年的。圖上畫了許多個(gè)框框,它們標(biāo)注的就是我們組今天要到的地方。雖然每個(gè)小組的地圖是一樣的,但上面被標(biāo)注的點(diǎn)卻是不一樣的。也就是說,我們的目的地可能有重合,但不會(huì)是每個(gè)目的地都一樣。因此,各組之間幾乎獨(dú)立的,合作被限定在了組內(nèi)。老師告訴我們,圖上表示的一個(gè)池塘已經(jīng)填掉了,變成了農(nóng)田,有座橋已經(jīng)不存在了,圖上表示的湖北省林業(yè)科學(xué)研究所已經(jīng)更改了地址。這加重了我們對(duì)這張地圖的懷疑,其他的地方就沒有變化嗎?我們要找的點(diǎn)在實(shí)地被標(biāo)注在電線桿、石板橋、池塘壁等地方,而且這些點(diǎn)上是有編號(hào)的,我們只有真正到過這些點(diǎn)才能知道它們的編號(hào)。按照要求,我們要把這些編號(hào)標(biāo)注在地圖上,我們要至少找到5個(gè)。 今天我們從地大出版社坐車出發(fā)到一個(gè)加油站下,這里就是潛力村也就是出發(fā)點(diǎn)。組員們捧著這張地圖走向了一片未知區(qū)域。地圖成了我們不會(huì)迷路的唯一保障。跟著大部隊(duì),我們翻過了第一座山,山的背后是公墓。很快我們到了第一個(gè)路口,我們要找的一個(gè)點(diǎn)在向東的方向,其他點(diǎn)在向西的方向,而且那個(gè)獨(dú)立的點(diǎn)要翻過一座高山才會(huì)到達(dá)。分析了利弊后,我們決定放棄它。放棄它就意味著放棄大部隊(duì),我們組成了少數(shù)走向西道路的小組。對(duì)比了圖上池塘的位置,我們終于找到了它,地圖告訴我們,這里有地大的點(diǎn)。在一個(gè)田邊的電線桿上,我們看到了“地大78”。這是我們的第一個(gè)成果。但是這次我們又犯了一個(gè)錯(cuò)誤:我們把圖上的點(diǎn)當(dāng)作我們要找的點(diǎn)!費(fèi)了很多時(shí)間在這附近找等到后來的一組來了問明之后才知道這本來就是我們要找的點(diǎn)! 沿著池塘邊的公路,我們繼續(xù)前行,過了1個(gè)比較大的村子。重新看了一遍地圖,對(duì)比了實(shí)地,我們還問了當(dāng)?shù)氐睦相l(xiāng),我們要找到一個(gè)祠堂然后找到一個(gè)村子,我們很快看到了遠(yuǎn)方我們要找的祠堂和村子。為了抄近路,我們進(jìn)了稻田。秋天的稻田已是十分空曠,但湖北多湖的特點(diǎn)注定這里是泥濘的。選擇了走農(nóng)田,那么可能出現(xiàn)的點(diǎn)就只能在電線桿上。直到走出稻田,我們也沒有發(fā)現(xiàn)要找的點(diǎn)。我們又經(jīng)過了一個(gè)村子來到這村后一座小山,用地形圖所給的正北方向結(jié)合剛升起不久的太陽(yáng)代表的東邊找到了有一個(gè)點(diǎn)就在這座村子旁的另一個(gè)村子里,確定之后我們飛奔去哪里,在途中碰上了另一個(gè)小組,我們就和并成一個(gè)組,在這個(gè)村我們順利的找到了21號(hào)點(diǎn),這點(diǎn)非常隱蔽而且也被破壞得很厲害.這時(shí)我們遇到一個(gè)艱難的選擇,該是北走去曹家村,還是向西走去下劉村?去了下劉村就過了幾個(gè)點(diǎn),可是到了下劉村就接近目的地了!經(jīng)過討論我們決定還是去了下劉村,經(jīng)過下劉村是我們問水庫(kù)在哪里!老鄉(xiāng)說要經(jīng)過涵洞,我們就經(jīng)過了涵洞,到了一片山林,我們非常艱難的穿過這片充滿荊棘的山林又到了一片長(zhǎng)滿雜草的田野,過了這片田野,我們每個(gè)人的衣服、鞋帶都插有許多不知名的刺! 我們到達(dá)水庫(kù)時(shí)所有的組員又累又餓,在這里即找不到點(diǎn)也為往哪里走而迷茫,本來一個(gè)點(diǎn)找不到十幾分鐘就應(yīng)該放棄,但是由于這個(gè)錯(cuò)我們一直以問當(dāng)?shù)氐睦相l(xiāng)為判斷所走的方向是否正確,當(dāng)我們找到100號(hào)點(diǎn)時(shí),已經(jīng)沒有時(shí)間停留了,我們奔跑在途中找到145號(hào)點(diǎn),往前走就是上山的小路,這就是老師說的通往老林科所的捷徑!我們繼續(xù)奔跑!體力好的跑在前面但也帶著重物,同時(shí)不忘告訴后面的隊(duì)員往哪里走,就這樣看到一條馬路上標(biāo)有地大CUG字符,向下走看到一只鎖著的狗一直在叫,最終看到了在老林科所等待的鄒蓉老師,能看到 她真的很高興!隨后隊(duì)員們?nèi)康烬R!然后跟隨老師到達(dá)土橋村的一個(gè)已經(jīng)廢棄的大加油站,在這里能看到其他組,在這里和他們交流,等了十幾分鐘等到學(xué)校派來的車,坐上車,大家都累了,已經(jīng)沒有剛來時(shí)在車上的喧鬧、許多人已經(jīng)在這回校的車上進(jìn)入夢(mèng)鄉(xiāng)!持圖實(shí)地跑點(diǎn)實(shí)習(xí)就這樣落下帷幕。 心得體會(huì) 1.經(jīng)過這次跑點(diǎn)實(shí)習(xí),是我認(rèn)識(shí)到要準(zhǔn)確看懂一幅地形圖并能把它和實(shí)際地形正確符合起來確實(shí)是一件不容易的事 2.在跑點(diǎn)過程中隊(duì)員之間一定要團(tuán)結(jié)協(xié)作,不能有爭(zhēng)執(zhí) 3.在這次實(shí)習(xí)中我們除了感到累,更重要的是我們同時(shí)也感受到了運(yùn)用智慧的樂趣、團(tuán)結(jié)協(xié)作的快樂、成功在規(guī)定時(shí)間之內(nèi)到達(dá)目的地歡喜。 誤我們組失去了許多時(shí)間,最后我們終于決定往螞蟻峰走,這時(shí)得到另一些組已經(jīng)到達(dá)使我們不免有一些喪氣,經(jīng)過一個(gè)十字路口時(shí),往前就有一個(gè)點(diǎn),可是這是一座挖空的山,我們想碰碰運(yùn)氣可是終究找不到,回到十字路口,這時(shí)我們這個(gè)合并組分別往相反的方向走!當(dāng)我們感覺我們走的方向是對(duì)的時(shí),我們跑步前進(jìn),不,可以說是狂奔!過往的山中美景、田園風(fēng)光都被我們忽略了,我們的目標(biāo)只有一個(gè)——老林科所。第二篇:中國(guó)地質(zhì)大學(xué)數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí)報(bào)告
第三篇:中國(guó)地質(zhì)大學(xué)(武漢)數(shù)據(jù)結(jié)構(gòu)報(bào)告
第四篇:中國(guó)地質(zhì)大學(xué)(武漢)空間數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí)報(bào)告
第五篇:中國(guó)地質(zhì)大學(xué)《生產(chǎn)實(shí)習(xí)報(bào)告》