Hỏi về vòng lặp có điều kiện là 'ký tự'

   #include <stdio.h>
    int main()
    {
        int thang,nam;
        char cont;
        while(1==1)
        {
            printf("nhap nam");
            scanf("%d",&nam);
            do
            {
                printf("nhap thang");
                scanf("%d",&thang);
            }
            while(thang<1||thang>12);
            if(thang==4 || thang==6 || thang==9 || thang==11)
            {
                printf("30 ngay");
            }
            else if(thang==2)
            {
                if((nam%4)==0)
                {
                    printf("29 ngay");
                }
                else
                {
                    printf("28 ngay");
                }
            }
            else
            {
                printf("31 ngay");
            }
            do
            {
                printf("\nDo you want continue? (y/n)\n");
                scanf("%c",&cont);
                scanf("%c",&cont);
            }
            while(cont!='y'||cont!='n');
            if(cont=='n')
            {
                break;
            }
        }
    }

Hơi dài nhưng mình gặp vấn đề khi chạy chương trình nằm ở câu ‘do…while’ cuối cùng:

    do
            {
                printf("\nDo you want continue? (y/n)\n");
                scanf("%c",&cont);
                scanf("%c",&cont);
            }
    while(cont!='y'||cont!='n');

Khi chạy nó cứ lặp Do you want continue? mãi.
Ai giúp với, cảm ơn nhiều!
Tiện thể ai có thể giải thích cho mình tại sao phải dùng 2 cái scanf() ở đoạn đó không?
1 cái scanf() thì nó chạy bỏ qua việc nhập giá trị!

Thay vì dùng 2 hàm scanf để lấy thì bạn có thể thêm dòng fflush(stdin) để xóa bộ nhớ đệm trước khi scanf.
Còn vòng lập do while của bạn, bạn hãy xem lại code trong lệnh do của bạn có những gì.
Còn điều kiện dừng của bạn có nghĩa là “cont khác y hoặc là cont khác n thì vòng lập sẽ tiếp tục”. Vậy nó lập vô hạn rồi :smile:

Ý bạn muốn là nếu nhập y thì chương trình sẽ tiếp tục cho nhập năm và tháng để tính ngày. Và nhập n thì sẽ thoát đúng không. Thế thì bạn nên bỏ luôn cái hàm do while phía dưới đi. Chỉ sử dụng đúng 1 vòng do while để lập thôi. Dạng như:

do
{
   //code
   printf("Y/N");
   scanf(var);
}while(điều kiện lặp)
4 Likes

Không, ý mình là:

  • Dòng ‘do…while’ là: nếu nhập ký tự khác ‘y’ hay ‘n’ thì sẽ yêu cầu nhập lại.

  • Còn dòng ‘if’ kế đó là: nếu nhập ‘y’ sẽ lặp lại ngày tháng, ‘n’ sẽ break.

Nhưng khi chạy nó vẫn lặp lại dòng’ Do you want continue’ bất kể nhập ‘y’ hay ‘n’


Không biết ai có cách nào khác, hay sai chỗ nào giúp mình với.

Sửa như @Chanh_Huynh chỉ đi!

Thử nhé:

while(cont!='y'&&cont!='n'); // &&
4 Likes

OH, cho mình hỏi tại sao lại là ‘&&’ mình tưởng ‘&&’ = rỗng ∅

Cho mình hỏi tại sao lại phải xóa bộ đệm, mình đâu có gán ‘cont’ lúc nào đâu, ( mình mới học nhập môn thôi :sweat_smile: )

Xóa bộ đệm của stdin (dữ liệu nhập) chứ không phải biến cont của bạn.
Chính xác là đẩy (flush) dữ liệu bộ đệm (tạm) vào luồng (stream), sau đó xóa bộ đệm.
Chắc bạn chưa hiểu đâu! :smiling_imp:

3 Likes

ok, mình sẽ tìm hiểu thêm :ok_hand: :thinking:

&& là toán tử logic, bạn có thể xem lại bằng Tiếng Việt hoặc Tiếng Anh

3 Likes

Cảm ơn, mình đã lẫn lộn đôi chút

1 Like

Mình đã tìm hiểu về xóa bộ đệm bàn phím rằng nó có xóa dấu ‘enter’. Và khi chạy nó có 2 dòng ’ do you want to continue’. (Mình không ấn ‘enter’)

fflush(stdin);
            do
            {
                printf("Do you want continue? (y/n)");
                scanf("%c",&cont);
            }
            while(cont!='y'&&cont!='n');


Làm phiền lần cuối.

Thủ thuật để loại bỏ các dấu cách/xuống dòng trước đó: scanf(" %c", &cont);. Có thấy dấu cách không?

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