Thắc mắc 1 ý (thủ thuật) nhỏ trong code kiểm tra mảng dương
Xin chào. Dưới đây mình có 1 đoạn code nhập mảng rồi kiểm tra mảng dương. Thật ra mình chỉ thắc mắc 1 ý nhỏ nên nếu ai rãnh thì đọc cả đoạn code luôn nhé, không thì đọc cái đoạn mình nói thôi
Code:
#include <stdio.h>
#include <conio.h>
#include <Windows.h>
void NhapMang(int a[], int &n);
bool KiemTra (int a[], int n);
void NhapMang(int a[], int &n)
{
do
{
printf("Nhap so luong phan tu: ");
scanf("%d",&n);
if (n < 0 || n > 100)
printf("So luong phan tu khong hop le, xin moi kiem tra lai
");
}
while (n < 0 || n > 100);
for (int i = 0; i < n; i++)
{
printf("Nhap phan tu %d: ",i+1);
scanf("%d",&a[i]);
}
}
bool KiemTra(int a[], int n)
{
for (int i = 0; i < n; i++)
{
if (a[i] <= 0)
return false;
}
return true;
}
int main()
{
int a[100];
int n;
NhapMang(a,n);
if (KiemTra(a,n))
printf("Mang khong co so am
");
else
printf("Mang co so am
");
getch();
return 0;
}
Ở cái hàm bool KiemTra
thì có đoạn code:
Code 1:
for (int i = 0; i < n; i++)
{
if (a[i] <= 0)
return false;
}
return true;
nhưng nếu mình sửa lại như sau thì sai, mặc dù không hiểu
Code 2:
bool KiemTra(int a[], int n)
{
for (int i = 0; i < n; i++)
{
if (a[i] > 0)
return true;
}
return false;
Theo mình thì thấy 2 đoạn code nhỏ trên đều tương đồng nhau nhưng sao đoạn code 2 lại chạy sai nhỉ, nếu 1 mảng mà toàn số dương nhưng có 1 số âm thì nó vẫn báo dương, chỉ khi nào mảng nhập không có số dương nó mới báo âm.
Còn code 1 thì đúng!
Ai giúp mình nhé! Xin cảm ơn!
Bạn nên dùng cái bảng để đưa ra một dãy số và phân tích code sẽ thấy ngay. Còn ngồi đọc đố mà biết, mình viết ra bảng và phân tích cho bạn đoạn code 2 nè:
giả sử có mảng là 5 -1 9 6 3 4 7
Ta sẽ cho i chạy hen:
i = 0 tức 5 : lớn hơn không, true
Mà đã return true rồi thì không làm gì nữa,thoát khỏi vòng for luôn.
Còn giả sử mảng là -1 2 4 3 6
i = 0 tức -1: nhỏ hơn không, không return true gì hết, chạy tiếp
i = 1 tức 2: lớn hơn không, return true và thoát luôn, không làm gì nữa
Muốn nó đừng nhảy ra khỏi for thì ta dùng biến trung gian để kiểm tra, không vội vàng return.
Nhắc lại lần nữa: viết lên bảng với ví dụ đầu vào là một vài mảng để “thử nghiệm” sẽ thấy.
Ý nghĩa của 2 code là khác nhau, code 1 đúng, code 2 chỉ kiểm tra xem mảng có tồn tại 1 số dương hay không
Về ý nghĩa code có thể giải thích:
Cảm ơn nhé nhưng ý mình không phải là phân tích để hiểu mà là không hiểu mấy cái return
Tức là trong code 2: Nếu giả sử cho 3 phần tử lần lượt là -1 ; -2 ; 3
Lần 1:
-1
cho vào và thấy không lớn hơn 0, thực hiện lần 2Lần 2:
-2
cho vào và thấy vẫn không lớn hơn 0, qua lần 3Lần 3:
3
lớn hơn 0, trả về True => IN ra màn hình “Mang khong co so am”Vậy điều tớ không hiểu ở đây là thằng
return false
không được thực hiện sao, tức là khi chạy xong giá trị3
thì nó sẽreturn true
và sẽ thoát ra khỏi vòng lặp for, nhưng khi thoát nó vẫn gặp câu lệnhreturn false;
nhưng trong hàm Main thì nó vẫn True (tức in ra “Mang khong co so am”), vậy thì sao thằngreturn false
không được thực hiện (trong hàm KiemTra)Anh xem cái bài viết em vừa viết ở trên và giải thích thử ạ? Vì em k rõ lắm
Đã return rồi thì thoát ra ngoài, return kết quả cho cái hàm function XXX luôn chứ không trả vô for , vì for làm gì có nhận được giá trị nào mà nó chỉ là keyword của C/C++. Hàm đã nhận kết quả rồi thì làm gì có làm gì nữa các đoạn code còn lại?
Hơi mập mờ tí Vậy là trong for đã
return true
thì thoát khỏi functioni luôn hả?Bạn không học bài à? Đọc chương giải thích về return đi đã, cụ thể cho C/C++ . Bạn không biết return để làm gì mà dám viết vào code của bạn? (Lỡ nó làm cháy máy tính của bạn thì sao ) Thật là mình không hiểu nổi bạn đang định làm cái gì nữa?
Mình biết return mà. Chỉ k hiểu return trong trường hợp ấy thoôi
Một câu nói về return trong C/C++ rất rõ:
When a line of code in a function that says: “return X;” is executed, the function “ends” and no more code in the function is executed. The value of X (or the value in the variable represented by X) becomes the result of the function.
Còn không hiểu nữa thì có nghĩa là bạn không chịu đọc sách chứ mình không nghĩ bạn là một người dạng kém về trí não đâu, chẳng qua là lười
À. Mình hiểu rồi. Mình quên mất vì bận học khá lâu. Nếu bạn nói mình lười thì mình xin nhận. Vi đâu ai hiểu dc life người khác. Mà đúng là lười thật xin cảm ơn những lời góp ý của bạn nhé! Dạy nhau học mà
Topic mình xin dừng nhé! Cảm ơn mọi người đã giúp đỡ.