Trang 1 trên tổng số 4 123... Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 33 kết quả

Đề tài: Đọc số thành chữ

  1. #1
    Ngày gia nhập
    08 2017
    Bài viết
    1,487

    Mặc định Đọc số thành chữ

    Thấy bên box c/c++ có đề tài Chuyển từ code C sang C#

    C++ Code:
    1. #define MXLEN 64
    2.  
    3. char *Doc3So(char *ds, int so, int truoc){ // truoc: số có phần đi trước nó hay không
    4.     char *doc[] = { "không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín" };
    5.     if (so == 0){
    6.         strcpy(ds, doc[0]);
    7.         return ds;
    8.     }
    9.     int donvi = so % 10;
    10.     int chuc = (so / 10) % 10;
    11.     int tram = (so / 100) % 10;
    12.     if (truoc != 0 || tram != 0){
    13.         strcat(strcpy(ds, doc[so / 100]), " trăm");
    14.         // tức là ds = doc[so / 100] + " trăm";
    15.         if (chuc == 0 && donvi != 0) strcat(ds, " lẻ");
    16.     }
    17.     if (chuc == 1) strcat(ds, " mười");
    18.     else if (chuc > 1) strcat(strcat(strcat(ds, " "), doc[chuc]), " mươi");
    19.                       // tức là x += " " + doc[chuc] + " mươi";
    20.     if (chuc != 0 && donvi == 5) strcat(ds, " lăm");
    21.     else if (donvi != 0) strcat(strcat(ds, " "), doc[donvi]);
    22.     return ds;
    23. }
    24. // hàm nhận số và ghi cách đọc vào chuỗi ds
    25. char *DocSo(char *ds, int so){
    26.     char *kh [] = { "", "ngàn", "triệu", "tỷ" }; // các khoản 3 chữ số
    27.     if (so == 0)
    28.         return Doc3So(ds, so, 0);
    29.     char d3s[MXLEN]; // chuỗi để đọc 3 chữ số
    30.     int kilo = 0; // hàng ngàn
    31.     while (so > 0){
    32.         Doc3So(d3s, so % 1000, so / 1000);
    33.         if (strlen(ds) == 0)
    34.             strcpy(ds, (strcmp(d3s,"không")) ? d3s : "chẵn");
    35.         else if (strcmp(d3s,"không") || strcmp(ds,"chẵn"))
    36.             strcpy(ds, strcat(strcat(strcat(strcat(d3s, " "), kh[kilo]), " "), ds));
    37.             // tức là ds = d3s + " " + kh[kilo] + " " + ds;
    38.         kilo++;
    39.         so /= 1000;
    40.     }
    41.     return ds;
    42. }

    trên là ý tưởng tốt. c/c++ là ngôn ngữ lõi của nhiều hệ điều hành, rất hữu hiệu.
    Vấn đề tôi muốn nói, muốn trao đổi ở đây hãy biến ý thưởng trên thành ứng dụng (có thể làm DLL) dùng trong ứng dụng c# : đọc số thành chữ, đúng tiếng Việt.

  2. #2
    Ngày gia nhập
    08 2017
    Bài viết
    1,487

    A. Phiên bản bốn chấm không dấu tiếng Việt.
    Code c++ biên dịch được (hết lỗi biên dịch)
    C++ Code:
    1. #include <stdio.h>
    2. #include <string.h>
    3.  
    4. #define MXLEN 64
    5.  
    6. char *Doc3So(char *ds, int so, int truoc) {
    7.     const char *doc[] = { "khong", "mot", "hai", "ba", "bon", "nam", "sau", "bay", "tam", "chin" };
    8.     if (so == 0){
    9.         strcpy(ds, doc[0]);
    10.         return ds;
    11.     }
    12.     int donvi = so % 10;
    13.     int chuc = (so / 10) % 10;
    14.     int tram = (so / 100) % 10;
    15.     if (truoc != 0 || tram != 0){
    16.         strcat(strcpy(ds, doc[so / 100]), " tram");
    17.         // tức là ds = doc[so / 100] + " trăm";
    18.         if (chuc == 0 && donvi != 0) strcat(ds, " lẻ");
    19.     }
    20.     if (chuc == 1) strcat(ds, " muoi");
    21.     else if (chuc > 1) strcat(strcat(strcat(ds, " "), doc[chuc]), " muoi");
    22.                       // tức là x += " " + doc[chuc] + " mươi";
    23.     if (chuc != 0 && donvi == 5) strcat(ds, " lăm");
    24.     else if (donvi != 0) strcat(strcat(ds, " "), doc[donvi]);
    25.     return ds;
    26. }
    27.  
    28. extern "C"{
    29.     __declspec(dllexport) char *DocSo(char *ds, int so){
    30.         const char *kh[] = {"", "ngan", "trieu", "ty"};
    31.         if (so == 0)
    32.             return Doc3So(ds, so, 0);
    33.         char d3s[MXLEN];
    34.         int kilo = 0;
    35.         while (so > 0){
    36.             Doc3So(d3s, so % 1000, so / 1000);
    37.             if (strlen(ds) == 0)
    38.                 strcpy(ds, (strcmp(d3s,"khong")) ? d3s : "chan");
    39.             else if (strcmp(d3s,"khong") || strcmp(ds,"chan"))
    40.                 strcpy(ds, strcat(strcat(strcat(strcat(d3s, " "), kh[kilo]), " "), ds));
    41.                 // tức là ds = d3s + " " + kh[kilo] + " " + ds;
    42.             kilo++;
    43.             so /= 1000;
    44.         }
    45.         return ds;
    46.     }
    47. }

    Test với c#, 2 TextBox (Input, Output), 1 Button để test
    Visual C# Code:
    1.         void button1_Click(object sender, EventArgs e) {
    2.             int num;
    3.             if(!int.TryParse(txNum.Text, out num)) num= 256;
    4.             //
    5.             StringBuilder sb = new StringBuilder(255);
    6.             txStr.Text = _DocSo(sb, num);
    7.         }
    8.         //
    9.         [DllImport("readNum2.dll")]
    10.         static extern string _DocSo(StringBuilder sb, int i);

    Ảnh minh họa:

  3. #3
    Ngày gia nhập
    08 2017
    Bài viết
    1,487

    B. Phiên bản 4. có dấu tiếng Việt
    C++ Code:
    1. #include <windows.h>
    2. //...
    3. wchar_t cc[255];
    4. int main(){
    5.     int num;
    6.     printf("input n = "); scanf("%d", &num);
    7.     wchar_t *kq = DocSo(cc, num);
    8.     //...
    9.     MessageBoxW(0, kq, L"Đọc số v4. có dấu Tiếng Việt", 0);
    10. }

  4. #4
    Ngày gia nhập
    08 2017
    Bài viết
    1,487

    Cứ từ từ, khi nào wưởng bàn tiếp

  5. #5
    Ngày gia nhập
    08 2017
    Bài viết
    1,487

    Một ngày không xa, ai đó đưa nó vào Lib 3th, hoặc tích hợp luôn vào NetFx hay OS.
    Hy vọng là thế, một ngày không xa...

  6. #6
    Ngày gia nhập
    08 2017
    Bài viết
    1,487

    Mặc định Đọc số thành chữ

    Trong khi chờ, bạn rảnh thì đọc Compile online
    Tôi sẽ trình bày rõ hơn vấn đề trên trong vài ngày tới.

  7. #7
    Ngày gia nhập
    08 2017
    Bài viết
    1,487

    Không có ai có nhu cầu sử dụng đọc số thành chữ sao ?

    Không biết hay không thèm xử dụng ?

  8. #8
    Ngày gia nhập
    08 2017
    Bài viết
    1,487

    Tiếng Việt mất giá, đợi cải cách ?

  9. #9
    Ngày gia nhập
    08 2017
    Bài viết
    1,487

    Không chỉ đọc bằng mắt, người ta đã cho máy tính, robot đọc bằng âm thanh.

    Bạn nào biết thư viện nào có thể đọc chữ thành âm thanh có thể nhúng vào CT, đưa vào ứng dụng không ?
    * Microsoft Speech
    * vnSpeech
    * Translate
    * ...

  10. #10
    Ngày gia nhập
    08 2017
    Bài viết
    1,487

    Nếu quan tâm đọc chữ (kể cả chữ Quốc ngữ) thành tiếng thì đọc :
    http://diendan.congdongcviet.com/threads/t401912::doc-chu-text-to-speech.cpp

    ...

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