Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 12 kết quả

Đề tài: Chuyển chữ thành mã Móc với lập trình C++

  1. #1
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định Chuyển chữ thành mã Móc với lập trình C++


    Đề bài :

    Mã Móc là 1 loại mã khá nổi tiếng dùng để encode được phát triển bởi Samuel Morse năm 1832. Mã code chỉ gồm những dấu . và - .
    Bãng mã
    Code:
    A
     .-
     N
     -.
     
    B
     -...
     O
     ---
     
    C
     -.-.
     P
     .--.
     
    D
     -..
     Q
     --.-
     
    E
     .
     R
     .-.
     
    F
     ..-.
     S
     ...
     
    G
     --.
     T
     -
     
    H
     ....
     U
     ..-
     
    I
     ..
     V
     ...-
     
    J
     .---
     W
     .--
     
    K
     -.-
     X
     -..-
     
    L
     .-..
     Y
     -.--
     
    M
     --
     Z
     --..
    Chữ số
    Code:
           
    1
     .----
     6
     -....
     
    2
     ..---
     7
     --...
     
    3
     ...--
     8
     ---..
     
    4
     ....-
     9
     ----.
     
    5
     .....
     0
     -----
    Viết 1 chương trình nhập vào 1 chuỗi sau đó chuyển thành mã Móc.


    Thấy bài này cũng thú vị mà không khó, post cho mọi người cũng làm nào hì hì !

  2. #2
    Ngày gia nhập
    12 2007
    Bài viết
    224

    Mặc định Chuyển chữ thành mã móc

    Em chẳng thấy bài này có quy luật gì cả nên làm đại như vậy . Mong rox_rook đừng chê nghen . ^^

    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<string.h>
    4. #include<math.h>
    5. #include<dos.h>
    6. #include<process.h>
    7. #include<alloc.h>
    8. #include<stdlib.h>
    9. #include<string.h>
    10. #include<ctype.h>
    11.  
    12. char s[50];
    13.  
    14. char *chu(char x);
    15. char *so(char x);
    16. char **ma_moc(char *s);
    17.  
    18. char *chu(char x)
    19. {
    20.   char *s;
    21.  
    22.   s=(char*)malloc(5*sizeof(char));
    23.  
    24.   if(x=='a') { s="._"; return s; }
    25.   if(x=='b') { s="_..."; return s; }
    26.   if(x=='c') { s="_._."; return s; }
    27.   if(x=='d') { s="_.."; return s; }
    28.   if(x=='e') { s="."; return s; }
    29.   if(x=='f') { s=".._."; return s; }
    30.   if(x=='g') { s="__."; return s; }
    31.   if(x=='h') { s="...."; return s; }
    32.   if(x=='i') { s=".."; return s; }
    33.   if(x=='j') { s=".___"; return s; }
    34.   if(x=='k') { s="_._"; return s; }
    35.   if(x=='l') { s="._.."; return s; }
    36.   if(x=='m') { s="__"; return s; }
    37.   if(x=='n') { s="_."; return s; }
    38.   if(x=='o') { s="___"; return s; }
    39.   if(x=='p') { s=".__."; return s; }
    40.   if(x=='q') { s="__._"; return s; }
    41.   if(x=='r') { s="._."; return s; }
    42.   if(x=='s') { s="..."; return s; }
    43.   if(x=='t') { s="_"; return s; }
    44.   if(x=='u') { s=".._"; return s; }
    45.   if(x=='v') { s="..._"; return s; }
    46.   if(x=='w') { s=".__"; return s; }
    47.   if(x=='x') { s="_.._"; return s; }
    48.   if(x=='y') { s="_.__"; return s; }
    49.   if(x=='z') { s="__.."; return s; }
    50. }
    51.  
    52. char *so(char x)
    53. {
    54.  char *s;
    55.  int i;
    56.  int so=x-48;
    57.  
    58.  s=(char*)malloc(6*sizeof(char));
    59.  
    60.  
    61.  s[0]=s[1]=s[2]=s[3]=s[4]='_';
    62.  s[5]=0;
    63.  
    64.  if(so==0) return s;
    65.  if(so>0&&so<6)
    66.  {
    67.   for(i=0;i<so;i++)
    68.   s[i]='.';
    69.   return s;
    70.  }
    71.  for(i=4;i>=so-6;i--)
    72.  s[i]='.';
    73.  return s;
    74. }
    75.  
    76. char **ma_moc(char *s)
    77. {
    78.  static char *a[50];
    79.  
    80.  for(int i=0;i<strlen(s);i++)
    81.  {
    82.   if(isalpha(s[i])) a[i]=chu(s[i]);
    83.   if(isdigit(s[i])) a[i]=so(s[i]);
    84.  }
    85.  
    86.  return a;
    87. }
    88.  
    89. void main()
    90. {
    91.  clrscr();
    92.  
    93.  char **a;
    94.  
    95.  printf("nhap chuoi:");
    96.  gets(s);
    97.  
    98.  a=ma_moc(s);
    99.  
    100.  for(int i=0;i<strlen(s);i++)
    101.  printf("%s ",*(a+i));
    102.  
    103.  getch();
    104. }

  3. #3
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Bravo Sieuphuong, T_T người đâu tiên. Mặc dù không rành cú pháp C cho lám nhưng đọc ý tưởng thấy sieuphuong giải cũng hay ghê T_T! Nói chứ mình cũng chưa giải hì hì, thấy 1 bài hay trong sách nên post lên cho mọi người cùng giải đó mà. Để tí mình giải thử xem đã hì hì.
    Em chẳng thấy bài này có quy luật gì cả nên làm đại như vậy . Mong rox_rook đừng chê nghen . ^^
    Ở đây quan niệm của mình là mình nghĩ post bài để học hỏi lẫn nhau thôi, ai giải mình cũng hoan nghênh hết, mình rất tôn trọng bất kì idea nào của tác giả, ai cũng có ý riêng cái hay của họ, nếu cách này tối ưu hơn cách kia thì chúng mình học hỏi lẫn nhau thôi, có lợi cho tất cả mọi người mà, chỉ cần chịu làm là được T_T.
    Thanks bài giải của sieuphong nhé hì hì !

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Hì hì, chắc ai cũng chán bài này rùi nhỉ T_T. Thôi mình post lời giải luôn đây, bài này mình dùng string cũng đơn giản như sau

    C++ Code:
    1. #include <iostream>
    2. #include <string>
    3. #include <cctype>
    4.  
    5. static const std::string characterSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
    6. static const std::string morseCodeSymbol[] =
    7.     {"._"     ,"_..."   ,"_._."    ,"_.."    ,"."      ,".._."    
    8.     ,"__."    ,"...."   ,".."      ,".___"   ,"_._"    ,"._.."    
    9.     ,"__"     ,"_."     ,"___"     ,".__."   ,"__._"   ,"._."
    10.     ,"..."    ,"_"      ,".._"     ,"..._"   ,".__"    ,"_.._"
    11.     ,"_.__"   ,"__.."   ,".____"   ,"..___"  ,"...__"  ,"...._"
    12.     ,"....."  ,"_...."  ,"__..."   ,"___.."  ,"____."  ,"_____"  };
    13.    
    14.  
    15. class MorseCodeSystem
    16. {
    17. private :
    18.     std::string stringCode;
    19. public :
    20.     //conversion constructor
    21.     MorseCodeSystem(std::string ss)
    22.     {
    23.         stringCode = ss;
    24.     }
    25.     friend std::istream &operator >> (std::istream &iss, MorseCodeSystem &rhs)
    26.     {
    27.         std::getline(iss, rhs.stringCode);
    28.         return iss;
    29.     }
    30.     void EncodeStringToMorseSymbol();
    31. };
    32.  
    33. inline void MorseCodeSystem::EncodeStringToMorseSymbol()
    34. {
    35.     char character;
    36.     std::string ss = "";
    37.     for(int x = 0; x <= stringCode.length() - 1; x++)
    38.     {  
    39.         for(int y = 0; y <= 35; y++)
    40.         {
    41.             character = toupper(stringCode[x]);
    42.             if(character == characterSet[y])
    43.             {
    44.                 ss += morseCodeSymbol[y];
    45.                 ss += "|";
    46.             }
    47.         }
    48.     }
    49.     std::cout << ss;
    50. }
    51.  
    52. int main()
    53. {
    54.     MorseCodeSystem my_string("ABC");
    55.     my_string.EncodeStringToMorseSymbol();
    56.     return 0;
    57. }

    Và mình cũng tham khảo được 1 bài của bạn _cal bên diendantinhoc giải bài này bằng map của STL cũng rất hay, nhưng chắc không phải là newbie T_T, mình cũng post cho mấy bạn tham khảo luôn :

    C++ Code:
    1. #include <iostream>
    2. #include <string>
    3. #include <map>
    4. using namespace std;
    5.  
    6. class Morse
    7. {
    8. private:
    9.     map<char, string> codeTable;
    10.     map<string, char> decodeTable;
    11.  
    12. public:
    13.     Morse() {
    14.         CreateCodeTables();
    15.     }
    16.  
    17.     string Coding(string &s) {
    18.         string sRet = "";
    19.         for (int i=0; i<s.length(); i++)
    20.             sRet = sRet + codeTable[ s[i] ] + " ";
    21.         return sRet;
    22.     }
    23.  
    24.     string Decoding(string &s) {
    25.         string sRet = "";
    26.        
    27.         char* str = new char[s.length() + 1];
    28.         strcpy(str, s.c_str());
    29.        
    30.         char* p = strtok(str, " ");
    31.         while (p != NULL) {
    32.             sRet.push_back(decodeTable[string(p)]);
    33.             p = strtok(NULL, " ");
    34.         }
    35.         return sRet;
    36.     }
    37.  
    38. private:
    39.     void CreateCodeTables() {
    40.         const string LETTERS[26] = {
    41.             ".-"    , "-...", "-.-.", "-.."    , ".",
    42.             "..-."    ,"--."    , "....", ".."    ,".---",
    43.             "-.-"    , ".-..", "--"    , "-."    , "---",
    44.             ".--."    , "--.-", ".-."    , "..."    , "-",
    45.             "..-"    , "...-", ".--", "-..-", "-.--", "--.." };
    46.         const string NUMS[10] = {
    47.             "-----"    ,".----","..---" ,"...--","....-",
    48.             "....."    ,"-....","--..." ,"---..","----." };
    49.  
    50.         for (int i=0; i<10; i++) {
    51.             codeTable['0' + i] = NUMS[i];
    52.             decodeTable[ NUMS[i] ] = '0' + i;
    53.         }
    54.         for (int i=0; i<26; i++) {
    55.             codeTable['a' + i] = LETTERS[i];
    56.             codeTable['A' + i] = LETTERS[i];
    57.             decodeTable[ LETTERS[i] ] = 'A' + i;
    58.         }
    59.         codeTable[32] = "/";
    60.         decodeTable["/"] = 32;
    61.     }
    62. };
    63.  
    64. int main()
    65. {
    66.     Morse morse;
    67.     string s = "ao thu lanh leo nuoc trong veo";
    68.     string s1 = morse.Coding(s);
    69.     string s2 = morse.Decoding(s1);
    70.     cout << s1 << endl;
    71.     cout << s2 << endl;
    72.     return 0;
    73. }

  5. #5
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Đoạn code của rr hay lắm, nhanh hơn cách dùng map. Nhưng rr thử optimize với 2 cách sau:
    1. Đưa toupper ra ngoài vòng for (y = xxx..
    2. Không dùng vòng for y bằng cách tạo mãng phụ 0..125, chỉ có giá trị morse string cho 'A'..'Z', 0..9

  6. #6
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định Chuyển chữ thành mã Móc với lập trình C++

    Mặc dù thread này chắc cũng đã lâu, em cũng cám ơn anh nhiều ^_^. Làm theo ý anh, em viết lại như sau :
    C++ Code:
    1. #include <iostream>
    2. #include <string>
    3. #include <cctype>
    4.  
    5. using namespace std;
    6.  
    7. static const string characterSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
    8. static const string morseCodeSymbol[ ] =
    9. {
    10.     "._"     ,"_..."   ,"_._."    ,"_.."    ,"."      ,".._."    
    11.     ,"__."    ,"...."   ,".."      ,".___"   ,"_._"    ,"._.."    
    12.     ,"__"     ,"_."     ,"___"     ,".__."   ,"__._"   ,"._."
    13.     ,"..."    ,"_"      ,".._"     ,"..._"   ,".__"    ,"_.._"  
    14.     ,"_.__"   ,"__.."   ,".____"   ,"..___"  ,"...__"  ,"...._"
    15.     ,"....."  ,"_...."  ,"__..."   ,"___.."  ,"____."  ,"_____"  
    16. };
    17.  
    18.  
    19.  
    20. class MorseCodeSystem
    21. {
    22. private :
    23.     string stringCode;
    24.  
    25. public :
    26.     //conversion constructor
    27.     MorseCodeSystem( string sc )
    28.         :stringCode( sc )
    29.     {
    30.         // empty body
    31.     }
    32.  
    33. public :
    34.     friend
    35.     istream& operator >>( istream& in, MorseCodeSystem& rhs )
    36.     {
    37.         getline( in, rhs.stringCode );
    38.         return in;
    39.     }
    40.  
    41.     string EncodeStringToMorseSymbol()
    42.     {
    43.         int* MCA = new int[ 128 ]; // morse code array
    44.  
    45.         MCA[ 'A' ] = 0;  MCA[ 'N' ] = 13;  MCA[ '1' ] = 26;
    46.         MCA[ 'B' ] = 1;  MCA[ 'O' ] = 14;  MCA[ '2' ] = 27;
    47.         MCA[ 'C' ] = 2;  MCA[ 'P' ] = 15;  MCA[ '3' ] = 28;
    48.         MCA[ 'D' ] = 3;  MCA[ 'Q' ] = 16;  MCA[ '4' ] = 29;
    49.         MCA[ 'E' ] = 4;  MCA[ 'R' ] = 17;  MCA[ '5' ] = 30;
    50.         MCA[ 'F' ] = 5;  MCA[ 'S' ] = 18;  MCA[ '6' ] = 31;
    51.         MCA[ 'G' ] = 6;  MCA[ 'T' ] = 19;  MCA[ '7' ] = 32;
    52.         MCA[ 'H' ] = 7;  MCA[ 'U' ] = 20;  MCA[ '8' ] = 33;
    53.         MCA[ 'I' ] = 8;  MCA[ 'V' ] = 21;  MCA[ '9' ] = 34;
    54.         MCA[ 'J' ] = 9;  MCA[ 'W' ] = 22;  MCA[ '0' ] = 35;
    55.         MCA[ 'K' ] = 10; MCA[ 'X' ] = 23;
    56.         MCA[ 'L' ] = 11; MCA[ 'Y' ] = 24;
    57.         MCA[ 'M' ] = 12; MCA[ 'Z' ] = 25;
    58.  
    59.         string result;
    60.         for( string::const_iterator i = stringCode.begin( ), iend = stringCode.end( ); i != iend; ++i )
    61.         {    
    62.             result += morseCodeSymbol[ MCA[ toupper( *i ) ] ] + "|";
    63.         }
    64.  
    65.         delete[ ] MCA;
    66.         return result;
    67.     }
    68. };
    69.  
    70. int main()
    71. {
    72.     MorseCodeSystem mcs( "ABC" );
    73.     cout << mcs.EncodeStringToMorseSymbol( ) << endl;
    74.  
    75.     return 0;
    76. }

  7. #7
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,006

    bài này hay và có ý nghĩa , mạn phép R_R và các bạn move vô box hướng dẫn nha, để các bạn có quan tâm đến mã Móc tiện tham khảo
    ^_,^

    Tổng hợp các câu chuyện hài hước vui nhộn, sử dụng Speech Synthesis để đọc : https://www.youtube.com/channel/UCLk...Tjrg/playlists


    Bùi Tấn Quang

  8. #8
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Quá hay, good code RR. Em code còn tốt hơn anh nữa.
    Nhưng anh vẫn chưa vừa ý lắm (code reviewer, ông già khó khăn mà) vì mỗi khi gọi hàm EncodeStringToMorseSymbol, array MCA của em phải tạo lại, tạo sao không đưa nó vào constructor luôn ha ?

  9. #9
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    ^_^, hôm đó thật sự em cũng hơi lười vì mới đi làm về, em sẽ rút kinh nghiệm chỗ này vì không code thôi chứ code thì phải code cho hết mình T_T ! Em sorry anh. Em chuyển string thành char* để giảm kích thước chương trình đi một tí. Thằng morseCodeSymbol thì em đã chuyển nó sang char* [] tuy vậy lúc dùng
    result += morseCodeSymbol + "const char*"
    thì phải viết tách ra làm 2 expersion, thay vì một dòng như trên. Nhưng vì em nghĩ 1 dòng tiện hơn vì ít phải gọi copy constructor của string hơn nên em đã để như vậy. Vì em tính :
    - Cách 1 dòng : copy operator + của string gọi, conversion constructor của string gọi trả về string object sau cùng là thằng operator += gọi.
    - Cách 2 dòng : operator += gọi, conversion của string gọi, operator += gọi, conversion string gọi.
    Thằng "2 dòng" tính chung em thấy 4 lần so với 3 lần của thằng "1 dòng", nên em giữ lại thằng stringCodeSymbol là std::string ^^ ! Nhưng có lẽ nó còn nhiều thằng khác gọi trong đó nữa mà em chưa tính đến và điểm thiệt thứ hai nữa là ta phải trả giá cho kích thước của một object string.
    Tuy vậy điều quan trọng nhất khi em quyết định để thằng stringCodeSymbol là std::string vì khi em muốn catch exception hay debug cũng dễ hơn, vì ít nhất thằng at() method của nó có exception out_of_range.
    Một version viết kĩ hơn, nếu còn chỗ nào anh chưa vừa ý thì anh cứ nói với em nhé
    C++ Code:
    1. #include <iostream>
    2. #include <string>
    3. #include <cctype>
    4.  
    5. using namespace std;
    6.  
    7. static const string morseCodeSymbol[ ] =
    8. {
    9.     "._"     ,"_..."   ,"_._."    ,"_.."    ,"."      ,".._."    
    10.     ,"__."    ,"...."   ,".."      ,".___"   ,"_._"    ,"._.."    
    11.     ,"__"     ,"_."     ,"___"     ,".__."   ,"__._"   ,"._."
    12.     ,"..."    ,"_"      ,".._"     ,"..._"   ,".__"    ,"_.._"  
    13.     ,"_.__"   ,"__.."   ,".____"   ,"..___"  ,"...__"  ,"...._"
    14.     ,"....."  ,"_...."  ,"__..."   ,"___.."  ,"____."  ,"_____"  
    15. };
    16.  
    17.  
    18.  
    19. class MorseCodeSystem
    20. {
    21. private :
    22.     char* string_code;
    23.     int* morse_code_array;
    24.  
    25. private :
    26.     MorseCodeSystem( const MorseCodeSystem& rhs )
    27.     {
    28.  
    29.     }
    30.  
    31.     MorseCodeSystem& operator=( const MorseCodeSystem& rhs )
    32.     {
    33.  
    34.     }
    35.  
    36. public :
    37.     MorseCodeSystem( const char* sc )
    38.         : string_code( new char[ strlen( sc ) + 1 ] ),
    39.           morse_code_array( new int[ 128 ] )
    40.     {
    41.         morse_code_array[ 'A' ] = 0;  morse_code_array[ 'N' ] = 13;  morse_code_array[ '1' ] = 26;
    42.         morse_code_array[ 'B' ] = 1;  morse_code_array[ 'O' ] = 14;  morse_code_array[ '2' ] = 27;
    43.         morse_code_array[ 'C' ] = 2;  morse_code_array[ 'P' ] = 15;  morse_code_array[ '3' ] = 28;
    44.         morse_code_array[ 'D' ] = 3;  morse_code_array[ 'Q' ] = 16;  morse_code_array[ '4' ] = 29;
    45.         morse_code_array[ 'E' ] = 4;  morse_code_array[ 'R' ] = 17;  morse_code_array[ '5' ] = 30;
    46.         morse_code_array[ 'F' ] = 5;  morse_code_array[ 'S' ] = 18;  morse_code_array[ '6' ] = 31;
    47.         morse_code_array[ 'G' ] = 6;  morse_code_array[ 'T' ] = 19;  morse_code_array[ '7' ] = 32;
    48.         morse_code_array[ 'H' ] = 7;  morse_code_array[ 'U' ] = 20;  morse_code_array[ '8' ] = 33;
    49.         morse_code_array[ 'I' ] = 8;  morse_code_array[ 'V' ] = 21;  morse_code_array[ '9' ] = 34;
    50.         morse_code_array[ 'J' ] = 9;  morse_code_array[ 'W' ] = 22;  morse_code_array[ '0' ] = 35;
    51.         morse_code_array[ 'K' ] = 10; morse_code_array[ 'X' ] = 23;
    52.         morse_code_array[ 'L' ] = 11; morse_code_array[ 'Y' ] = 24;
    53.         morse_code_array[ 'M' ] = 12; morse_code_array[ 'Z' ] = 25;
    54.  
    55.         int i( 0 );
    56.         for( const char* p = sc; *p != '\0'; ++p ) 
    57.             *( string_code + i++ ) = *p;
    58.  
    59.         *( string_code + i ) = '\0';
    60.     }
    61.  
    62.  
    63.     ~MorseCodeSystem( )
    64.     {
    65.         if( string_code != NULL )
    66.             delete[ ] string_code;
    67.         if( morse_code_array != NULL )
    68.             delete[ ] morse_code_array;
    69.     }
    70.  
    71. public :
    72.  
    73.     string EncodeStringToMorseSymbol() const
    74.     {
    75.         string result;
    76.         for( char* p = string_code; *p != '\0'; ++p )
    77.         {    
    78.             result += morseCodeSymbol[ morse_code_array[ toupper( *p ) ] ] + "|";
    79.         }
    80.         return result;
    81.     }
    82.    
    83. };
    84.  
    85. int main()
    86. {
    87.     MorseCodeSystem mcs( "ABC" );
    88.     cout << mcs.EncodeStringToMorseSymbol( ) << endl;
    89.  
    90.     return 0;
    91. }

  10. #10
    Ngày gia nhập
    09 2006
    Bài viết
    711

    OK, vậy là quá tốt rồi. C++ & OOP thì phải chịu thôi, kích thước và speed phải hy sinh một chút cho portable, reuse...
    Mạn phép cho tui ra một bài tập cho các cậu có nhu cầu về morse code. Từ code trên của RR, các bạn hãy viết lại thành 1 hàm C, 1 hàm duy nhất, có prototype như sau:
    C++ Code:
    1. int EncodeStringToMorseSymbol(const char *pszText, char *pszMorse, size_t cbSize);
    Hàm này sẽ return số ký tự trong pszText đã convert sang morse code, pszMorse sẽ nhận morse code trả về, cbSize là size của buffer pszMorse.
    Prototype này các bạn thường gặp trong Win API.

Các đề tài tương tự

  1. Áp dụng máy móc.
    Gửi bởi vietsnets2 trong diễn đàn Giải trí - Thư giãn
    Trả lời: 0
    Bài viết cuối: 07-09-2011, 04:50 PM
  2. Phản hồi Một số MOD hay MANAGER làm việc quá máy móc
    Gửi bởi luxubu trong diễn đàn Ý kiến, đề xuất và khiếu nại
    Trả lời: 3
    Bài viết cuối: 21-11-2010, 06:39 PM
  3. Mã nguồn C Source danh sách móc nối đơn
    Gửi bởi onminh trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 08-05-2010, 12:31 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn