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

Đề tài: điếm số lần xuất hiện của 1 kí tự trong chuỗi. nhờ sửa giùm

  1. #1
    Ngày gia nhập
    06 2010
    Bài viết
    15

    Mặc định điếm số lần xuất hiện của 1 kí tự trong chuỗi. nhờ sửa giùm

    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<string.h>
    4. #include<alloc.h>
    5. void main()
    6. {clrscr(); printf("nhan ENTER");
    7.  while(getch()!=27)
    8.    {
    9.     char*st=(char*)malloc(50);
    10.     int d=1,c=1;
    11.     printf("\ninput a string:");fflush(stdin);gets(st);
    12.     for(int i=1;i<strlen(st);i++)
    13.         if(st[0]==st[i])
    14.             d++;
    15.     printf("%c:%d\t",st[0],d);
    16.     for(i=1;i<strlen(st);i++ )
    17.     {
    18.         for(int j=0;j<i;j++)
    19.             if(st[i]==st[j])
    20.                 i++;
    21.         for(int t=i+1;t<strlen(st);t++)
    22.            {    if(st[i]==st[t])
    23.             c++;
    24.             printf("%c:%d\t",st[i],c);
    25.            }
    26.     }
    27.     }
    28. }
    nhờ giúp càng nhanh càng tốt
    Đã được chỉnh sửa lần cuối bởi peterdrew : 14-06-2010 lúc 11:35 AM.

  2. #2
    Ngày gia nhập
    05 2010
    Nơi ở
    Cách Mạng Tháng 8
    Bài viết
    205


    Tôi có nhận xét là bạn viết code ẩu quá, có lỗi lớn:
    - Cấp phát vùng nhớ trong vòng lặp, không có giải phóng
    Nhìn code của bạn rồi so với tiêu đề thì không hiểu. Trong code cũng không rõ bạn muốn in những gì.
    Code dưới đây tôi chỉ làm cho 1 ký tự cụ thể, hy vọng sẽ giúp ích cho bạn
    C Code:
    1. char *str = "Hello Cong dong C Viet!" ;
    2. char c = 'C' ;
    3. char buf[255] = " tai cac vi tri: " ;
    4. char *ptr = str-1 ;
    5. int Count = 0 ;
    6. while (*++ptr)
    7.     if (*ptr == c){
    8.         sprintf (buf + strlen (buf), " %d", ptr-str+1) ;
    9.         Count ++ ;
    10.     }
    11. printf ("%s\n", str) ;
    12. printf ("%c xuat hien %d lan %s\n", c, Count, buf) ;
    Nothing last forever !!

  3. #3
    Ngày gia nhập
    06 2010
    Bài viết
    15

    ừ mình viết ẩu thiệt
    đề là thế này:
    ví dụ :nhập chuỗi"kass"
    máy in ra k:1 a:1 s:2
    đơn giản thế thôi!
    còn cách của Pannaruto mình biết rồi nhưng mình muốn viết theo cách này
    Ý tưởng của mình là :
    B1:đếm kí tự đầu tiên xuất hiện bao nhiêu lần
    B2:xuất phát từ kí tự thứ 2,nhìn về phía trước xem kí tự đó đã có chưa
    +nếu có thì nhảy lên kí tự tiếp theo để xét
    +không thì nhìn về phía sau để đếm
    cố gắng giúp lại 1 lần nữa đi thanks!

  4. #4
    Ngày gia nhập
    12 2009
    Nơi ở
    Hà Nội
    Bài viết
    535

    Giải thuật: Nếu k phân biệt chữ hoa chữ thường thì ta dùng mảng d có 26 phần tử
    Trường hợp 1:S[i] có mã ASCII <97, đây là chữ hoa, ta tăng biến đếm d[k-65]
    Trường hợp 2:S[i] có mã ASCII >=97, đây là chữ thường, ta tăng biến đếm d[k-97]

    Code C++:
    C Code:
    1. void main()
    2. {
    3. char S[30];
    4.    cout<<"S="; gets(S);
    5. int d[26];
    6. for(int i=0; i<26; i++) d[i]=0;
    7. for(i=0; i<strlen(S); i++)
    8. {
    9.    if((int)S[i] <97)    d[(int)S[i]-65]++;
    10.    else             d[(int)S[i]-97]++;
    11. }
    12. for(i=0; i<26; i++)
    13. if(d[i]>0)
    14. cout<<"ky tu "<<(char)(i+97)<<" xuat hien "<<d[i]<<" lan !"<<endl;
    15. getch();
    16. }

  5. #5
    Ngày gia nhập
    05 2010
    Bài viết
    265

    Trích dẫn Nguyên bản được gửi bởi kass Xem bài viết
    ừ mình viết ẩu thiệt
    đề là thế này:
    ví dụ :nhập chuỗi"kass"
    máy in ra k:1 a:1 s:2
    đơn giản thế thôi!
    còn cách của Pannaruto mình biết rồi nhưng mình muốn viết theo cách này
    Ý tưởng của mình là :
    B1:đếm kí tự đầu tiên xuất hiện bao nhiêu lần
    B2:xuất phát từ kí tự thứ 2,nhìn về phía trước xem kí tự đó đã có chưa
    +nếu có thì nhảy lên kí tự tiếp theo để xét
    +không thì nhìn về phía sau để đếm
    cố gắng giúp lại 1 lần nữa đi thanks!
    Bạn chú ý: Việc cấp phát chỉ 1 lần bên ngoài for (mà theo mình nên dùng char[]) và cần free() khi không cần đến nữa. Mình code theo ý tưởng của cậu đây (người ta làm cách khác nhanh và dễ hiểu hơn).
    C Code:
    1. #include<stdio.h>
    2. #include<string.h>
    3.  
    4. void chrcount(char *st)
    5. {
    6.     for (int k=0; k < strlen(st); k++)
    7.     {
    8.         int found = 0;
    9.         if (k) // với k >0, tức là từ ký tự thứ 2 trở đi
    10.         {
    11.             int j = k-1;
    12.             while (j >=0 && st[j] != st[k]) j--; // Tìm về phía trước
    13.             found = j >= 0;
    14.         }
    15.         if (!found) // Nếu không thấy, tức là chưa in ra lần nào
    16.         {
    17.             printf("\n%c: ",st[k]);
    18.             int count = 1;
    19.             for (int j = k+1; j < strlen(st); j++) // Tìm về phía sau
    20.                 if (st[k] == st[j]) count ++; // Đếm nếu thấy
    21.             printf(" %d ",count); // In ra số lần
    22.         }
    23.     }
    24. }
    25.  
    26. void main()
    27. {
    28.     char st[] = "ba ba beo ban banh beo";
    29.     printf("\n%s\n",st);
    30.     chrcount(st);
    31. }

  6. #6
    Ngày gia nhập
    12 2009
    Bài viết
    190

    Mặc định điếm số lần xuất hiện của 1 kí tự trong chuỗi. nhờ sửa giùm

    Trích dẫn Nguyên bản được gửi bởi kass Xem bài viết
    Ý tưởng của mình là :
    B1:đếm kí tự đầu tiên xuất hiện bao nhiêu lần
    B2:xuất phát từ kí tự thứ 2,nhìn về phía trước xem kí tự đó đã có chưa
    +nếu có thì nhảy lên kí tự tiếp theo để xét
    +không thì nhìn về phía sau để đếm
    cố gắng giúp lại 1 lần nữa đi thanks!
    Cái đó thì dùng mảng đánh dấu. Tức là dùng 1 mảng phụ phần tử nào đã bị trùng với phần tử trước thì đánh dấu lại.
    C Code:
    1. #include <stdio.h>
    2. #include <malloc.h>
    3. #include <string>
    4.  
    5. void charcount( const char* const str )
    6. {
    7.     int len = strlen( str );
    8.     int *check = ( int * ) malloc ( len * sizeof( int ));
    9.  
    10.     int i = 0, j;
    11.     int count;
    12.    
    13.     while( i < len ) check[i++] = 1;
    14.  
    15.     for( i = 0; i < len; i++ )
    16.     {
    17.         if( check[i] )
    18.         {
    19.             count = 1;
    20.             for( j = i + 1; j < len; j++ )
    21.                 if( str[j] == str[i] )
    22.                 {
    23.                     count++;
    24.                     check[j] = 0;
    25.                 }
    26.             printf( "Symbol  %c : %3d time(s)\n", str[i], count );
    27.         }
    28.     }
    29.    
    30.     free( check );
    31. }
    32.  
    33. int main()
    34. {
    35.     char mess[] = "This is a test";
    36.    
    37.     printf( "Mess : %s\n", mess );
    38.     charcount( mess );
    39.  
    40.     system("pause");
    41.     return 0;
    42. }

  7. #7
    Ngày gia nhập
    06 2010
    Bài viết
    15

    Cám ơn tất cả mọi người lắm!
    Nhưng cho mình hỏi là đoạn code của mình sai ở chỗ nào được không ?mình rất tệ C
    Còn nữa mình có 1 bài khác tiện thể hỏi luôn
    Đề bài là :xóa hết khoảng trắng trong chuỗi
    Vd:nhập vào chuỗi :" I love you "
    xuất ra:"Iloveyou"
    Mình có làm rồi nhưng sai .Post thêm 1 bài sai nữa thì hơi mất mặt,nên mình muốn hỏi ý kiến mọi người
    Ý tưởng của mình là sao chuỗi đó vào 1 chuỗi khác mà loại bỏ các khoảng trắng đi.Rồi đưa ra chuỗi kia

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

    Trích dẫn Nguyên bản được gửi bởi kass Xem bài viết
    Cám ơn tất cả mọi người lắm!
    Nhưng cho mình hỏi là đoạn code của mình sai ở chỗ nào được không ?mình rất tệ C
    Còn nữa mình có 1 bài khác tiện thể hỏi luôn
    Đề bài là :xóa hết khoảng trắng trong chuỗi
    Vd:nhập vào chuỗi :" I love you "
    xuất ra:"Iloveyou"
    Mình có làm rồi nhưng sai .Post thêm 1 bài sai nữa thì hơi mất mặt,nên mình muốn hỏi ý kiến mọi người
    Ý tưởng của mình là sao chuỗi đó vào 1 chuỗi khác mà loại bỏ các khoảng trắng đi.Rồi đưa ra chuỗi kia
    Đây, iloveyou của cậu đây, ý tưởng của cậu cũng ở đấy lun.
    C Code:
    1. #include <stdio.h>
    2. #define space 32
    3.  
    4. char *strstd(char *dest, char *src)
    5. {
    6.     int n = 0, flag = 0;
    7.     while (*src)
    8.     {
    9.         if (*src != space){flag = 1; dest[n++] = *src;}
    10.         else if (flag) {flag = 0; dest[n++] = *src;}       
    11.         src++;
    12.     }
    13.     if (!flag && n) n--;
    14.     dest[n] = 0;
    15.     return dest;
    16. }
    17.  
    18. void main()
    19. {
    20.     char src[] = "  Xau  nay   khong  con   ky tu  thua   ";
    21.     char dest[50];
    22.     printf("\n%s%c\n",strstd(dest,src),'!'); //
    23. }

  9. #9
    Ngày gia nhập
    05 2010
    Bài viết
    265

    Trích dẫn Nguyên bản được gửi bởi kass Xem bài viết
    Cám ơn tất cả mọi người lắm!
    Nhưng cho mình hỏi là đoạn code của mình sai ở chỗ nào được không ?mình rất tệ C
    Thực ra C của cậu không tệ, mà cái algorithm của cậu mới đích thực là tệ. Mình bỏ bớt những đoạn code phiền hà để toát lên cái tệ của cậu đó nha. Mình mách nước trau dồi giải thuật nhé. Cậu lấy giấy bút ra, viết chữ to, thưa và rõ ràng, ví dụ "ba ba beo ban banh beo", rồi cậu dò từng dòng lệnh của cậu và làm thay cho cái PC, cậu sẽ thấy vấn đề ngay. Mình nhắc lại, phải có giấy bút và viết TO, THƯA, RÕ RÀNG. Đừng tự ái nhé, hồi trước mình vẫn làm thế đó.
    C Code:
    1. void main()
    2. {
    3.     char st[50];
    4.     do
    5.     {
    6.         int d=1,c=1;
    7.         printf("\ninput a string:");
    8.         fflush(stdin);gets(st);
    9.  
    10.         for(int i=1;i < strlen(st);i++)
    11.             if(st[0]==st[i]) d++; // Dem nhung thang bang st[0]
    12.  
    13.         printf("%c:%d\t",st[0],d);// In ra so dem duoc
    14.  
    15.         for(i=1;i<strlen(st);i++ ) // Chay i tu 1 den cuoi
    16.         {
    17.             for(int j=0;j<i;j++) // Duyet tu dau den i-1
    18.                 if(st[i]==st[j]) i++; // Neu gap thang bang no thi i++
    19.  
    20.             for(int t=i+1;t<strlen(st);t++) // Duyet nhung thang sau i
    21.             {
    22.                 if(st[i]==st[t]) c++; // Neu gap thang bang no thi c++ (chac la CUOI++)
    23.                 printf("%c:%d\t",st[i],c); // In ra so luong thang o phia sau bang thang st[i]
    24.             }
    25.         }
    26.         printf("\nNhan ESC de ket thuc, phim khac la tiep tuc.\n");
    27.     }   while(getch()!=27);
    28. }

  10. #10
    Ngày gia nhập
    12 2009
    Bài viết
    190

    Trích dẫn Nguyên bản được gửi bởi donvuon Xem bài viết
    Đây, iloveyou của cậu đây, ý tưởng của cậu cũng ở đấy lun.
    Bạn ấy chỉ hỏi là xóa hết khoảng trắng trong chuỗi thôi chứ không phải là xóa bỏ khoảng trắng thừa đâu. Bạn làm vượt quá yêu cầu rồi ^__^
    @kass : Cách của bạn đúng đó. Mình góp ý chút nhé thay vì sao nguyên cái chuỗi ban đầu thì mình xem trong chuỗi ban đầu kí tự nào không phải khoảng trắng thì mới ghi vào chuỗi mới, nếu phải khoảng trắng thì loại luôn. Xong thì trả về chuỗi mới là được.
    Cách làm là vậy bạn thử đi. Có gì mọi người sửa cho.

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

  1. Lập trình C++ Mình muốn hỏi về bài toán tìm số lần xuất hiện của ký tự nhiều nhất trong chuỗi và số lần xuất hiện
    Gửi bởi ducky trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 06-09-2013, 11:17 AM
  2. Bài tập đếm số lần xuất hiện trong mảng, các bạn giải thích giùm??
    Gửi bởi baonhietdoi trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 9
    Bài viết cuối: 21-10-2012, 03:34 PM
  3. Bị lỗi dính chuỗi khi nhập xuất chuỗi từ file trong C++?
    Gửi bởi nguyenchikhang trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 3
    Bài viết cuối: 03-11-2011, 03:13 PM
  4. Turbo C Lỗi Nhập một chuỗi và 1 từ cho biết từ đó xuất hiện trong chuỗi bao nhiêu lần?
    Gửi bởi vietvinhqn1992 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 17-01-2011, 12:38 PM
  5. Đếm từ trong chuỗi. debug giùm.
    Gửi bởi iTspyware trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 14-06-2009, 05:18 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