添加了更改代码的第二个EDIT详细信息
我在输入单词OR句子时想要输出的字符串数组中有一个字母等效的数字代码。这是我的c ++代码。它得到用户输入和对于完整单词中的所有字母表的所有数字数字输出等效时间的蜂鸣声,如摩尔斯电码那样。基本上我需要这个用于我的嵌入式应用程序,但首先我想让它在典型的C中运行然后我将它移动到嵌入式应用程序。
目前它的作用类似于字母'i'具有数字代码24,当执行时& 'i'作为输入给出,它首先在INNER_LOOP的睡眠时间之间发出两次蜂鸣声,即450.然后它睡眠为OUTER_LOOP,即700,然后用INNER_LOOP睡眠时间发出4次蜂鸣声。所以有可能认识到它发出2次嘟嘟声,等等和然后发出4次嘟嘟声,即发送'24',这是'i'的代码。如果我输入'ii'它会做同样的两次,即在INNER_LOOP睡眠时间后第二个'i'开始发出蜂鸣声,所以代码看起来像2424.不可能认出它是24&它应该像前面描述的24读取一样工作,而不是一个looooong wait&因此,用户可以识别两个字母的代码,即'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;
}
答案 0 :(得分: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);
}
答案 1 :(得分: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);
答案 2 :(得分: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秒)(暂停)功能。