0

添加了更改代码的第二个编辑详细信息

我在输入单词或句子时想要输出的字符串数组中有一个字母等效数字代码。这是我的 C++ 代码。它让用户输入和输出一个哔哔声,以等效时间为一个完整单词中的所有字母表的所有数字数字,就像莫尔斯电码一样。基本上我的嵌入式应用程序需要这个,但首先我想让它在典型的 C 中工作,然后我将它移动到嵌入式。

目前它的工作方式就像字母'i'有数字代码24,当执行时&'i'作为输入,它会先发出两次哔哔声,睡眠时间在450之间,睡眠时间为INNER_LOOP。然后它睡眠OUTER_LOOP,即700,然后在 INNER_LOOP 睡眠时间发出 4 次哔声。因此可以识别它发出 2 次哔声,等待然后发出 4 次哔声,即传输“24”,即“i”的代码。如果我输入“ii”,它会执行两次相同的操作,即在 INNER_LOOP 睡眠时间之后第二次“i”开始发出哔哔声,因此代码看起来像 2424。无法识别它是 24 和再次 24。它应该像 24 一样工作,如前所述比 looooong 等待和 24 再次 raed,因此用户可以识别两个字母的代码,即“ii”或任何其他组合。

我希望它引入在同一单词的任何两个字母之间发生的 THIRD_SLEEP 时间,以便可以单独读取每个字母代码。目前它只在相同字母的数字代码之间。

到目前为止,这是我的代码:

#include <iostream>
#include <string>
#include <sstream>
#include <windows.h>

using namespace std;

string texttopattern(char c)
{
//Hello world again
//125-15-123-123-135 1346-135-1235-123-145 1-1245-1-24-1345

    string alphabet = "abcdefghijklmnopqrstuvwqyz"; //osv
    string code[] = {"1","12","14","145", "15", "124", "1245",
                      "125", "24", "245", "13", "123", "134",
                      "1345", "135", "1234", "12345", "1235", "234", "2345",
                      "136", "1236", "1346", "13456", "1356", "12346"};
    int index = alphabet.find(c);
    if(index!=-1)
        return code[index];
    else
        return " ";
}

int main()
{
    const int OUTER_SLEEP = 700,
              INNER_SLEEP = 450;
    int n;
    string ord;
    getline(cin, ord);
    string code="";
    for(int i=0; i<ord.length(); i++)
    {
        code += texttopattern(ord[i]);
    }

    for(int i = 0; i<code.length(); i++)
    {
        n = code[i] - '0';
        for(int j=0; j<n; j++)
        {
            cout<<'\a';
            Sleep(INNER_SLEEP);
        }
        Sleep(OUTER_SLEEP);
    }
    return 0;
}
4

3 回答 3

1

假设您的数组string code[]具有相应字母的哔声时间,并且您希望在处理每个字符后有很长的静态睡眠时间;您可以将恒定睡眠时间声明为:

const int STATIC_SLEEP = 2000;
const int STATIC_SLEEP_INNER = 2000;

你的代码可能是:

string str = "your string for morse code";
for(char ch: str)
{
    for(int i = 0; i<code[ch-'a']; i++)
    {
        cout<<'\a';
        Sleep(STATIC_SLEEP_INNER);
    }
Sleep(STATIC_SLEEP);
}
于 2013-09-10T10:33:58.890 回答
0

替换你的行:

 string code="";

vector<int> code;

所以你存储一个整数列表,而不是一个很大的整数表示字符串。

那是:

int main()
{
    int n;
    string ord;
    getline(cin, ord);
    std::vector<int> code;
    for(int i=0; i<ord.length(); i++)
    {
        code.push_back(atoi(texttopattern(ord[i])));
    }

    for(int i = 0; i<code.length(); i++){
        Sleep(600); //same sleep time for all alphabets of a word,  
                         //I want to add long sleep time before code for new 
                         //alphabets stats  

        Sleep(code[i]); // sleep for length of time according to code book
        // or Beep(code[i]); // if you want to Beep for the appropriate length
    }

    return 0;
}

请注意上面使用 atoi() 将 texttopattern() 转换为 int 以便 Sleep 可以接受它。如果字符串不是整数(例如“”),则 atoi 将返回 0(导致无睡眠)

我可能误解了你的问题。以前的解释是:

如果您没有字符到“睡眠时间”(或其他值)的映射,您可以这样做(假设全部小写):

#include <unistd.h>
// .. other setup stuff ...
int factor = 1;
for (int i=0; str[i] != 0; i++) {
    sleep( factor * ('z' - str[i]) );

也就是说,对于角色与角色“z”的任何位移,睡眠,在这种情况下,睡眠时间是该距离的 1 倍(以秒为单位)。例如,对于代码中的字符“y”,休眠 1 秒。对于字母“x”,睡眠 2 秒。

否则,您可以将输入字符的 std::map 设置为“睡眠时间”值。

如果您想在每个字符的哔声之间添加一个暂停,并且每个字符都被平等对待,也许:

void make_word_audible(const char *word) {
    int character_beep_len = 1;
    int charater_pause_beep_len = 2;
    int space_character_beep_len = 4;

    for (int i=0; str[i] != 0; i++) {
        if (str[i] == ' ') // space == long beep
            beep(space_character_beep_len);
        else
            beep('z' - str[i]);

        beep(space_character_beep_len);
    }
    // end of word:

}

如果以上都不是,请考虑将字符实际转换为摩尔斯电码,在其中您可以更改对哔声功能和睡眠(int seconds)(暂停)功能的输入。

于 2013-09-10T10:27:35.237 回答
0

您可以计算某个字符的 ASCII 等价物并将其传递给 Sleep 函数。例如 :

for(int i = 0; i<code.length(); i++){
          n = code[i] - '0';
            for(int i=0; i<n; i++){
              cout<<'\a';
              int ASCVal = code[i] - '0';
              int standardSleepTime = 600; // you can assign your standard sleep time here.
              Sleep(standardSleepTime);
              Sleep(ASCVal);//Now Sleep time for each character will be different

   }}

如果您认为此间隔较低,则可以将 ASCVal 乘以 10 以增加睡眠时间。您需要这样做 -

 int standardSleepTime = 600; // you can assign your standard sleep time here.
 Sleep(standardSleepTime);
 int ASCVal = ( (code[i]-'0') * 10);
 Sleep(ASCVal);
于 2013-09-10T09:21:03.790 回答