0

2回目の編集変更コードで追加された詳細

単語OR文が入力されたときに出力したい文字列の配列に、アルファベットに相当する数値コードがあります。これがそのための私のC++コードです。モールス符号のように、ユーザー入力を取得し、すべてのアルファベットのすべての数字に対して同等の時間ビープ音を出力します。基本的に、組み込みアプリケーションにはこれが必要ですが、まず典型的な C で動作させたいので、組み込みに移動します。

現在、たとえば、アルファベット「i」には数値コード 24 があり、実行時に「i」が入力として与えられると、最初にビープ音が 2 回鳴り、その間に INNER_LOOP のスリープ時間、つまり 450 が鳴ります。次に、OUTER_LOOP、つまり 700 の間スリープし、次にINNER_LOOP スリープ時間でビープ音が 4 回鳴ります。したがって、ビープ音が 2 回鳴り、待ってから 4 回ビープ音が鳴ることを認識することができます。つまり、「i」のコードである「24」を送信します。「ii」を 2 回入力すると、同じことが行われます。つまり、INNER_LOOP スリープ時間の後に 2 番目の「i」のビープ音が開始されるため、コードは 2424 のように表示されます。長い間待って 24 をもう一度 raed するよりも、ユーザーは 2 つのアルファベット、つまり「ii」またはその他の組み合わせのコードを認識できます。

各アルファベットコードを個別に読み取ることができるように、同じ単語の任意の 2 つのアルファベット間で発生する 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

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 秒) (一時停止) 関数に変更します。

于 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 に答える