2013-08-28 61 views
0

I have actually this code for an embedded application. I am 1st trying to make it for plain c++ so that I may have concept clearC++字母等效數字編碼輸出程序

我有一個數字代碼分配給每個英文字母。我希望我的程序輸出一個句子的等效數字代碼。循環實際上應該迭代句子代碼的每個數字的次數。 Bec我需要爲每個數字的嵌入式應用開啓/關閉引腳。我必須在兩個句子之間加上兩個字母之間的相同字母數字,&之間的時間差。第一,我想爲每個結果代碼的數字輸出簡單的輸出。

這是我的代碼。我已將字符串&分配給字符串數組類型。然後我從字符串數組&中搜索字符的等效數字代碼,將其保存爲字符串類型。現在我想將字符串中的每個數字分配給int &循環。但我在將字符串值分配給int時遇到問題。我沒有太多的C++編程經驗。

編輯 我有麻煩在將字符串轉換爲第一名爲int,&整體確實這種邏輯來解決我的問題似乎罰款。

這是我的代碼,這是我如何解決我的問題。

#include <iostream> 
    #include <string> 
    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() 
{ 
    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++) { 
      int n = code[i]; //assign a single digit value from string to an 
          //int,string2int assign value is problem here !! 
       while(n>0){ //loop for n times & manipulate PIN in each iteration 
       cout<<"loop"; 
       n--;  } 
     //cout<<code[i]<<endl; 
     } 

     return 0; 
} 
+0

而你的問題是......? –

+1

查看http://stackoverflow.com/questions/7663709/convert-string-to-int-c – nouney

+0

@MatsPetersson:將字符串賦給int並檢查我的整體邏輯以解決我的整個問題。我編輯了OP – enterprize

回答

0

這裏是我如何解決我的問題的代碼。感謝所有回覆的人,儘管我的回覆太複雜了。請看它&指出它的任何缺點,雖然它的輸出我正在尋找。

#include <iostream> 
#include <string> 
#include <sstream> 
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() 
{ 
    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 i=0; i<n; i++){ 
        cout<<"Here you go"<<"-"<<n<<endl;}} 

     return 0; 
     } 
0

我認爲你不應該使用一個名爲int變量,它是在C++的關鍵字和C

那麼至少你對while循環的錯誤。 while循環更改爲

 int j = code[i] - '0'; // this will get the number from the char 
     while(j>0){ 
      cout<<"loop"; 
      --j;  
     } 
+0

我只是例如把整數,因爲我有麻煩分配字符串谷值爲int,這也是我的問題的一部分 – enterprize

+0

@enterprize:你不能簡單地分配字符串值整數,或動物顏色。 C++有一個相當嚴格的類型系統。但是,有一個函數std :: stoi代表「String To Int」。 – MSalters

+0

@enterprize,如果我的理解是正確的,可以使用'int j = code [i] - '0';'從char中獲取數字。 –

0

編輯:在回答你的評論我現在已經回到了使用字符串作爲模式:

#define UNKNOWN_LETTER_PATTERN "" 

string texttopattern(char c) 
{ 
    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"}; 
    if (c >= 'a' && c <= 'z') 
     return code[c - 'a']; 
    else 
     return UNKNOWN_LETTER_PATTERN ; 
} 
main()

第一部分保持不變:

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

更新了其餘部分並添加了一些評論,希望能夠解釋我在做什麼:

// Loop patterns 
    for (vector<string>::iterator it = code.begin(); it != code.end(); it++) 
    { 
     if (*it == UNKNOWN_LETTER_PATTERN) 
     { 
      // Don't know what to do with unknown chars like spaces - your problem 
      cout << "unknown letter" << endl; 
     } 
     else 
     { 
      // Loop every digit in the current pattern 
      for (int i = 0; i < it->size(); i++) 
      { 
       char c = it->at(i); 

       // There surely is a better way to do the following, atoi or 
       // stringstream come to mind 
       // But for a single digit number, this should be enough for 
       // now to convert a char to a number. 
       int number = c - '0'; 

       // loop until number is reached 
       for (int j = 0; j < number; j++) 
        cout << "I"; 
       cout << endl; 
      } 
      cout << "End of letter" << endl; 
     } 
    } 

    cin.get(); 

    return 0; 
} 

編輯:我改變了上面的例子。它現在做的是,例如:輸入是'd' - >解析爲編碼「145」 - >循環每個數字並且轉到數字[1,4,5] - >打印'I'數字數字「I IIII IIIII」。重讀您的評論後,我相信這是你想要的。

+0

它正在引發錯誤,但在此之前它看起來這個代碼只是打印模式?這不是我所需要的,我的OP代碼在打印時沒問題,但我需要的是一個循環,用於迭代/輸出digit_pattern的每個數字,相當於每個數字,因爲我需要在我的嵌入式應用程序中使用ON/OFF引腳等效數字(例如對於24,重複2次然後4次,後來我加了延遲之間)。這就是爲什麼我需要代碼在int和我想/提到要在我的代碼中執行,得到字符串值在int&然後循環多times.So每個迭代/循環允許我用我的嵌入式應用程序的PIN做一些事情 – enterprize

