本周親愛的聶大帥給我們布置 了一個課題
課題名:類比電報通訊要求:電報大家是都知道的。現在我想要大家用c語言做一個區域網路內的電報通訊軟體(無需介面,控制台程式即可)。中間會涉及到網路編程,摩爾斯電碼解析(就是字串處理)等知識。無需做的多複雜,我只要這些功能:1,電報功能的類比。能收,能回複。2,將重要訊息存檔處理。3,摩爾斯電碼的準確解析。無需中文,簡單的英文即可。(偷偷地引用一下)下面我就說說我是怎麼做的吧首先網路部分,這個比較簡單,看看例子,幾個函數的調用,看看說明,然後研究一下就OK了。(相信有同仁會寫這個的)存檔部分,也比較簡單,用一個二級針指,把所有資訊先記錄下來,然後看使用者有沒有需要,不要的話free就完事了。我想重點講講這個有趣的MorseCode(PS:這個一點一杠的真的很有意思,大家可以看看百度百科,還有一個段基於MorseCode的愛情)。好了,進入正題,其實MorseCode可不用要用枚舉的,那樣一個一個地寫多麻煩啊,下面我來介紹一種基於二叉樹實現的MorseCode。先讓大家看看一些符號的MorseCode有規律嗎? 答案是必然的!再看: “嘀”聲代表一點,“噠”聲代表一橫線,聽到“嘀”就向右移動,聽到“噠”就向左移動。例如你聽到“噠嘀嘀”,就表示先向左一次,再向右兩次,就會去到D那裡。有規律 了吧,不信的可以自己去驗證一下!好,有了 這些基礎就是我們大展才華的奠基石了!下面看一段代碼:產生MorseCode樹
typedef struct tree
{
char data;
struct tree *leftchild;
struct tree *rightchild;
} MorseCode;
#define LENTREE sizeof(MorseCode)
char morse[100]={'#','T','M','O',',','0','$','$','9','$','$','.','$','8','$','$','G','Q','$','$','Z',/
'$','7','$','$','N','K','Y','$','$','C','$','$','D','X','$','$','B','$','6','$','$','E','A','W','J',/
'1','$','$','$','P','$','$','R','$','L','$','$','I','U','-','2','$','$','$','F','$','$','S','V',/
'3','$','$','$','H','4','$','$','5','$','$'};
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Menlo}
span.s1 {color: #b72e9f}
span.s2 {color: #2f30d3}
int morse_x=-1;
void creat_tree(MorseCode **root)
{
morse_x++;
if (morse[morse_x] == '$')
{
(*root) = NULL;
}
else
{
(*root) = (MorseCode *) malloc (LENTREE);
(*root)->data = morse[morse_x];
creat_tree(&(*root)->leftchild);
creat_tree(&(*root)->rightchild);
}
return ;
}
將字串轉為MorseCodevoid preorder_letterTOmorse(MorseCode *root,char *morsecode,char *letter,int i,int *j)<br />{<br />if (root)<br />{<br />if (root->data == letter[i])<br />{<br />morsecode[(*j)++] = ' ';<br />return ;<br />}<br />else<br /> {<br />morsecode[(*j)++] = '_';<br />preorder_letterTOmorse(root->leftchild,morsecode,letter,i,j);<br />if (morsecode[(*j)-1] == ' ') return ;<br />(*j)--;<br />morsecode[(*j)++] = '.';<br />preorder_letterTOmorse(root->rightchild,morsecode,letter,i,j);<br />if (morsecode[(*j)-1] == ' ') return ;<br />(*j)--;<br />if (morsecode[(*j)] == ' ') return ;<br />}<br />}<br />return ;<br />}<br />void letterTOmorse(MorseCode *root, char **morsecode,char *letter)<br />{<br />(*morsecode) = (char *) malloc(sizeof(char)*100);<br />strnset((*morsecode),'0',100);<br />int i=0,j=0;<br />while (letter[i]!='/0')<br />{<br />preorder_letterTOmorse(root,*morsecode,letter,i,&j);<br /> i++;<br />}<br />(*morsecode)[j]='/0';<br />}<br />
將MorseCode轉為字串char preorder_morseTOletter(MorseCode *root,char *temp,int *j)<br />{<br /> (*j)++;<br /> char result;<br /> if (root)<br />{<br /> if (temp[*j]=='/0')<br /> {<br /> return root->data;<br /> }<br /> if (temp[*j]=='_')<br /> {<br /> result=preorder_morseTOletter(root->leftchild,temp,j);<br /> if (temp[*j]=='/0')<br /> {<br /> return result;<br /> }<br /> }<br /> if (temp[*j]=='.')<br /> {<br /> result=preorder_morseTOletter(root->rightchild,temp,j);<br /> if (temp[*j]=='/0')<br /> {<br /> return result;<br /> }<br /> }<br /> }<br />}<br />void morseTOletter(MorseCode *root, char *morsecode,char **letter)<br />{<br /> (*letter) = (char *) malloc(sizeof(char)*100);<br /> char *temp = (char *) malloc(sizeof(char)*10);<br /> int i=0,j=0,k=0;<br /> while ( morsecode[i]!='/0')<br /> {<br /> j=0;<br /> while(morsecode[i]=='.' || morsecode[i]=='_')<br /> {<br /> temp[j++]=morsecode[i++];<br /> }<br /> temp[j]='/0';<br /> if ( morsecode[i]=='/0')<br /> {<br /> break;<br /> }<br /> else<br /> {<br /> i++;<br /> }<br /> j=-1;<br /> (*letter)[k++]=preorder_morseTOletter(root,temp,&j);<br /> }<br /> (*letter)[k]='/0';<br /> free(temp);<br /> return ;<br />}<br /> 有了這些代碼,是不是很方便地轉換了?還有就是,要加入更多字元的資訊只要在建立樹的時候加一字元就OK了,加上樹的搜尋效率,是不是感覺很爽啊! 最後,求交流!!!