30/09/2018, 20:43

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!

Vô Thin viết 22:51 ngày 30/09/2018

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.

Gió viết 22:53 ngày 30/09/2018

Ý 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:

  • code 1: tất cả các giá trị của mảng dương
  • code 2= !(code 1): với kiến thức lớp 10 thì phụ định của tất cả là tồn tại 1 phần tử >0, hay nói cách khác code 2 kiểm tra mảng có toàn số <0 hay không
Người bí ẩn viết 22:57 ngày 30/09/2018

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 2
Lần 2: -2 cho vào và thấy vẫn không lớn hơn 0, qua lần 3
Lầ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ệnh return 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ằng return false không được thực hiện (trong hàm KiemTra)

Người bí ẩn viết 22:54 ngày 30/09/2018

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

Vô Thin viết 22:56 ngày 30/09/2018

Đã 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?

Người bí ẩn viết 22:48 ngày 30/09/2018

Hơi mập mờ tí Vậy là trong for đã return true thì thoát khỏi functioni luôn hả?

Vô Thin viết 22:48 ngày 30/09/2018

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?

Người bí ẩn viết 22:50 ngày 30/09/2018

Mình biết return mà. Chỉ k hiểu return trong trường hợp ấy thoôi

Vô Thin viết 22:51 ngày 30/09/2018

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

Người bí ẩn viết 22:50 ngày 30/09/2018

À. 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à

Người bí ẩn viết 22:56 ngày 30/09/2018

Topic mình xin dừng nhé! Cảm ơn mọi người đã giúp đỡ.

Bài liên quan
0