2015-07-20 152 views
2

我一直在努力如何完成這項任務很長一段時間,並決定我需要一些幫助。我必須將莫爾斯碼轉換爲英文,並輸出所有可能的翻譯到列表框(甚至是亂碼)。 搜索已經出現了很多不同的線程,但沒有用,因爲它們不是這種語言,或者它們已經過時(VB6)代碼。 分配狀態:解碼莫爾斯電碼問題

使用典型的點和破折號( - )的代碼的書面陳述,字... ---在莫爾斯電碼..-....-()。可能是名字索非亞或歐根尼的編碼,取決於你在哪裏拆分字母: ... | --- | ..-。| .. | .-。索非亞 。| ..- | - 。。| 。 - - 。| .. | .- - Eugenia

其中管道只是顯示如何分解字符串。

我已經嘗試了「For Each」循環,「For」循環,寫入文本文件和回讀,分割字符串1到4個字符,Select Case方法和上述所有組合,我可以想到沒有運氣。 我的For循環會產生一組26個任務,但不包含任何單詞,只是一系列空格,然後是單個字母26次,然後是該字母兩次26次,依此類推。 文本文件和將字符串拆分爲一個或兩個字符導致E,A或T用於輸出,每個都在其自己的行上乘以字符串中的迭代次數,並且將字符串拆分三個或四個字符會導致相同或者如果字符串沒有均勻分割,則會出現IndexOutOfRange錯誤。 我已經回到了我編寫的實際工作中最接近的東西,但輸出的結果仍然是英文字母。

這次我使用了一個Linq查詢,並希望得到任何幫助,瞭解如何正確地遍歷字符串以完成作業所要求的內容。

這裏是我的代碼至今:

Imports System.IO 
Imports System.Text 

Public Class Form1 

    Dim MorseCode() = File.ReadAllLines("MorseCode2.txt") 

    Private Sub input_TextChanged(sender As Object, e As EventArgs) Handles input.TextChanged 

    End Sub 

    Private Sub output_SelectedIndexChanged(sender As Object, e As EventArgs) Handles output.SelectedIndexChanged 

    End Sub 

    Private Sub help_Click(sender As Object, e As EventArgs) Handles help.Click 

     'Displays the Morse Code and English letter equivalents 
     Process.Start("MorseCode.txt") 

    End Sub 

    Private Sub translate_Click(sender As Object, e As EventArgs) Handles translate.Click 

     Dim userText As String = input.Text 
     Dim temp As String 
     Dim word As String 

     'Search the users entry for possible translations 
     Dim query = From line In MorseCode 
        Let data = line.split(","c) 
        Let engLtr = data(0) 
        Let code = data(1) 
        Select engLtr, code 

     For Each code In query 
      If userText.Contains(code.code) Then 
       temp = code.engLtr 
       word = String.Concat(temp + temp) 
       output.Items.Add(word) 
      End If 
     Next 

    End Sub 

End Class 

我敢肯定我的錯誤是在.Concat呼叫,但沒有我嘗試已經解決了這個問題。

謝謝你給我的任何指針!

編輯補充僞代碼:

1 - 讀取輸入字符串

2 - 突破字符串爲單個元素各1個符號,匹配符號信,發送到溫度,CONCAT字符串轉換爲文字,輸出各字列表框

3 - 重讀串闖入兩個符號每個 「......」

4 - 「...」 三個符號每個 「......」

5 - 「...」四個符號每個「......」

+0

Eew,他們教VB嗎?毛。至於賦值,它是一個返回可枚舉字符串的方法中的尾遞歸。收益報表將使這個非常乾淨。 「查找所有匹配字符串開頭的字符,對於每個字符,再次調用相同的方法傳遞剩餘的字符串,然後將每個返回的結果與此字符連接起來,並將其傳遞給直接調用者。就這麼簡單。 – Will

+1

@有些學校還會教cobol麼?你應該刪除你的第一句...... – Fredou

+2

@如果他們教C#或Java,它會「更酷」嗎? '因爲這些語言與VB.Net非常相似。 – ChicagoMike

回答

0

我被給了一個答案[在這裏],並能夠實現這個想法到我自己的程序。感謝所有幫助我的人! 1

5

我已經試過‘對於每一個’循環‘for’循環,寫1到文本文件和讀回,分割字符串4字符,Select Case方法和上述的所有組合,我可以想到沒有運氣。

這就像說「我要準備可口的飯菜,我已經試過糖,肉,奶,鹽,煤氣爐,電爐,清洗廚房,煎鍋,叉子和以上所有的組合我都能想到,沒有運氣。「

你明顯缺少的是配方。在計算機科學方面,這是算法。我建議你做以下事情:

  1. 離開計算機。拿一張紙和一支鉛筆。

  2. 試着手工解決問題。以...---..-....-爲例,並嘗試查找所有可能的含義。

  3. 當你完成後,想想如何你解決了這個問題。你做了什麼來確保你不會錯過任何可能的含義?嘗試用簡單的英文寫下你採取的步驟。這是你的算法

  4. 現在您可以開始將您的算法轉換爲您選擇的編程語言。

如果您有任何與這些步驟麻煩,我建議你開始一個新的問題,並要求有關這一點專門。不要忘記提及你嘗試過的方法以及你卡在哪裏。

+0

好吧,以及我卡住的地方是通過正確的輸入莫爾斯碼獲得迭代。紙是一回事,我不會崩潰或拋出像這樣的代碼的異常錯誤。 我通過子字符串方法分割字符串,類似於我的for循環中的「i = 0到userInput.Substring(0,2)第2步」 ,這是行不通的。我在那裏有四個if語句,用於將字符串按英文字母的莫爾斯等同長度拆分。 –

+0

因此,現在我回到上面的代碼,它可以識別每組代碼字符並輸出相關的字母,只是不會遍歷字符串來產生一個字。這是我卡住的地方,這就是我所問的。我不相信就相同的材料提出單獨的問題是有益的,但我很欣賞這種迴應。 –

+0

@Stryke_the_Orc:我明白了。那麼,讓我們從你的算法開始吧。你可以將它添加到你的問題(用普通的僞代碼)嗎?然後,我們可以檢查它並確定它是否正確。如果不是這樣,所有試圖將其放入代碼的嘗試都是徒勞的。 – Heinzi