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

Đề tài: [C] Sự cố về chuổi. Help..help

  1. #1
    No Avatar
    letuyetnhung Khách

    Thumbs down [C] Sự cố về chuổi. Help..help

    C Code:
    1. #include <stdio.h>
    2. #include <ctype.h>
    3. #include<conio.h>
    4. void main()
    5. {
    6.   char chuoi[10];
    7.   int i = 0, count = 0;
    8.  
    9.   printf("\nNhap vao mot chuoi bat ky : ");
    10.   gets(chuoi);
    11.  
    12.   while (chuoi[i] != 0)
    13.   {
    14.     if (isalpha(chuoi[i++]))
    15.       count++;
    16.   }
    17.  
    18.   printf("So ky tu trong chuoi = %d", count);
    19.   getch();
    20. }
    Cho em hỏi câu lệnh này
    while (chuoi[i] != 0)
    {
    if (isalpha(chuoi[i++]))
    count++;
    }
    mình hiểu như thế nào??
    vd như:
    1./ em nhập vào là "I LOVE YOU" thì while (chuoi[0] != 0) ==>Tại sao chuoi[0] phải khác 0???
    2./Thằng isalpha có phải là 1 hàm ko?? Và isalpha(chuoi[i++]) thì mình hiểu như thế nèo???

    * Chú ý cho code vào thẻ tag code, xem hướng dẫn tại đây
    Đã được chỉnh sửa lần cuối bởi QuangHoang : 29-09-2008 lúc 06:28 PM.

  2. #2
    Ngày gia nhập
    12 2006
    Bài viết
    72

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

    while (chuoi[i] != 0)
    {
    if (isalpha(chuoi[i++]))
    count++;
    }
    Mình thử giải thích theo ý hiểu của mình nhé:
    thứ nhất:
    Câu lệnh
    while (chuoi[i] != 0)
    {
    if (isalpha(chuoi[i++]))
    count++;
    }
    dùng để đếm số kí tự trong chuỗi chuoi,nó hoạt động như sau: trong khi phần tử thứ i thỏa mãn là kí tự trong chuoi (khác 0)==>kiểm tra xem phần tử đó có nằm trong khoảng từ A-Z hoặc từ a-z không? (isalpha(chuoi[i++])),nếu thỏa mãn thì tăng biến đếm count lên 1 đơn vị.
    thứ 2:
    isalpha(int x); là một hàm trong thư viện ctype.h dùng để lấy giá trị của x là các chữ cái từ A-Z hoặc từ a-z.
    Chúc bạn vui vẻ!

  3. #3
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Trích dẫn Nguyên bản được gửi bởi letuyetnhung Xem bài viết
    #include <stdio.h>
    #include <ctype.h>
    #include<conio.h>
    void main()
    {
    char chuoi[10];
    int i = 0, count = 0;

    printf("\nNhap vao mot chuoi bat ky : ");
    gets(chuoi);

    while (chuoi[i] != 0)
    {
    if (isalpha(chuoi[i++]))
    count++;
    }

    printf("So ky tu trong chuoi = %d", count);
    getch();
    }


    Cho em hỏi câu lệnh này
    while (chuoi[i] != 0)
    {
    if (isalpha(chuoi[i++]))
    count++;
    }
    mình hiểu như thế nào??
    vd như:
    1./ em nhập vào là "I LOVE YOU" thì while (chuoi[0] != 0) ==>Tại sao chuoi[0] phải khác 0???
    2./Thằng isalpha có phải là 1 hàm ko?? Và isalpha(chuoi[i++]) thì mình hiểu như thế nèo???

    Bạn có thể hiểu như thế này, chuỗi trong C là một mảng các kí tự, ngôn ngữ C sẽ nhận biết kết thúc một chuỗi do người dùng nhập vào bằng việc kết thúc chuỗi bằng kí tự có mã ASCII là \0 (hay NULL) , như vậy câu lệnh:
    while (chuoi[i]!=0) { .....} dùng để duyệt qua các kí tự của chuỗi, cho đến khi gặp ký tự kết thúc chuỗi sẽ ra khỏi vòng lặp. Lưu ý: 0 ở đây là giá trị NULL chứ không phải giá trị số 0.
    câu 2/ isalpha() là 1 hàm, hàm này dùng để kiểm tra là các kí tự ('a' .. 'z' và 'A' .. 'Z') (nó không kiểm tra các kí số đâu nhé). Để biết thêm thông tin về hàm này, trên màn hình gõ code, nhấp chuột phải vào từ isalpha để xem về công dụng của hàm này.

  4. #4
    No Avatar
    letuyetnhung Khách

    vậy em ví dụ:Em nhap vào chuổi

    ANH YEU
    0123456

    ==>1 chuổi gồm 7 ki tự (có 1 space)
    vòng while(chuoi[i] !=0) <=>đúng mới làm, sai thì chấm dứt==> Vậy lúc đấu i=0; =>chuoi[0] là kí tự "A"{ vậy thằng A này !=0 đúng với yêu cầu câu lệnh}, tiếp tục if (isalpha(chuoi[i++])) <=>if(isalpha(chuoi[1])) {nghĩa là nếu chuổi[1] là "kí tự" thì count = 1; mà đển hình ở đây là kí tự "N"}
    Và tiếp tục i=1 là N, chuoi[2] là kí tự "H"=>count = 2,i=2 là H,chuoi[3] là "khoảng trắng" ==>if (isalpha(chuoi[i++])) này bị sai==>ct dừng lại và xuất count = 2 chứ đâu phải là 3
    Với lại ct đâu có chạy lại vòng while nữa đâu mà đếm chử "YEU"
    ?????????????????????????????????????????????????? ????????????
    Tức óa..........huynh làm ơn giải thích "cặn kẻ" cho em hiểu đi.


    Admin ơi??Coi lại dùm em mấy cái smile đi, với lại code, quota gì đâu mà sài hỏng được gì hết.
    Đã được chỉnh sửa lần cuối bởi letuyetnhung : 02-03-2007 lúc 06:07 PM.

  5. #5
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    if (isalpha(chuoi[i++]))
    í đã lộn chỗ này rồi , chương trình chỉ dừng lại khi điều kiện ở câu lệnh while không thỏa mãn hay đã duyệt đến cuối chuỗi kia mà . Còn câu lệnh if này chỉ là điều kiện để đếm thôi .

  6. #6
    No Avatar
    letuyetnhung Khách

    Mặc định [C] Sự cố về chuổi. Help..help

    ý mình ko phải như vậy.
    Mình nói là while (chuoi[i] != 0) đã sai khi nó chạy đến "ANH " vì kế tiếp "H" là "khoảng trắng". làm sao có thể đếm các kí tự "Y", rồi "E", rồi "U" chớ!!!
    Bạn đọc kĩ lại giùm mình đi, chổ tô đậm ấy!!
    ANH YEU
    0123456


    ==>1 chuổi gồm 7 ki tự (có 1 space)
    vòng while(chuoi[i] !=0) <=>đúng mới làm, sai thì chấm dứt==> Vậy lúc đấu i=0; =>chuoi[0] là kí tự "A"{ vậy thằng A này !=0 đúng với yêu cầu câu lệnh}, tiếp tục if (isalpha(chuoi[i++])) <=>if(isalpha(chuoi[1])) {nghĩa là nếu chuổi[1] là "kí tự" thì count = 1; mà đển hình ở đây là kí tự "N"}
    Và tiếp tục i=1 là N, chuoi[2] là kí tự "H"=>count = 2,i=2 là H,chuoi[3] là "khoảng trắng" ==>if (isalpha(chuoi[i++])) này bị sai==>ct dừng lại và xuất count = 2 chứ đâu phải là 3

  7. #7
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Trích dẫn Nguyên bản được gửi bởi letuyetnhung Xem bài viết
    ý mình ko phải như vậy.
    Mình nói là while (chuoi[i] != 0) đã sai khi nó chạy đến "ANH " vì kế tiếp "H" là "khoảng trắng". làm sao có thể đếm các kí tự "Y", rồi "E", rồi "U" chớ!!!
    Bạn đọc kĩ lại giùm mình đi, chổ tô đậm ấy!!
    ANH YEU
    0123456


    ==>1 chuổi gồm 7 ki tự (có 1 space)
    vòng while(chuoi[i] !=0) <=>đúng mới làm, sai thì chấm dứt==> Vậy lúc đấu i=0; =>chuoi[0] là kí tự "A"{ vậy thằng A này !=0 đúng với yêu cầu câu lệnh}, tiếp tục if (isalpha(chuoi[i++])) <=>if(isalpha(chuoi[1])) {nghĩa là nếu chuổi[1] là "kí tự" thì count = 1; mà đển hình ở đây là kí tự "N"}
    Và tiếp tục i=1 là N, chuoi[2] là kí tự "H"=>count = 2,i=2 là H,chuoi[3] là "khoảng trắng" ==>if (isalpha(chuoi[i++])) này bị sai==>ct dừng lại và xuất count = 2 chứ đâu phải là 3
    Oh no, bạn hiểu lầm rồi, while (chuoi[i]!=0) dùng để kiểm tra kí tự thứ i trong chuỗi có phải là kí tự kết thúc chuỗi hay không chứ không phải là khoảng trắng như bạn nghĩ, bởi thế với từ:ANH YEU bạn nhập vào, nó sẽ lặp cho đến hết chuỗi ,và biến count cuối cùng sẽ bằng 6 (trong chuỗi này có 6 kí tự A,N,H,Y,E,U ; khoảng trắng không phải là kí tự).
    Chương trình mà bạn hỏi được lấy trong cuốn "500 bài tập C" đúng hôn? Nó chạy không sai đâu!

  8. #8
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Mình nói là while (chuoi[i] != 0) đã sai khi nó chạy đến "ANH " vì kế tiếp "H" là "khoảng trắng". làm sao có thể đếm các kí tự "Y", rồi "E", rồi "U" chớ!!!
    Mình có nói là câu lệnh while trên là dùng để kiểm tra cuối chuỗi hay chưa mà . đk != 0 ở đây không phải là khoảng trắng bạn hiểu không mà là đk ở cuối chuỗi hày chưa . Trong 1 chuỗi luôn có 1 kí tự cuối cùng \0 được gọi là kí tự null . Nếu thấy mơ hồ thì bạn có thể đối đk lại thế này nè
    while(chuoi[i]!= NULL)
    nó vẫn chạy đúng thôi .

  9. #9
    No Avatar
    letuyetnhung Khách

    rồi..Ok!!Thanks các bác.
    Vậy nếu em nhập "ANH YEU EM" thì làm sao em chỉ lấy chữ "YEU"???Em định dùng con trỏ để làm nhưng hầu như phần này thầy em chỉ nói sơ, ko cho làm bài tập gì cả.

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

    Ý của bạn là muốn trích những ký tự từ một chuỗi à? Nếu thế thì cũng không cần dùng con trỏ, chỉ cần dùng 1 mảng thứ 2, và hàm strcpy() (mình quên mất đối số của hàm này rồi) nhưng cụ thể là bạn sao chép chữ "YEU" vào mảng thứ 2.

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

  1. Bài tập C++ Cách để so sánh 2 chuỗi kí tự giữa chuỗi nhập từ phím và chuỗi từ file xem có giống nhau không?
    Gửi bởi davilson18 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 09-06-2012, 09:47 AM
  2. Lập trình C Thay thế chuỗi s1 trong chuỗi s bằng chuỗi s
    Gửi bởi duytue trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 23-09-2011, 04:16 PM
  3. thay thế chuỗi con thứ i trong chuỗi mẹ bằng 1 chuỗi khác
    Gửi bởi nhat1811 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 06-08-2011, 08:25 AM
  4. Trả lời: 1
    Bài viết cuối: 29-06-2011, 12:02 AM
  5. xem một từ trong chuỗi là một chuỗi con, sắp xếp các chuỗi con theo thứ tự tăng dần
    Gửi bởi qpkdct1101 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 20-01-2011, 08:22 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