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ố 14 kết quả

Đề tài: Mô tả đọc số tự nhiên, số thực bằng chữ tiếng việt

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

    Mặc định Mô tả đọc số tự nhiên, số thực bằng chữ tiếng việt

    Đi dạo 1 vòng thấy C việt mình chưa có topic nào về vấn đề này chất lượng nên mình post 1 bài, hi vọng ai gặp vấn đề này lên google sẽ ra C việt

    Vấn đề như sau : viết 1 chương trình đầu vào là 1 số nguyên, hoặc 1 số thực và xuất ra đoạn chữ tiếng việt (có dấu hoặc không dấu) cách đọc của số đó.
    ví dụ :
    + nhập vào 11 xuất ra "mười một"
    + nhập vào 10 xuất ra "mười"
    + nhập vào 21 xuất ra "hai mươi mốt"
    + nhập vào 33 xuất ra "ba mươi ba"
    + nhập vào 35 xuất ra "ba mươi lăm"
    + nhập vào 1.000.050 xuất ra "một triệu không trăm năm mươi"
    + nhập vào 1000051 xuất ra "một triệu không trăm năm mươi mốt"
    + nhập vào 3,3 xuất ra "ba phẩy ba"

    Yêu cầu:
    + Chạy đúng! (7 điểm)

    Nâng cao
    + Xử lý số siêu lớn (nhập vào một trăm chữ số mà bắt đầu bằng 2 sẽ đọc là "xấp xỉ hai nhân mười mũ 99") (1 điểm)
    + Có khả năng chuyển đổi giữa '.' và ',' (1 điểm)
    + Tối ưu về tốc độ và bộ nhớ (1 điểm)



    P/S :
    + Đây là 1 bài vui, các bạn tham gia sẽ ko được gì ngoài vui cả
    + Mình sẽ chấm điểm, góp ý, và ném đá, để giúp các bạn nâng cao tay nghề code
    (bạn nào ko muồn nghe thì cho mình xin lỗi nhé, mình ko có ý xấu hay ý chê bai gì các bạn, chỉ là đóng góp ý kiến thôi)
    + Mình còn non tay, nên trong quá trình làm việc, có gì sai mong được mọi người chỉ giúp mình
    (mình ko có ý múa rìu qua mắt thợ đâu ạ, mong các cao nhân đừng )
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

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

    Bài này hay . Tuy vậy chưa làm bao giờ, vì ngày xưa ko ai yêu cầu . ủng hộ các bạn thử sức ( ko biết có bị mod xóa bài vì spam ko )

    Ps ( PX lừa tình cái đoạn Ps của PX ) )
    Em có thấy nắng vàng kỷ niệm
    Hạ ngồi ru thanh thản những môi cười
    Thuở ngồi ngóng tay choàng tay nỗi nhớ
    Vin tay vào tháng năm chơi vơi...

  3. #3
    Ngày gia nhập
    11 2012
    Bài viết
    136

    Có lẽ cái này chắc em lại để suy nghĩ dài dài chứ không phải switch case và mảng kí tự là không thể nào mà xong được, có nhiều bài này trong diễn đàn rồi nhưng đúng như anh nói chưa có một bài nào thật sự hoàn hảo, em đang hình dung tới bài toán điển hình trong việc phần tích từ vựng và cú pháp của lệnh trong môn trình biên dịch mà em đang tự mò . Thôi cứ để đã vậy web, java ,nhập môn công nghệ phần mềm, csdl cái gì cũng bài tập lớn lú loạn rồi anh ạ.
    Giao lưu và học hỏi
    https://www.facebook.com/kimcy1992

  4. #4
    Ngày gia nhập
    11 2010
    Bài viết
    8

    kaka, cái này hồi xưa em cũng thử làm nhưng đến đoạn một nghìn không trăm .... là bó tay rồi, k biết giờ có làm được không?

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

    Trích dẫn Nguyên bản được gửi bởi kimcy1992 Xem bài viết
    Có lẽ cái này chắc em lại để suy nghĩ dài dài chứ không phải switch case và mảng kí tự là không thể nào mà xong được, có nhiều bài này trong diễn đàn rồi nhưng đúng như anh nói chưa có một bài nào thật sự hoàn hảo, em đang hình dung tới bài toán điển hình trong việc phần tích từ vựng và cú pháp của lệnh trong môn trình biên dịch mà em đang tự mò . Thôi cứ để đã vậy web, java ,nhập môn công nghệ phần mềm, csdl cái gì cũng bài tập lớn lú loạn rồi anh ạ.


    bài này là bài toán khá kinh điển mà,
    nghe thì dễ nhưng ko ngon ăn
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

  6. #6
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Mặc định Mô tả đọc số tự nhiên, số thực bằng chữ tiếng việt

    Cho hỏi vài câu:
    - Những số như: 1.000.003.102; 1,0000012345 thì nên đọc như thế nào ?
    - Thế nào là "chuyển đổi giữa . và ," ?
    - Có được sử dụng thư viện ngoài (thư viện header thôi, không phải link với cái gì hết) ?

    Trích dẫn Nguyên bản được gửi bởi kimcy1992 Xem bài viết
    Có lẽ cái này chắc em lại để suy nghĩ dài dài chứ không phải switch case và mảng kí tự là không thể nào mà xong được, có nhiều bài này trong diễn đàn rồi nhưng đúng như anh nói chưa có một bài nào thật sự hoàn hảo, em đang hình dung tới bài toán điển hình trong việc phần tích từ vựng và cú pháp của lệnh trong môn trình biên dịch mà em đang tự mò . Thôi cứ để đã vậy web, java ,nhập môn công nghệ phần mềm, csdl cái gì cũng bài tập lớn lú loạn rồi anh ạ.
    Ý kiến rất hay. Mình sẽ làm theo hướng này.

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

    Trích dẫn Nguyên bản được gửi bởi boss14420 Xem bài viết
    Cho hỏi vài câu:
    - Những số như: 1.000.003.102; 1,0000012345 thì nên đọc như thế nào ?
    - Thế nào là "chuyển đổi giữa . và ," ?
    - Có được sử dụng thư viện ngoài (thư viện header thôi, không phải link với cái gì hết) ?



    Ý kiến rất hay. Mình sẽ làm theo hướng này.
    @boss14420 :
    Dear boss14420
    + đối với số lớn tầm đó ta lên xây dựng đọc là 1.000.003.102 "khoảng hơn một tỷ" hoặc "xấp xỉ một tỷ"
    đối với 1,0000012345 ta nên đọc dạng "hơn một" hoặc "một và một phần mười mũ sáu"

    + chuyển đổi giữa chấm và phẩy là do châu á và châu âu có quy định khác nhau về chấm và phẩy (ngược nhau)

    + mình cũng nghĩ ko nên sử dụng thư viện ngoài để code portable nhất, sau này sẽ move các code của các bạn vào mục Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x để lưu trữ


    P/S : Mình đang định gom sức cùng các bạn xây dựng kho source code của C Việt thành 1 kho hữu ích và "Việt Nam" hơn.
    Mình rất muốn xây 1 kho các source code về các vấn đề "Việt Nam" như :
    + các vấn đề về Lịch việt
    + các vấn đề về ngôn ngữ Việt
    + các vấn đề về tiếng Việt
    (hiện tại mình đanh dành free time để phát triển 1 bộ kiểm tra lỗi chính tả tiếng Việt)
    .......................................


    (Mong các bạn cùng mình vì 1 cộng đồng công nghệ Việt vững mạnh hơn)
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

  8. #8
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Trích dẫn Nguyên bản được gửi bởi langman Xem bài viết
    @boss14420 :
    Dear boss14420
    + đối với số lớn tầm đó ta lên xây dựng đọc là 1.000.003.102 "khoảng hơn một tỷ" hoặc "xấp xỉ một tỷ"
    đối với 1,0000012345 ta nên đọc dạng "hơn một" hoặc "một và một phần mười mũ sáu"
    Theo mình thì dưới 1000 tỷ, 6 chữ số phần thập phân trở xuống thì nên đọc đầy đủ. Có lẽ 2 ví dụ kia chưa rõ ràng lắm, hỏi lại vậy:
    - Những số mà có hàng chục bằng 0, hàng đơn vị khác 0 (VD 102) thì đọc thế nào ?
    - Nếu cả hàng chục và hàng trăm đều bằng 0 thì đọc thể nào (VD 1002) ?
    - Phần thập phân nhiều số (1,01234) thì nên đọc thế nào ?

    Trích dẫn Nguyên bản được gửi bởi langman Xem bài viết
    + chuyển đổi giữa chấm và phẩy là do châu á và châu âu có quy định khác nhau về chấm và phẩy (ngược nhau)
    Chuyển đổi ở đây là tự phát hiện và chuyển đổi hay chế độ do người dùng chỉ định ? Nếu là để tự phát hiện thì sẽ có nhiều trường hợp mơ hồ, như số 1,003 không biết nên theo chế độ nào.

    Trích dẫn Nguyên bản được gửi bởi langman Xem bài viết
    + mình cũng nghĩ ko nên sử dụng thư viện ngoài để code portable nhất, sau này sẽ move các code của các bạn vào mục Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x để lưu trữ
    Định dùng Boost.Spirit, cái này chắc cũng khá là portable.

  9. #9
    Ngày gia nhập
    02 2012
    Nơi ở
    hà nội
    Bài viết
    58

    a e vào chém xem bài này e làm thủ công no thế nào nhé. mih chưa đọc đc số có dấu phẩy.

    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<stdlib.h>
    4. #include<string.h>
    5. #define MAX 200
    6. #define ENTER 13
    7. void start(char so[],int *n)
    8. {
    9.      int i=0;
    10.      printf("Nhap vao 1 so, go ENTER de ket thuc: ");
    11.      do{
    12.         do{
    13.            so[i]=getch();
    14.            if(so[i]==ENTER){
    15.                             so[i]='\0';
    16.                             break;
    17.            }
    18.         }
    19.         while((so[i]<48)||(so[i]>57));
    20.         printf("%c",so[i]);
    21.         i++;
    22.         if(i>=MAX){
    23.                    i++;
    24.                    break;
    25.         }
    26.      }while(so[i-1]!='\0'&&so[0]!=48);
    27.      so[i]='\0';
    28.      *n=i-1;
    29. }
    30. void docSo(char a)
    31. {
    32.      char *s[]={"khong","mot","hai","ba","bon","nam","sau","bay","tam","chin"};
    33.      printf(s[a-48]);
    34. }
    35. void docSo(char a,char b)
    36. {
    37.      char *s[]={"khong","mot","hai","ba","bon","nam","sau","bay","tam","chin"};
    38.      if(a==49)
    39.      {
    40.                 if(b==48) printf("muoi");
    41.                 else{
    42.                      printf("muoi %s",s[b-48]);
    43.                 }
    44.      }
    45.      else{
    46.           if(b==48) printf("%s muoi",s[a-48]);
    47.           else{
    48.           printf("%s muoi %s",s[a-48],s[b-48]);
    49.           }
    50.      }
    51. }
    52. void docSo(char a,char b,char c)
    53. {
    54.      char *s[]={"khong","mot","hai","ba","bon","nam","sau","bay","tam","chin"};
    55.      char *s1[]={"linh","muoi","tram"};
    56.      if(b==48&&c==48) printf("%s tram",s[a-48]);
    57.      else
    58.      {
    59.           if(b==48) printf("%s tram linh %s",s[a-48],s[c-48]);
    60.           else{
    61.                printf("%s tram ",s[a-48]); docSo(b,c);
    62.           }
    63.      }
    64. }
    65. void docSo(char a[],int n)
    66. {
    67.      switch(n)
    68.      {
    69.               case 1 :
    70.                    docSo(a[0]);
    71.                    break;
    72.               case 2 :
    73.                    docSo(a[0],a[1]);
    74.                    break;
    75.               case 3 :
    76.                    docSo(a[0],a[1],a[2]);
    77.                    break;
    78.               case 4 :
    79.                    docSo(a[0]);
    80.                    printf(" nghin ");
    81.                    if(!(a[1]==48&&a[2]==48&&a[3]==48))
    82.                    docSo(a[1],a[2],a[3]);
    83.                    break;
    84.               case 5 :
    85.                    docSo(a[0],a[1]);
    86.                    printf(" nghin ");
    87.                    if(!(a[2]==48&&a[3]==48&&a[4]==48))
    88.                    docSo(a[2],a[3],a[4]);
    89.                    break;
    90.               case 6 :
    91.                    docSo(a[0],a[1],a[2]);
    92.                    printf(" nghin ");
    93.                    if(!(a[3]==48&&a[4]==48&&a[5]==48))
    94.                    docSo(a[3],a[4],a[5]);
    95.                    break;
    96.               case 7 :
    97.                    docSo(a[0]);
    98.                    printf(" trieu ");
    99.                    if(!(a[1]==48&&a[2]==48&&a[3]==48)){
    100.                                              docSo(a[1],a[2],a[3]);
    101.                                              printf(" nghin ");
    102.                    }
    103.                    if(!(a[4]==48&&a[5]==48&&a[6]==48))
    104.                    docSo(a[4],a[5],a[6]);
    105.                    break;
    106.               case 8 :
    107.                    docSo(a[0],a[1]);
    108.                    printf(" trieu ");
    109.                    if(!(a[2]==48&&a[3]==48&&a[4]==48)){
    110.                                              docSo(a[2],a[3],a[4]);
    111.                                              printf(" nghin ");
    112.                    }
    113.                    if(!(a[5]==48&&a[6]==48&&a[7]==48))
    114.                    docSo(a[5],a[6],a[7]);
    115.                    break;
    116.               case 9 :
    117.                    docSo(a[0],a[1],a[2]);
    118.                    printf(" trieu ");
    119.                    if(!(a[3]==48&&a[4]==48&&a[5]==48)){
    120.                                              docSo(a[3],a[4],a[5]);
    121.                                              printf(" nghin ");
    122.                    }
    123.                    if(!(a[6]==48&&a[7]&&a[8]==48))
    124.                    docSo(a[6],a[7],a[8]);
    125.                    break;
    126.               case 10 :
    127.                    docSo(a[0]);
    128.                    printf(" ti ");
    129.                    if(!(a[1]==48&&a[2]==48&&a[3]==48)){
    130.                                              docSo(a[1],a[2],a[3]);
    131.                                              printf(" trieu ");
    132.                    }
    133.                    if(!(a[4]==48&&a[5]==48&&a[6]==48)){
    134.                                              docSo(a[4],a[5],a[6]);
    135.                                              printf(" nghin ");
    136.                    }
    137.                    if(!(a[7]==48&&a[8]==48&&a[9]==48))
    138.                    docSo(a[7],a[8],a[9]);
    139.                    break;
    140.               case 11 :
    141.                    docSo(a[0],a[1]);
    142.                    printf(" ti ");
    143.                    if(!(a[2]==48&&a[3]==48&&a[4]==48)){
    144.                                              docSo(a[2],a[3],a[4]);
    145.                                              printf(" trieu ");
    146.                    }
    147.                    if(!(a[5]==48&&a[6]==48&&a[7]==48)){
    148.                                              docSo(a[5],a[6],a[7]);
    149.                                              printf(" nghin ");
    150.                    }
    151.                    if(!(a[8]==48&&a[9]==48&&a[10]==48))
    152.                    docSo(a[8],a[9],a[10]);
    153.                    break;
    154.               case 12 :
    155.                    docSo(a[0],a[1],a[2]);
    156.                    printf(" ti ");
    157.                    if(!(a[3]==48&&a[4]==48&&a[5]==48)){
    158.                                              docSo(a[3],a[4],a[5]);
    159.                                              printf(" trieu ");
    160.                    }
    161.                    if(!(a[6]==48&&a[7]==48&&a[8]==48)){
    162.                                              docSo(a[6],a[7],a[8]);
    163.                                              printf(" nghin ");
    164.                    }
    165.                    if(!(a[9]==48&&a[10]==48&&a[11]==48))
    166.                    docSo(a[9],a[10],a[11]);
    167.                    break;
    168.      }
    169.      if(n>=13&&n<=18)
    170.      {
    171.                      n-=9;
    172.      printf("khoang ");
    173.      switch(n)
    174.      {
    175.               case 1 :
    176.                    docSo(a[0]);
    177.                    break;
    178.               case 2 :
    179.                    docSo(a[0],a[1]);
    180.                    break;
    181.               case 3 :
    182.                    docSo(a[0],a[1],a[2]);
    183.                    break;
    184.               case 4 :
    185.                    docSo(a[0]);
    186.                    printf(" nghin ");
    187.                    if(!(a[1]==48&&a[2]==48&&a[3]==48))
    188.                    docSo(a[1],a[2],a[3]);
    189.                    break;
    190.               case 5 :
    191.                    docSo(a[0],a[1]);
    192.                    printf(" nghin ");
    193.                    if(!(a[2]==48&&a[3]==48&&a[4]==48))
    194.                    docSo(a[2],a[3],a[4]);
    195.                    break;
    196.               case 6 :
    197.                    docSo(a[0],a[1],a[2]);
    198.                    printf(" nghin ");
    199.                    if(!(a[3]==48&&a[4]==48&&a[5]==48))
    200.                    docSo(a[3],a[4],a[5]);
    201.                    break;
    202.               case 7 :
    203.                    docSo(a[0]);
    204.                    printf(" trieu ");
    205.                    if(!(a[1]==48&&a[2]==48&&a[3]==48)){
    206.                                              docSo(a[1],a[2],a[3]);
    207.                                              printf(" nghin ");
    208.                    }
    209.                    if(!(a[4]==48&&a[5]==48&&a[6]==48))
    210.                    docSo(a[4],a[5],a[6]);
    211.                    break;
    212.               case 8 :
    213.                    docSo(a[0],a[1]);
    214.                    printf(" trieu ");
    215.                    if(!(a[2]==48&&a[3]==48&&a[4]==48)){
    216.                                              docSo(a[2],a[3],a[4]);
    217.                                              printf(" nghin ");
    218.                    }
    219.                    if(!(a[5]==48&&a[6]==48&&a[7]==48))
    220.                    docSo(a[5],a[6],a[7]);
    221.                    break;
    222.               case 9 :
    223.                    docSo(a[0],a[1],a[2]);
    224.                    printf(" trieu ");
    225.                    if(!(a[3]==48&&a[4]==48&&a[5]==48)){
    226.                                              docSo(a[3],a[4],a[5]);
    227.                                              printf(" nghin ");
    228.                    }
    229.                    if(!(a[6]==48&&a[7]&&a[8]==48))
    230.                    docSo(a[6],a[7],a[8]);
    231.                    break;
    232.               case 10 :
    233.                    docSo(a[0]);
    234.                    printf(" ti ");
    235.                    if(!(a[1]==48&&a[2]==48&&a[3]==48)){
    236.                                              docSo(a[1],a[2],a[3]);
    237.                                              printf(" trieu ");
    238.                    }
    239.                    if(!(a[4]==48&&a[5]==48&&a[6]==48)){
    240.                                              docSo(a[4],a[5],a[6]);
    241.                                              printf(" nghin ");
    242.                    }
    243.                    if(!(a[7]==48&&a[8]==48&&a[9]==48))
    244.                    docSo(a[7],a[8],a[9]);
    245.                    break;
    246.               case 11 :
    247.                    docSo(a[0],a[1]);
    248.                    printf(" ti ");
    249.                    if(!(a[2]==48&&a[3]==48&&a[4]==48)){
    250.                                              docSo(a[2],a[3],a[4]);
    251.                                              printf(" trieu ");
    252.                    }
    253.                    if(!(a[5]==48&&a[6]==48&&a[7]==48)){
    254.                                              docSo(a[5],a[6],a[7]);
    255.                                              printf(" nghin ");
    256.                    }
    257.                    if(!(a[8]==48&&a[9]==48&&a[10]==48))
    258.                    docSo(a[8],a[9],a[10]);
    259.                    break;
    260.               case 12 :
    261.                    docSo(a[0],a[1],a[2]);
    262.                    printf(" ti ");
    263.                    if(!(a[3]==48&&a[4]==48&&a[5]==48)){
    264.                                              docSo(a[3],a[4],a[5]);
    265.                                              printf(" trieu ");
    266.                    }
    267.                    if(!(a[6]==48&&a[7]==48&&a[8]==48)){
    268.                                              docSo(a[6],a[7],a[8]);
    269.                                              printf(" nghin ");
    270.                    }
    271.                    if(!(a[9]==48&&a[10]==48&&a[11]==48))
    272.                    docSo(a[9],a[10],a[11]);
    273.                    break;
    274.      }
    275.      printf(" ti");
    276.      }
    277.      if(n>18){
    278.           printf("Xap xi ");
    279.           docSo(a[0]);
    280.           printf(" nhan voi muoi mu %d",n-1);
    281.      }
    282. }
    283. int main()
    284. {
    285.     char a[MAX];
    286.     int n;
    287.     start(a,&n);
    288.     printf("\nso chu so:%d\n",n);
    289.     printf("\nKet qua:\n");
    290.     docSo(a,n);
    291.     getch();
    292. }
    Đã được chỉnh sửa lần cuối bởi kienquach : 25-01-2013 lúc 01:16 PM.
    + Quách Việt Kiên
    + Yahoo: Kaka_8x_vn
    + skype: kiencuongno1
    + Gmail: kiencuongno1@gmail.com
    Ai có thể free cho mình 50k thẻ điện thoại ko.

  10. #10
    Ngày gia nhập
    01 2013
    Bài viết
    1

    Mặc định hay quá

    hay quá. Cảm ơn đã chia sẻ

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

  1. Bí kiếp tiết kiệm nhiên liệu cho xe máy
    Gửi bởi cungmuachung trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 31-10-2013, 11:28 AM
  2. Lập trình C++ Tìm tập số có tổng bằng X trong tập N số tự nhiên liên tiếp từ 0->N
    Gửi bởi kukopuka trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 16
    Bài viết cuối: 22-06-2011, 09:56 AM
  3. ford fiesta tiết kiệm nhiên liệu thông minh
    Gửi bởi cotiencolien trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 05-05-2011, 07:07 PM
  4. Bài tập C Tìm chữ số thứ n trong dãy các số tự nhiên liên tiếp
    Gửi bởi dehin trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 11
    Bài viết cuối: 26-09-2010, 08:35 PM

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