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

Đề tài: sử dụng con trỏ xét xâu đối xứng,lỗi không biết tại sao,new mem xin mọi người giúp đỡ

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

    Unhappy sử dụng con trỏ xét xâu đối xứng,lỗi không biết tại sao,new mem xin mọi người giúp đỡ

    C++ Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<string.h>
    4. #include<ctype.h>
    5.  
    6. int kt(char *a)
    7. {
    8. char *pcuoi,*i;
    9. for (i=a;i<=(a+strlen(a)-1);i++)
    10. {
    11.     printf("%c",*i);
    12.     if (a[(int)i]!=a[(int)(a+strlen(a)-1)])
    13.     return 0;
    14. }
    15. return 1;
    16. }
    17.  
    18. main()
    19. {
    20. char a[10]="abcgcba";
    21. int z;
    22. z=kt(a);
    23. if (z==1) printf("\nchuoi doi xung");
    24. else if (z==0) printf("\nchuoi ko doi xung");
    25. getch();
    26. }

    Mọi người giúp em với,em đang tập dùng con trỏ nên không biết sửa thế nào,mong anh chị giúp em hiểu thêm về con trỏ,em xin cảm ơn
    Đã được chỉnh sửa lần cuối bởi beautifulsoul84hung : 30-01-2012 lúc 06:49 PM. Lý do: thêm code tag

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

    Nhìn sơ qua cũng đủ thấy bạn đem cái code mảng sửa lại thành con trỏ. Làm như thế này thì đương nhiên sẽ bị lỗi tùm lum.

    Phân tích code ra rồi viết lại từ đầu theo con trỏ.

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

    Trích dẫn Nguyên bản được gửi bởi themask Xem bài viết
    #include<stdio.h>
    #include<conio.h>
    #include<string.h>
    #include<ctype.h>

    int kt(char *a)
    {
    char *pcuoi,*i;
    for (i=a;i<=(a+strlen(a)-1);i++)
    .....
    }
    ban cho i=a (kieu char) nhưng strlen(a) trả về int lỗi là phải

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

    C Code:
    1. #include<stdio.h>
    2. #include<string.h>
    3. #include<ctype.h>
    4.  
    5. int kt(char *a)
    6. {
    7.     char *pb = a, *pe = a + (strlen(a) - 1); /* pb trỏ đến đầu a, pe trỏ đến cuối a */
    8.     while(pb <= pe)
    9.         if(*pb++ != *pe--) /* Cho pb tiến dần, pe lùi dần cho đến khi nó gặp nhau */
    10.             return 0;
    11.     return 1;
    12. }
    13.  
    14. main()
    15. {
    16.     char a[10]="abcgcba";
    17.     int z;
    18.     z=kt(a);
    19.     if (z==1) printf("\nchuoi doi xung");
    20.     else printf("\nchuoi ko doi xung"); /* else là đủ rồi, không cần phải if(z==0) nữa đâu */
    21. }
    Đã được chỉnh sửa lần cuối bởi boss14420 : 30-01-2012 lúc 02:45 AM. Lý do: Sửa *pe++ thành *pe--

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

    dạ vâng em xem lại và tìm hiểu thêm xem,em vẫn gà quácảm ơn anh chị đã nhiệt tình chỉ bảo

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

    Mặc định sử dụng con trỏ xét xâu đối xứng,lỗi không biết tại sao,new mem xin mọi người giúp đỡ

    Trích dẫn Nguyên bản được gửi bởi boss14420 Xem bài viết
    C Code:
    1. #include<stdio.h>
    2. #include<string.h>
    3. #include<ctype.h>
    4.  
    5. int kt(char *a)
    6. {
    7.     char *pb = a, *pe = a + (strlen(a) - 1); /* pb trỏ đến đầu a, pe trỏ đến cuối a */
    8.     while(pb <= pe)
    9.         if(*pb++ != *pe++) /* Cho pb tiến dần, pe lùi dần cho đến khi nó gặp nhau */
    10.             return 0;
    11.     return 1;
    12. }
    13.  
    14. main()
    15. {
    16.     char a[10]="abcgcba";
    17.     int z;
    18.     z=kt(a);
    19.     if (z==1) printf("\nchuoi doi xung");
    20.     else printf("\nchuoi ko doi xung"); /* else là đủ rồi, không cần phải if(z==0) nữa đâu */
    21. }
    Bác boss14420 code sai dòng, pe++ thì đến tết may ra nó mới dừng. ~~>"<~~
    C Code:
    1.         if(*pb++ != *pe++) /* Cho pb tiến dần, pe lùi dần cho đến khi nó gặp nhau */
    Code của tôi:
    C Code:
    1. int kt(const char *lpcA)
    2. {
    3.     if(lpcA == NULL)
    4.         return 0;
    5.     const char *lpcPos_b = lpcA; // Phần tử đầu tiên của chuỗi.
    6.     const char *lpcPos_e = lpcA + strlen(lpcA) - 1; // Trỏ đến phần tử cuối cùng của chuỗi.
    7.     // Điều kiện lặp:
    8.     // - 2 con trỏ đầu và cuối khác nhau.
    9.     while(lpcPos_b <= lpcPos_e)
    10.     {
    11.         printf("%c %c\n", *lpcPos_b, *lpcPos_e);
    12.         if(*lpcPos_b++ != *lpcPos_e--) // So sánh hai kí tự ở hai vị trí, tăng con trỏ lpsPos_b, giảm con trỏ lpsPos_e
    13.             return 0;
    14.     }
    15.     return 1;
    16. }
    17. int main()
    18. {
    19.     char a[10]="abcggcba";
    20.     int iDoiXung;
    21.     iDoiXung = kt(a);
    22.     if (iDoiXung == 1)
    23.         printf("\nChuoi doi xung");
    24.     else
    25.         printf("\nChuoi ko doi xung");
    26.     return 0;
    27. }
    Đã được chỉnh sửa lần cuối bởi doicanhden : 30-01-2012 lúc 02:02 AM. Lý do: Quên mất trong C ko có kiểu bool
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

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

    ^
    Ừ, quên mất. Phải là *pe-- mới đúng.
    Mà trong C (C99) vẫn có kiểu bool đấy nhé. C89 thì không có cả kiểu bool, comment //, lẫn cách khai báo biến tùy ý như trong code của bạn đâu.

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

    Vì đây là hộp thảo luận, góp ý nên tôi góp chỗ này cho vui.

    Bài này hồi tôi học thì có người được cho thêm điểm nhờ đưa ra thuyết có hai cách return:

    Cách return cơ bản (1 hoặc 0) như trên:
    - Code gọi hàm chỉ cần xét
    if (kt(s)) thôi chứ đâu cần phải đặt thêm biến rồi xét biến

    Cách return chỗ khác nhau (length của string nếu không có chỗ khác):
    - Code gọi hàm cần xét
    if (kt(s) >= strlen(s))

    Tuy vị GV có phê bình "để làm gì?" nhưng vẫn cho người ấy thêm điểm vì cách suy nghĩ độc đáo

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

    Trích dẫn Nguyên bản được gửi bởi VoTichSu Xem bài viết
    Vì đây là hộp thảo luận, góp ý nên tôi góp chỗ này cho vui.

    Bài này hồi tôi học thì có người được cho thêm điểm nhờ đưa ra thuyết có hai cách return:

    Cách return cơ bản (1 hoặc 0) như trên:
    - Code gọi hàm chỉ cần xét
    if (kt(s)) thôi chứ đâu cần phải đặt thêm biến rồi xét biến

    Cách return chỗ khác nhau (length của string nếu không có chỗ khác):
    - Code gọi hàm cần xét
    if (kt(s) >= strlen(s))

    Tuy vị GV có phê bình "để làm gì?" nhưng vẫn cho người ấy thêm điểm vì cách suy nghĩ độc đáo
    cùng câu hỏi với giáo viên.

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

    Theo mình thì cái bài mà VTS nói nó như này :
    Cách 1 : Nếu là đối xứng / không : thì return 0 /1
    Cách 2 : Return vị trí dừng của quá trình kiểm tra. Nếu kiểm tra thông suốt thì vòng lặp dừng khi về cuối chuỗi (hoặc ở giữa chuỗi nếu chỉ cần cho chạy vào giữa) . Còn nếu ko thông suốt tại chỗ nào thì dừng tại ngay chỗ đó luôn.

    Vậy : Nếu hàm trả về cuối chuỗi ( hoặc giữa chuỗi nếu theo tư tưởng chạy vào giữa) thì YES. Còn chưa về cuối chuỗi(vị trí < vị trí cuối) thì là NO
    Um Mani Padme Hum...!!

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

  1. Bài này làm ntn vậy mọi người? ai biết giúp mình với
    Gửi bởi hienchuot trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 1
    Bài viết cuối: 21-11-2012, 11:10 PM
  2. Trả lời: 3
    Bài viết cuối: 14-10-2012, 12:26 AM
  3. Vấn đề CRM có bạn nào biết chỉ giúp mình với
    Gửi bởi congtuazx trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 1
    Bài viết cuối: 28-10-2009, 12:05 PM
  4. máy tính tui bị lỗi bạn nào biết chỉ giúp với
    Gửi bởi khaivan trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 25-12-2008, 09:31 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