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

Đề tài: Tách 3 ký tự thành 1 nhóm trong một chuỗi C

  1. #1
    Ngày gia nhập
    08 2011
    Bài viết
    36

    Mặc định Tách 3 ký tự thành 1 nhóm trong một chuỗi C

    Thực ra đề bài rất đơn giản đó là có 1 xâu tối đa 12 ký tự gồm các chữ cái số, cứ cho là lưu vào biến "t"
    Bây giờ có 4 biến là "vi" là biến lưu 3 ký tự cuối cùng của xâu, theo thứ tự đúng của nó, lần lượt như vậy sẽ lưu vào các biến "an", "u", "y". nếu số 0 đủ số chữ số cũng vẫn thực hiện đưa vào các biến bình thường và các số đó là chữ số nếu ko có trong xâu t.

    Ví dụ xâu t là: 987'654'321'759 ( đủ 12 chữ số) thì
    vi = 759
    an = 321
    u = 654
    y = 987;

    Ví dụ xâu t là: 45'786'547 (thiếu 12 chữ số) thì
    vi = 547
    an = 786
    u = 045
    y = 000

    Mong các Pro giúp đỡ, nhân tiện đây ai có thể xử lý bài đọc số bằng ngôn ngữ C nào ngắn gọn ko cho em với, đề bài tiêu chuẩn là : đọc một số bất kỳ có tối đa 12 chữ số. Ví dụ : 12345 thì đưa ra màn hình là "muoi hai nghin ba tram bon muoi lam"

  2. #2
    Ngày gia nhập
    03 2011
    Bài viết
    65

    Bài này mình chạy ok trên VC++ 2010 nhé, trên ct khác thì ko chắc

    C++ Code:
    1. #include <iostream>
    2.  
    3. using namespace std;
    4.  
    5. void tachso (char *s, char *a, char *b, char *c, char *d)
    6. {
    7.     if (strlen(s)>12)
    8.     {
    9.         cout <<"Chuoi so khong hop le";
    10.     }
    11.     else
    12.     {
    13.         int i,leng=strlen(s), index=0;
    14.         for (i=0;i<3;i++)                       // gán giá trị ban đầu là "000"
    15.         {
    16.             a[i]='0';
    17.             b[i]='0';
    18.             c[i]='0';
    19.             d[i]='0';
    20.         }
    21.         for (i=leng-1;i>=0;i--)                     // Chạy từ cuối về đầu, đưa vào theo thứ tự
    22.         {
    23.             if (leng-i<=3) a[index++]=s[i];                     // 3 ký tự đầu đưa vào a
    24.             else if (leng-i<=6) b[index++]=s[i];                     // 3 ký tư tiếp (nếu có) đưa vao b
    25.             else if (leng-i<=9) c[index++]=s[i];                     // Cứ tương tự như vậy, nếu hết rồi thì nó vẫn là 0
    26.             else d[index++]=s[i];
    27.             if ((leng-i)%3==0) index=0;                     // Khi index lên đến 2 thì reset về 0
    28.         }
    29.         a[3]=b[3]=c[3]=d[3]=0;                     // Tạo ký tự kết thúc cho chuỗi
    30.         strrev (a);                     // đảo ngược
    31.         strrev(b);
    32.         strrev(c);
    33.         strrev (d);
    34.     }
    35. }
    36.  
    37. void main ()
    38. {
    39.     char t[]="45786547";
    40.     char vi[4], an[4],u[4],y[4];
    41.    
    42.     tachso (t,vi,an,u,y);
    43.  
    44.     cout <<vi <<endl;
    45.     cout <<an <<endl;
    46.     cout <<u <<endl;
    47.     cout <<y <<endl;   
    48.  
    49.     cout <<"\n\n";
    50.     system("pause");
    51. }

  3. #3
    Ngày gia nhập
    10 2011
    Nơi ở
    quy nhon city
    Bài viết
    7

    minh đã chạy thử và kết quả tạm chấp nhận đc.
    Nhưng kô biết có phải tối ưu nhất chưa.
    mong được góp ý.
    Code:
    //chuong trinh tach 3 ky tu so
    #include <iostream>
    #include <conio.h>
    main()
    {
          using namespace std;
          int t[11],i,k=1,n;
          cout<<"nhap so chu so can nhap :";
          cin>>n;
          cout<<"\nhay nhap cac chu so (tu 0-->9)";
          for(i=12-n;i<12;i++){loop:{cin>>t[i];}
                            if(t[i]>=10) goto loop;}
          cout<<"so ban vua nhap la :";
          for(i=12-n;i<12;i++)
          cout<<t[i];
          cout<<"\n";
          for(i=0;i<12-n;i++)
          t[i]=0;
          for(i=0;i<12;i++){
                            k++;
                            switch(k){
                                      case 3:{cout<<"y= "<<t[0]<<t[1]<<t[2];break;cout<<"\n";}
                                      case 6:{cout<<"u= "<<t[3]<<t[4]<<t[5];break;cout<<"\n";}
                                      case 9:{cout<<"an= "<<t[6]<<t[7]<<t[8];break;cout<<"\n";}
                                      case 12:{cout<<"vi= "<<t[9]<<t[10]<<t[11];break;cout<<"\n";}
                                      }
                                      }
          getch();
          }
    HỌC , HỌC NỮA , HỌC MÃI ..... ĐUỐI NGHỈ ..... ĐÚP HỌC LẠI

  4. #4
    Ngày gia nhập
    10 2011
    Bài viết
    9

    BẠN ƠI MÌNH NGHĨ LÀ CHỈ CẦN ĐƠN GIẢN THẾ NÀY

    f>>t; // đọc vào t nhé
    n=strlen(t) // lấy độ dài của t
    if(n==12) xuat; // hàm xuất bạn chỉ cần lấy 3 ký tự từ t[12] đến t[1]
    else
    if(n<12)
    {
    n--;d=12;
    while(n>-1) {t[d]=t[n]; d--; n--;}
    for(int i=1;i<=d;i++)
    t[i]='0';
    xuat;
    }
    else cout << " so khong hop le ";


    ý tưởng này thì bạn có thể viết code đọc số được rồi đấy

  5. #5
    Ngày gia nhập
    10 2011
    Nơi ở
    quy nhon city
    Bài viết
    7


    mình thấy bạn dùng tới 2 lần xuất .
    có nên không.
    vậy theo bạn ở đây cần phải xuất ra như thế nào cho đúng theo yêu cầu của đề bài , ở đây là tách ra theo từng nhóm một mà.
    HỌC , HỌC NỮA , HỌC MÃI ..... ĐUỐI NGHỈ ..... ĐÚP HỌC LẠI

  6. #6
    Ngày gia nhập
    10 2011
    Bài viết
    9

    Mặc định Tách 3 ký tự thành 1 nhóm trong một chuỗi C

    Trích dẫn Nguyên bản được gửi bởi mfvodka107 Xem bài viết

    mình thấy bạn dùng tới 2 lần xuất .
    có nên không.
    vậy theo bạn ở đây cần phải xuất ra như thế nào cho đúng theo yêu cầu của đề bài , ở đây là tách ra theo từng nhóm một mà.
    bạn ơi xuất chỉ xuất hiện 1 lần thôi ! nó nằm trong if mà

    thì bạn chỉ việc lấy bộ 3 thôi (12 11 10) (9 8 7) ( 6 5 4) (3 2 1) , vì mình đã đẩy mảng đến 12 rồi bạn ạ

  7. #7
    Ngày gia nhập
    10 2011
    Nơi ở
    quy nhon city
    Bài viết
    7

    Code:
    #include <iostream>
    #include <conio.h>
    #include <string.h>
    main()
    {
          using namespace std;
          char t[11];
          int n,d,k=1,i;
          cout<<"nhap so can tach :\n";
          gets(t);
          n=strlen(t);
          if(n==12)
                for(i=0;i<11;i++){
                            k++;
                            switch(k){
                                      case 3:{cout<<"y= "<<t[0]<<t[1]<<t[2];break;cout<<"\n";}
                                      case 6:{cout<<"u= "<<t[3]<<t[4]<<t[5];break;cout<<"\n";}
                                      case 9:{cout<<"an= "<<t[6]<<t[7]<<t[8];break;cout<<"\n";}
                                      case 12:{cout<<"vi= "<<t[9]<<t[10]<<t[11];break;cout<<"\n";}
                                      }
                                      }
          else
          if(n<12)
          {
                  n--;d=11;
                  while(n>-1){t[d]=t[n];d--;n--;}
                  for(i=0;i<=d;i++)
                  t[i]='0';
                  for(i=0;i<12;i++){
                            k++;
                            switch(k){
                                      case 3:{cout<<"y= "<<t[0]<<t[1]<<t[2];break;cout<<"\n";}
                                      case 6:{cout<<"u= "<<t[3]<<t[4]<<t[5];break;cout<<"\n";}
                                      case 9:{cout<<"an= "<<t[6]<<t[7]<<t[8];break;cout<<"\n";}
                                      case 12:{cout<<"vi= "<<t[9]<<t[10]<<t[11];break;cout<<"\n";}
                                      }
                                      }
                                      }
          else cout<<"so khong hop le";
          getch();
          }
    viết lại chương trình theo sự chỉ dẫn của bạn Lamnhat.

    BẠN ƠI MÌNH NGHĨ LÀ CHỈ CẦN ĐƠN GIẢN THẾ NÀY

    f>>t; // đọc vào t nhé
    n=strlen(t) // lấy độ dài của t
    if(n==12) xuat; // hàm xuất bạn chỉ cần lấy 3 ký tự từ t[12] đến t[1]
    else
    if(n<12)
    {
    n--;d=12;
    while(n>-1) {t[d]=t[n]; d--; n--;}
    for(int i=1;i<=d;i++)
    t[i]='0';
    xuat;
    }
    else cout << " so khong hop le ";


    ý tưởng này thì bạn có thể viết code đọc số được rồi đấy

    bạn lamnhat ơi nếu như vậy thì sẽ không khống chế được việc nhập dữ liệu vào mất
    nếu nhập quá đà thì lại phải nhập lại.(@@).ax
    Đã được chỉnh sửa lần cuối bởi aydada : 21-10-2011 lúc 07:00 PM. Lý do: làm liền bài viết
    HỌC , HỌC NỮA , HỌC MÃI ..... ĐUỐI NGHỈ ..... ĐÚP HỌC LẠI

  8. #8
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Làm bằng con trỏ cho vui:

    C Code:
    1. char *t = "45786547";
    2. char vi[4], an[4], u[4], y[4]; // các chuỗi con
    3. char *pv; // con trỏ dùng để đọc chuỗi t
    4. char *pi; // con trỏ dùng để load kt vào các chuỗi con
    5. int i; // biến dùng để đếm số kt đã duyệt
    6. for (i=0, pv = t+strlen(t)-12; i < 12; i++, pv++) // pv khởi từ 12 vị trí trước cuối chuỗi t
    7. {
    8.   // trỏ con trỏ loader vào đúng chuỗi con
    9.   if (i==0) pi = y; else if (i==3) pi = u; else if (i==6) pi = an; else if (i==9) pi = vi;
    10.   // load vào chuỗi con, nếu pv chưa đọc tới chuỗi t thì dùng 0
    11.   *pi++ = (pv < t)? '0' : *pv;
    12. }
    13. vi[3] = an[3] = u[3] = y[3] = '\0'; // kết các chuỗi con

  9. #9
    Ngày gia nhập
    08 2011
    Bài viết
    36

    thanks all ! hi.

  10. #10
    Ngày gia nhập
    10 2011
    Bài viết
    9

    úi giời bạn rãnh thế nhĩ
    bạn gì mô phỏng ý tưởng của mình add nick mình nhé : The_red_devils7777
    sao lại bị nhập không kiềm chế được vậy bạn

    BẠN VIẾT CODE THẾ THÌ CHẾT MẤT Y=(T[0]-48)*100+(T[1]-48)*10+T[2] ; TƯƠNG TỰ CHO 3 CÁI CÒN LẠI. BẠN CHỈ CẦN VIẾT HÀM XUAT(T) LÀ ĐƯỢC RỒI, VIẾT LẮM THẾ KHÔNG BIẾT ! ^^
    Đã được chỉnh sửa lần cuối bởi lamnhat : 21-10-2011 lúc 11:21 PM.

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

  1. Tạo số thứ tự trường có gộp nhóm trong crystal report - C#
    Gửi bởi manhhungbgo trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 10-11-2011, 12:51 AM
  2. Algorithm Sắp xếp csdl vào g nhóm với số phần tử của mỗi nhóm khác nhau
    Gửi bởi o0oUntilYouo0o trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 23-09-2011, 04:50 PM
  3. Trả lời: 1
    Bài viết cuối: 29-06-2011, 12:02 AM
  4. Bài tập C đếm số nhóm tạo thành từ các số 1 trong ma trận 0,1
    Gửi bởi churrym trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 0
    Bài viết cuối: 03-04-2011, 09:10 AM
  5. MS SQL Lỗi Nhóm một đoạn code trong SQL
    Gửi bởi lynch trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 1
    Bài viết cuối: 14-04-2010, 11:19 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