Hỏi về truyền tham số vào hàm

import java.util.Scanner;

public class Hello {
	public static void main(String[] args) {
		int c=15;
		int d=5;
		int e= 20;
		int min3s = findmin3s(c,d,e);
		System.out.println("so nho nhat trong 3 so la: "+min3s);
	}	
		
		
	public static int findmin(int a, int b)
	{	
		int min;
		if(a<=b)
			min =a;
		else
			min = b;
		return min;		
	}
	public static int findmin3s(int c, int d, int e)
	{	int min ;
		min = findmin(e, findmin(c, d));
		return min;
	}
}

trong hàm findmin em truyền vào tham số là a,b, còn trong code này min = findmin(e, findmin(c, d)); đáng lẽ phải không chạy vì khong đúng tham số chứ .

đoạn trên là code 1. còn đây là code 2 . Em biết là khi nhập số = bàn phím thì không cần truyền tham số vào hàm nhưng em muốn test thử .

import java.util.Scanner;
public class Hello {
	public static void main(String[] args) {
		int min3s = findmin3s(5,6,7);
		System.out.println("so nho nhat trong 3 so la: "+min3s);
	}	
		
		
	public static int findmin(int a, int b)
	{	
		Scanner scanner = new Scanner(System.in);
		int min;
		a = scanner.nextInt();
		b = scanner.nextInt();
		if(a<=b)
			min =a;
		else
			min = b;
		return min;
	}
	public static int findmin3s( int a, int b,int c)
	{
		Scanner scanner = new Scanner(System.in);
		int min;
		min = findmin(a,findmin(b,c));
		return min;
		
	}

}

khi em thực hiện code này , java lại yêu cầu nhập vào 4 số. sau khi nhập 1 2 3 4 thì nó xuất ra giá trị nhỏ nhất là 3 .Tại sao lại ra lỗi này vậy ạ, Mặc dù code này dựa vào code ở trên chỉ khác là có nhập từ bàn phím .

merged to the #1 post by noname00

có gì không đúng đâu bạn?

3 Likes

à bỏi vì mình truyền thàm số trong hàm findmin là a,b . Khi gọi hàm findmin thì e là giá trị của tham số a, findmin(c,d) là giá trị của tham số b đúng không bạn

đúng, vậy bạn thấy sai chỗ nào?

là do khi mình chạy code 2 thì code nó chạy sai nên mình nghĩ dòng đó bị sai . Nên hỏi thử cho chắc ăn .

Bạn thử giải thích từng dòng trong đoạn code này làm gì xem?
Rồi so sánh nó với findmin trong đoạn code 1 ở trên xem nó giống và khác nhau ở chỗ nào thế?

3 Likes

trong hàm findmin ta truyền vào 2 tham số a và b có kiểu giá trị int, Scanner thì dùng để nhập giá trị từ bàn phím. Khởi tạo min vs kiểu int, gía trị a nhập từ bàn phím với kiểu int , giá trị b nhập từ bàn phím. Mình thấy nó giống nhau mà .

Cái sai của bạn là có truyền tham số vào hàm, nhưng lại ghi đè giá trị của tham số. Kết quả số nhỏ nhất = 3 là đúng.
Bạn có biết khi gọi: findmin(a, findmin(b, c)); thì findmin() nào sẽ chạy trước không?

5 Likes

ax đúng rồi ban, kq là 3 . findmin(a, findmin(b, c)) trong đoạn code này mình nghĩ findmin (b,c) chạy trước không biết có đúng ko ? . Vậy làm cách nào để không ghi đè giá trị tham số vậy bạn.

Theo S trong SOLID, trong hàm findmin bạn chỉ tìm min các số trong hàm, còn việc đọc số là việc trong hàm khác.

5 Likes

Dành cho bạn chưa biết thì SOLID là tập hợp của 5 nguyên lý thiết kế trong OOP:

  1. Single responsibility principle
  2. Open/closed principle
  3. Liskov substitution principle
  4. Interface segregation principle
  5. Dependency inversion principle

Đây là 5 nguyên lý được đúc kết từ kinh nghiệm xương máu của ông cha ta… À nhầm, đây là 5 nguyên lý được đúc kết bởi máu xương vô số developer, rút ra từ hàng ngàn dự án thành công và thất bại (trích từ Tôi đi code dạo). Mà có khi cái này cũng trở thành luật ngầm trong giới lập trình viên rồi cũng nên :V.

S trong SOLID mà @noname00 nói còn có tên đầy đủ là Single responsibility principle (nguyên lý trách nhiệm/vai trò duy nhất), nguyên lý này phát biểu:

Một class chỉ nên giữ 1 trách nhiệm duy nhất
(Chỉ có thể sửa đổi class với 1 lý do duy nhất)

Ngoài áp dụng cho class ra thì nguyên lý này còn áp dụng trong hàm, biến,… Xét ở trong đoạn code của bạn thì hàm findmin() chỉ thực hiện việc tìm giá trị nhỏ nhất thôi (theo đúng ý nghĩa của tên hàm), mấy cái nhập xuất dữ liễu hãy để chỗ khác.

5 Likes

thanks bạn không ngờ tưởng hỏi câu đơn giản nó ra 1 đống thứ

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