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

Đề tài: Kiểm tra chuỗi đối xứng , dùng vòng lặp for bị lỗi !

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

    Post Kiểm tra chuỗi đối xứng , dùng vòng lặp for bị lỗi !

    Đây là đoạn code của e ạ
    C Code:
    1. void check(char a[])
    2. {
    3.     int i, j, l, count=0;
    4.     l=strlen(a);
    5.     if(l%2==0)
    6.     {
    7.         for(i=0; i< l/2 ; i++)
    8.         for(j=l-1; j>= l/2 ; j--)
    9.         {
    10.             if(a[i]==a[j])
    11.             {
    12.                 count++;
    13.             }
    14.         }
    15.         if(count==l/2)  printf("\nString is symmetrical string");
    16.         else    printf("\nString is not symmetrical string");
    17.     }
    18.     else    printf("\nString is not symmtrical string");
    19. }

    Đoạn code này của e khi chạy thì nó chỉ nhận ra chuỗi không phải đối xứng khi độ dài chuỗi lẻ. Còn độ dài chuỗi chẵn thì chuỗi nào cũng đối xứng. Bro nào có thể giúp e được không ạ ?

  2. #2
    Ngày gia nhập
    10 2010
    Nơi ở
    Đại học Bách Khoa Hà Nội
    Bài viết
    45

    Trích dẫn Nguyên bản được gửi bởi n0b0dy.n0l0v3 Xem bài viết
    Đây là đoạn code của e ạ
    C Code:
    1. void check(char a[])
    2. {
    3.     int i, j, l, count=0;
    4.     l=strlen(a);
    5.     if(l%2==0)
    6.     {
    7.         for(i=0; i< l/2 ; i++)
    8.         for(j=l-1; j>= l/2 ; j--)
    9.         {
    10.             if(a[i]==a[j])
    11.             {
    12.                 count++;
    13.             }
    14.         }
    15.         if(count==l/2)  printf("\nString is symmetrical string");
    16.         else    printf("\nString is not symmetrical string");
    17.     }
    18.     else    printf("\nString is not symmtrical string");
    19. }

    Đoạn code này của e khi chạy thì nó chỉ nhận ra chuỗi không phải đối xứng khi độ dài chuỗi lẻ. Còn độ dài chuỗi chẵn thì chuỗi nào cũng đối xứng. Bro nào có thể giúp e được không ạ ?
    Tại vì bạn code như thế chứ sao.
    Xem lại nhé:
    C Code:
    1. if (l%2 == 0) { ... }
    2. else    printf("\nString is not symmtrical string");
    nghĩa là nếu độ dài lẻ nó sẽ in ra không phải chuỗi đối xứng.

    Bạn nên xem lại đoạn này nữa:

    C Code:
    1. for(i=0; i< l/2 ; i++)
    2.     for(j=l-1; j>= l/2 ; j--)
    3.         {
    4.             if(a[i]==a[j])
    5.             {
    6.                 count++;
    7.             }
    8.         }

    Sai logic nhé. Đáng ra chỉ cần một vòng lặp là được rồi, mỗi vòng lặp thì trừ j và cộng i

    mình làm thế này:

    C Code:
    1. i = 0;
    2.     j = l-1;
    3.     while (i<j)
    4.     {
    5.         if (a[i] == a[j]) {i++; j--; count++;}
    6.         else break;
    7.     }
    Chẳng biết mình muốn cái gì nữa :v

  3. #3
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    @ie:
    biến count và biến i sau vòng lặp đều có gt như nhau, vậy liệu có phải dùng biến count nữa ko.

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

    Trích dẫn Nguyên bản được gửi bởi pkthanh92 Xem bài viết
    @ie:
    biến count và biến i sau vòng lặp đều có gt như nhau, vậy liệu có phải dùng biến count nữa ko.
    @IE: Bạn nhận xét code của bạn Duy Anh (NoBodyLove) đúng rùi, thực ra ko cần dùng 2 vòng lặp với 2 biến i,j như thế. Ta chỉ cần một biến i là đủ bằng cách kiểm tra kí tự if (a[i]==a[l-i-1)) nếu đúng thì biến count++ là đủ. Nhưng bạn lại viết sai code như bạn pkthank92 nhận xét là cuối chương trình i==count.
    Đây là code của mình viết, đã chạy thử và ok. Các bạn check thử nhé.
    Code:
    #include"conio.h"
    #include"string.h"
    #include"stdio.h"
    void check(char a[])
    {
    	int i,count;
    	i=count=0;
    	int l=strlen(a);
    
    	do	{
    			if(a[i]==a[l-i-1])
    				count++;
    			else
    				break;
    			i++;
    		}while (i<l/2);
    if (count==l/2)
    	printf("\n %s la chuoi doi xung",a);
    else
    	printf("\n%s ko la chuoi doi xung",a);
    }
    void main()
    {
    	char a[10];
    	clrscr();
    	fflush(stdin);
    	printf("\nNhap chuoi a:");
    	gets(a);
    	check(a);
    	getch();
    }

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

    Theo nguyên tắc thì giải thuật không cần phải đếm số pt đối xứng nhau (count).

    Chỉ cần 2 biến tượng trưng cho 2 chỉ số. 1 chạy xuôi từ đầu và 1 chạy ngược từ đuôi chuỗi.
    Nếu 2 phần tử (ký tự) khác nhau thì break ra khỏi vòng lặp
    Sau đó xét 2 biến chỉ số, nếu chỉ số đuôi vẫn còn lớn hơn chỉ số đầu thì có thể kết luận vòng lặp bị break sớm, có nghĩa là chuõi không đối xứng

    C Code:
    1. // code xét xem chuỗi a có đối xứng
    2.  
    3. int i = -1;
    4. int j = strlen(a);
    5. while (++i < --j)  if (a[i] != a[j]) break;
    6. if (i < j) printf("chuỗi không đối xứng");
    7. else printf("chuỗi đối xứng");
    8.  
    9. // code bằng vòng lặp for
    10.  
    11. for (i = 0, j = strlen(a)-1; i < j; i++, j--)  if (a[i] != a[j]) break;
    Đã được chỉnh sửa lần cuối bởi VoTichSu : 19-09-2011 lúc 03:20 PM.

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

    Thumbs down Kiểm tra chuỗi đối xứng , dùng vòng lặp for bị lỗi !

    Trích dẫn Nguyên bản được gửi bởi VoTichSu Xem bài viết
    Theo nguyên tắc thì giải thuật không cần phải đếm số pt đối xứng nhau (count).

    Chỉ cần 2 biến tượng trưng cho 2 chỉ số. 1 chạy xuôi từ đầu và 1 chạy ngược từ đuôi chuỗi.
    Nếu 2 phần tử (ký tự) khác nhau thì break ra khỏi vòng lặp
    Sau đó xét 2 biến chỉ số, nếu chỉ số đuôi vẫn còn lớn hơn chỉ số đầu thì có thể kết luận vòng lặp bị break sớm, có nghĩa là chuõi không đối xứng

    C Code:
    1. // code xét xem chuỗi a có đối xứng
    2.  
    3. int i = -1;
    4. int j = strlen(a);
    5. while (++i < --j)  if (a[i] != a[j]) break;
    6. if (i < j) printf("chuỗi không đối xứng");
    7. else printf("chuỗi đối xứng");
    8.  
    9. // code bằng vòng lặp for
    10.  
    11. for (i = 0, j = strlen(a)-1; i < j; i++, j--)  if (a[i] != a[j]) break;
    Thank vo tich su, cách này ngắn gọn hơn cách mình làm nhiều.

  7. #7
    Ngày gia nhập
    05 2010
    Nơi ở
    In my heart /Hà Nội VietNam Capital
    Bài viết
    27

    Mình nghĩ dùng vòng for như thế này cũng được.
    C Code:
    1. for(int i; i<str.length; i++)
    2. {
    3.      if(str[i] != str[i].length() - 1 -i)
    4.      {
    5.           --> Symmetric
    6.      }
    7.     return;
    8. }
    9.            Not symmetric
    Đã được chỉnh sửa lần cuối bởi ToNy_ : 18-07-2012 lúc 09:55 AM.
    Start from beginning .
    Your life is what you do daily and weekly .

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

    Trích dẫn Nguyên bản được gửi bởi ToNy_ Xem bài viết
    Mình nghĩ dùng vòng for như thế này cũng được.
    C Code:
    1. for(int i; i<str.length; i++)
    2. {
    3.      if(str[i] != str[i].length() - 1 -i)
    4.      {
    5.           --> Symmetric
    6.      }
    7.     return;
    8. }
    9.            Not symmetric
    Được nhưng tiết kiệm một biến j lại sanh ra phải gọi hàm len nhiều lần. Và,
    con toán cuoiChuoi-1-i có hơi tốn kém so với con toán j-- hoặc --j

  9. #9
    Ngày gia nhập
    02 2012
    Nơi ở
    everywhere
    Bài viết
    13

    Code:
    int main ()
    {
    	 char *p;
    	 int a = 0;
    	 p = (char*)malloc(128);
    	 printf("\n Nhap vao chuoi ky tu :");
    	 gets (p);
    	 while(p[a] != '\0')
    		 a++;
    	 for(int i = 0 ; i < (a/2);i++)
    	 {
    		 if(p[i] == p[a-1-i])
    		 {
    			 printf("OK\n");break;
    		 }
    		 else
    		 {
    			 printf("NO\n");break;
    		 }
    	 }
    	 getch ();
    	 return 0;
    }
    cách này đc ko ?

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

    Trích dẫn Nguyên bản được gửi bởi yokashi Xem bài viết
    Code:
    int main ()
    {
    	 char *p;
    	 int a = 0;
    	 p = (char*)malloc(128);
    	 printf("\n Nhap vao chuoi ky tu :");
    	 gets (p);
    	 while(p[a] != '\0')
    		 a++;
    	 for(int i = 0 ; i < (a/2);i++)
    	 {
    		 if(p[i] == p[a-1-i])
    		 {
    			 printf("OK\n");break; // so sánh mới ký tự đầu tiên đã break???
    		 }
    		 else
    		 {
    			 printf("NO\n");break;
    		 }
    	 }
    	 getch ();
    	 return 0;
    }
    cách này đc ko ?
    1. Ngoài cái bug nêu trên, cách của bạn còn những điểm chưa tối ưu là mỗi lần lặp lại nó phải làm con toán a/2 và con toán a-1-i

    2. Muốn tìm độ dài chuỗi mà không dùng con trỏ, người ta code như vầy:
    int a = -1;
    while (p[++a]);

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

  1. Trả lời: 1
    Bài viết cuối: 29-06-2011, 12:02 AM
  2. Không dùng vòng lặp và đệ quy
    Gửi bởi cdphuc trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 50
    Bài viết cuối: 25-08-2010, 02:04 AM
  3. Hàng đợi dùng mảng vòng
    Gửi bởi akmmslkye 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: 20-03-2009, 10:31 AM
  4. Chuyển hệ thập phân sang nhị phân chỉ dùng vòng for không dùng mảng
    Gửi bởi zodjac1990 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 24-02-2009, 06:16 PM
  5. [C++] Chuỗi bị xoá sau khi sử dụng vòng lặp for ???
    Gửi bởi hailoc12 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 12
    Bài viết cuối: 18-06-2007, 10:25 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