+0

好吧,我完全誤解了你的問題。我會盡力把解決方案放在一起,或者至少是你的起點。 – Wutz

0

我真的希望我明白你的意思。 我試圖做一個程序,你表現出在這裏,我想出了這個:

Macros.h:

#ifndef MY_MACROS_H 
#define MY_MACROS_H 

#define VALUES(base)    \ 
       ADD_VALUE(0,base) \ 
       ADD_VALUE(1,base) \ 
       ADD_VALUE(2,base) \ 
       ADD_VALUE(3,base) \ 
       ADD_VALUE(4,base) \ 
       ADD_VALUE(5,base) \ 
       ADD_VALUE(6,base) \ 
       ADD_VALUE(7,base) \ 
       ADD_VALUE(8,base) \ 
       VALUE(9,base) 

#define VALUE(val,base) +1 

#define ADD_VALUE(val,base) VALUE(val, base) 


#define DIGIT_COUNT (0 VALUES(1)) 
#define BASE_COUNT (DIGIT_COUNT + 1) 

#define ALL_VALUES ADD_ARRAY_VALUES(1)         \ 
        ADD_ARRAY_VALUES(BASE_COUNT)       \ 
        ADD_ARRAY_VALUES(BASE_COUNT * BASE_COUNT)   \ 
        ARRAY_VALUES(BASE_COUNT * BASE_COUNT * BASE_COUNT) 

#define ARRAY_VALUES(rank) +1 

#define ADD_ARRAY_VALUES(rank) ARRAY_VALUES(rank) 

#define UNKNOWN_LETTER_PATTERN "" 
#define ARRAYS_COUNT (0 ALL_VALUES) 

#endif 

Header.h:

#ifndef _MY_HEADER_H 
#define _MY_HEADER_H 

/***** 
* Includes 
******/ 
#include <iostream> 
#include <string> 
#include <vector> 
#include "Macros.h" 

using namespace std; 

/***** 
* Definitions 
******/ 
#define FIRST_LETTER 'a' 
#define LAST_LETTER 'z' 

typedef unsigned char byte; 

typedef int NumberValueType; 

#define BASE_CHAR_VALUE '0' 

// character 
#define CHAR_TO_CHAR_INDEX(character) (character - FIRST_LETTER) 
#define CHAR_TO_NUM_INDEX(character) (character - BASE_CHAR_VALUE) 

#define IS_CHAR_VALID(character) ((character >= FIRST_LETTER) && (character <= LAST_LETTER)) 

int ParseInput(); 
string texttopattern(char c); 

#endif 

和實現文件:(當然,我也打印並沒有做任何重要的輸出)。

主。cpp:

#include "Header.h" 

int s_arValues[ARRAYS_COUNT][DIGIT_COUNT] = 
{ 
    #undef VALUE 
    #define VALUE(val,base) (base * val) 

    #undef ADD_VALUE 
    #define ADD_VALUE(val,base) VALUE(val, base), 

    #undef ARRAY_VALUES 
    #define ARRAY_VALUES(rank) { VALUES(rank) } 

    #undef ADD_ARRAY_VALUES 
    #define ADD_ARRAY_VALUES(rank) ARRAY_VALUES(rank), 

    ALL_VALUES 
}; 


string texttopattern(char c) 
{ 
    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"}; 
    if (IS_CHAR_VALID(c)) 
     return code[CHAR_TO_CHAR_INDEX(c)]; 
    else 
     return UNKNOWN_LETTER_PATTERN ; 
} 

int ParseInput() 
{ 
    string ord; 
    getline(cin, ord); 
    vector<string> code; 

    for(int i=0; i<ord.length(); i++) 
    { 
     code.push_back(texttopattern(tolower(ord[i]))); 
    } 

    // Loop inputs 
    for (vector<string>::iterator itInputs = code.begin(); itInputs != code.end(); itInputs++) 
    { 
     if (*itInputs == UNKNOWN_LETTER_PATTERN) 
     { 
      // Don't know what to do with unknown chars like spaces - your problem 
      cout << "unknown letter" << endl; 
      continue; 
     } 

     int number = 0; 
     int nInputSize = itInputs->size(); 

     // Loop every digit in the current pattern 
     for (int nDigitIndex = 0; nDigitIndex < nInputSize; nDigitIndex++) 
     { 
      if(nDigitIndex >= sizeof(NumberValueType)) 
      { 
       cout << number; 
       number = 0; 
       continue; 
      } 

      char cChar = itInputs->at(nDigitIndex); 

      number += s_arValues[nInputSize - nDigitIndex - 1][CHAR_TO_NUM_INDEX(cChar)]; 
     } 

     // At this point you can use number 
     cout << number; 
     cout << endl; 
     cout << "End of letter" << endl; 
    } 

    cin.get(); 

    return 0; 
} 

void main() 
{ 
    ParseInput(); 
}