Hàm đúng với vòng lặp do...while nhưng sai với while?

Có cao thủ nào giải thích hộ mình với, hàm sau đúng với vòng lặp do…while nhưng sai với while :slight_smile:

#include <stdlib.h>
long dodaichuoi(const char* chuoi);
int main()
{
    char chuoi[]="xinchao";
    printf("Chuoi %s dai %ld ky tu\n",chuoi,dodaichuoi(chuoi));
    return 0;
}
long dodaichuoi(const char* chuoi)
{
    char kytuhientai=0;
    long soluongkytu=0;
    while(kytuhientai!='\0')
    {
        kytuhientai=chuoi[soluongkytu];
        soluongkytu++;
    }

     soluongkytu--;
    return soluongkytu;
}

soluongkytu =-1
trong khi với hàm do…while soluongkytu=7(đúng)

#include <stdlib.h>
long dodaichuoi(const char* chuoi);
int main()
{
    char chuoi[]="xinchao";
    printf("Chuoi %s dai %ld ky tu\n",chuoi,dodaichuoi(chuoi));
    return 0;
}
long dodaichuoi(const char* chuoi)
{
    char kytuhientai=0;
    long soluongkytu=0;
    do
    {
        kytuhientai=chuoi[soluongkytu];
        soluongkytu++;
    }
    while(kytuhientai!='\0');
     soluongkytu--;
    return soluongkytu;
}

không hiểu vì sao lại thế ?

do while : thực thi trước, kiểm tra điều kiện sau.
while : kiểm tra điều kiện trước khi thực thi.

Về quy trình nó đã ngược nhau nên đem điều kiện và lệnh thực thi của thằng này ốp y chang cho thằng kia thì sẽ sai.

4 Likes

trước giờ mình dùng while vẫn đúng, mà mình thấy điều kiện có vấn đề gì đâu ?

Vấn đề nó nằm ở thời điểm kiểm tra điều kiện và thời điểm thực thi lệnh.
Mặc dù bạn thấy code điều kiện hoàn toàn going nhau, nhưng do thời điểm nó khác nhau thì giá trị tại thời điểm kiểm tra nó sẽ khác nhau.

4 Likes

mình chưa rõ lắm, bạn có thể nói thêm không ?

Hai trường hợp trên của bạn khác lúc kiểm tra '\0'.
do . . while thì tuy điều kiện sai nhưng soluongkytu đã được tăng rồi.
Còn while thì điều kiện sai :point_right: out luôn không xin xỏ gì hết, nên sẽ thua do . . while một vòng lặp. :slight_smile:

2 Likes

Code 1: while

char kytuhientai=0;
long soluongkytu=0;
while(kytuhientai!='\0') // thời điểm kiểm tra trước khi thực thi. Lúc này **kytuhientai = 0**.

Code 2: do - while

do{
    kytuhientai=chuoi[soluongkytu];
    soluongkytu++;
}
while(kytuhientai!='\0'); // thời điểm kiểm tra điều kiện nằm phía sau đoạn code xử lý. Lúc này **kytuhientai=chuoi[soluongkytu]**;
1 Like

nhưng nếu điều kiện sai thì sao hàm while vẫn chạy được, soluongkytu trả về giá trị -1 ?

Mình nói điều kiện sai thì while chạy lúc nào nhỉ. :thinking:
Chỉ có do . . while chạy nốt vòng lặp cuối cùng thôi chớ.

2 Likes

While không chạy. Nó chạy xuống thực thi lệnh.

soluongkytu--;

Do soluongkytu được gán 0 từ đầu nên nó sẽ có kết quả -1 sau khi thực thi lệnh trên.

2 Likes

nếu điều kiện của while sai thì máy sẽ báo lỗi chứ, sao vẫn trả về giá trị được ?

Nó không phải là lỗi. Nó là tính năng. :smile:
Lỗi là khi đoạn lệnh vi phạm các quy tắc tính toán và máy không tính được thì nó mới gọi là lỗi.
Ví dụ chia cho 0. Thao tác với con trỏ nullptr.

3 Likes

while đk đúng :point_right: lặp, đk sai :point_right: thoát vòng lặp.

Ai bảo bạn sai báo lỗi vậy. :slight_smile:

2 Likes

cám ơn các bạn, để mình tìm lại đk xem sao.

Chưa hiểu kĩ logic của nó mà đã vội code rồi lại thắc mắc này. Càng lúc mình càng thấy việc học mà không có người hướng dẫn nó mông lung tới mức nào, như comment của thớt, người tự học còn phải sử dụng giả định để vượt qua những chỗ khó hiểu (vì có ai hướng dẫn đâu).
Thiên tài thì lại khác.

4 Likes

Có thể điều kiện đúng nhưng 2 thằng này có thời điểm kiểm tra điều kiện khác nhau thì có thể sẽ cho ra kết quả khác nhau. 1 thằng kiểm tra OK pass thì mới thực hiện, 1 thằng cứ làm đi đã rồi check có cho thực hiện tiếp sau.

Lỗi tính toán thì không máy nào báo nổi đâu bạn. Chỉ có lỗi cú pháp hoặc lỗi vi phạm hoạt động thì mới báo thôi

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?