Từ 1 tới 3 trên tổng số 3 kết quả

Đề tài: Đọc chữ số trong Tiếng Việt

  1. #1
    Ngày gia nhập
    04 2010
    Nơi ở
    Thâm sơn cùng cốc
    Bài viết
    825

    Mặc định Đọc chữ số trong Tiếng Việt

    Có lẽ code về vấn đề Đọc một số thành Tiếng Việt cũng có khá nhiều tuy nhiên mình xong đóng góp một đoạn code mà mình cài đặt phục vụ cho việc trên, kèm theo đó đó một tiện lợi là "Nếu sử dụng trong tổng đài viễn thông thoại để đọc một số tiền, bạn có thể thay thế các chuỗi hằng cố định Một (Mot), Hai , Ba ..., Mươi (Mu*o*i) , Mười (Muoi), Mốt (Mo^'t), Le (Lẻ) .... bằng các đường path tới file âm thanh tương ứng để phát âm.
    Từ 0 ->9 : Cần 9 file
    Mươi, Mười, Mốt, Lẻ : Cần 4 file
    Nghìn, Triệu , Tỷ : Cần 3 file.

    Vậy bạn chỉ cần 16 file âm thanh là có thể đọc được các chữ số Tiếng Việt, đây là cách cài đặt dịch vụ đọc thông tin tài khoản (số tiền) của các nhà mạng.

    Code của mình hỗ trợ số long long int. Hiện tại đọc được cỡ 100 tỷ. Nếu to hơn sẽ crash do hàm wtoi của Compiler. Tuỳ vào compiler (x64,x32) của VS hay MinGW hay G++ mà các bạn phải set format cho số long long int tương ứng thì chương trình mới làm việc chuẩn xác được.

    Mình hiện tại biên dịch trên MinGW 32 bit (Win7-x64) nên chưa tối ưu format để có thể đọc được toàn bộ nội số với độ lớn long long int support. Mong các bạn nào có thời gian thì đóng góp thêm các format cho từng trình dịch.

    Thuật toán:
    1. Đặt tên số cần đọc là digits, đánh thứ tự chỉ số các chữ số trong số đã cho từ 0, chiều từ bên trái qua bên phải tăng dần.
    Ví dụ : digits = 1923 , thì chữ số '3' có chỉ số index=0 thì digits[0]='3' , chữ số digits[3] = '1' có chỉ số là 3.

    2. Đặt 2 mảng như sau:
    const char *Number[]={"Khong","Mot","Hai","Ba","Bon","Nam","Sau","Bay" ,"Tam","Chin"};
    const char *Level[]={NULL,"Nghin ","Trieu ","Ty "};

    3. Giả sử ta đọc chữ số ở vị trí index i:
    + Nếu (i+1)%3 == 0 : Chữ số ở vị trí i là chữ số hàng trăm, với ví dụ 1923 thì ta Digits[i=2] = '9' do đó sẽ đọc là Number[Digits[2]] Tram -> Ra xâu là Chin Tram
    + Nếu (i-1)%3 == 0 : Chữ số ở vị trí i là hàng chục:
    digits[i] == '1' : Đọc "Mười"
    digits[i] == '0' : Không đọc gì cả
    còn lại : Đọc Number[digits[i]] Với ví dụ trên i=1 thì digits[1] = '2' Đọc Number[2] Mươi -> Hai Mươi
    + Nếu (i%3)==0 : Thì đây là chữ số hàng đơn vị , digits[i] == '0' : Thì ko đọc gì cả, digits[i] =='1' thì xét thêm chữ số hàng chục để đọc là Một hoặc Mốt, các bạn xét thêm trường chữ số hàng trăm để biết có nên đọc Lẻ hay ko. Thêm vào đó Nếu (i>3) cách bạn phải đọc thêm mức level (Nghìn, Triệu hoặc Tỷ). Ví dụ nếu i=4 (i/3 ==1) khi đó đọc thêm Level[1] là Nghìn.

    Với thuật toán trên các bạn có thể đọc được số khá lớn phục vụ yêu cầu của các bạn.

    Hi vọng nhận được đóng góp và ý kiến của các bạn.
    Chúc các bạn 1 ngày vui vẻ và làm việc hiệu quả.


    C++ Code:
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <string.h>
    4.  
    5. void ReadNumber(long long number){
    6.     const char *Number[]={"Khong","Mot","Hai","Ba","Bon","Nam","Sau","Bay","Tam","Chin"};
    7.     const char *Level[]={NULL,"Nghin ","Trieu ","Ty "};
    8.     printf("%lld\n",number);
    9.     if (number<0) { printf("Am "); number =-number;}
    10.     if (number<10){
    11.         printf(Number[number]);
    12.         return;
    13.     }
    14.     char digits[100]={0};
    15.     sprintf(digits,"%lld",number);
    16.     int len = strlen(digits);
    17.     strrev(digits);
    18.     if (number<0) { printf("Am "); number = -number;}
    19.     for (int i=len-1;i>=0;i--){
    20.         // Doc chu so hang tram
    21.         if ((i+1)%3==0) printf("%s Tram ",Number[digits[i]-48]);
    22.         // Doc chu so hang chuc
    23.         if ((i-1)%3==0){
    24.             if (digits[i]=='1') printf("Muo`i ");
    25.             else if (digits[i]!='0') printf("%s Mu*o*i ",Number[digits[i]-48]);
    26.                 else if (digits[i-1]!='0') printf("Le ");
    27.         }
    28.         // Doc not hang don vi va cap
    29.         if ((i%3)==0){
    30.             if ((digits[i]=='1')&&(i+1<len)){
    31.                 if ((digits[i+1]!='0')&&(digits[i+1]!='1')) printf("Mo^'t ");
    32.                 else printf(Number[digits[i]-48]);
    33.             }
    34.             else
    35.                 if ((digits[i]!='0')&&(i<len)) printf("%s ",Number[digits[i]-48]);
    36.                 else  if ((digits[i]=='0')&&(i+1>len)) printf(Number[digits[i]-48]);
    37.             if (i>=3) printf("%s ",Level[i/3]);
    38.             int j = i-1;
    39.             // Nếu mọi chữ số phía sau là '0' thì kết thúc thuật toán
    40.             while (j>=0) if (digits[j]=='0') j--; else break;
    41.             if (j<0) i=j;
    42.         }
    43.     }
    44. }
    45.  
    46. int main()
    47. {
    48.     long long value;
    49.     for (int i=0;i<10;)
    50.     {
    51.         scanf("%lld",&value);
    52.         ReadNumber(value);
    53.         printf("\n");
    54.     }
    55.     return 0;
    56. }

  2. #2
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    ^
    Bị lặp code kìa bác, có hai đoạn kiểm tra số âm.
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  3. #3
    Ngày gia nhập
    04 2010
    Nơi ở
    Thâm sơn cùng cốc
    Bài viết
    825

    Copy lại từ trinh soạn thoả QT Creator nên dính duplicate . Nhưng ko sao vẫn chạy bt bạn à

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

  1. Trả lời: 0
    Bài viết cuối: 18-04-2012, 12:24 PM
  2. Dịch các bài hướng dẫn trong C# từ tiếng Việt sang tiếng Anh!!!
    Gửi bởi khoaimon trong diễn đàn English for IT | Tiếng anh cho dân CNTT
    Trả lời: 10
    Bài viết cuối: 06-01-2011, 11:27 AM
  3. Dịch tiếng Anh | Phương pháp dịch tiếng anh trong IT
    Gửi bởi annie trong diễn đàn English for IT | Tiếng anh cho dân CNTT
    Trả lời: 21
    Bài viết cuối: 13-08-2010, 12:47 AM
  4. Code chương trình giao tiếp giứa 2 tiến trình trong Windows
    Gửi bởi cutithongtin trong diễn đàn Thắc mắc chung
    Trả lời: 14
    Bài viết cuối: 19-04-2010, 08:51 AM
  5. Học tiếng Anh | Bí quyết trong học tiếng Anh.
    Gửi bởi Kevin Hoang trong diễn đàn English for IT | Tiếng anh cho dân CNTT
    Trả lời: 22
    Bài viết cuối: 13-04-2009, 08:26 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