01/10/2018, 09:11

Hỏi về thuật toán "bỏ gì vào cũng chạy"

Mình học c#,hôm nay thực hành với mảng phân số,có vài yêu cầu na ná nhau như:

-Tính diện tích hình thang
-Tính diện tích hình chữ nhật
-Tính diện tích hình vuông
-Tính diện tích hình tam giác

Như mình code thì cần cần 3 hàm cho 3 ý này nhưng thầy code không biết kiểu gì 1 hàm ngắn ngủn và đưa vào các thông số thế là hàm tự nhận diện các thông số đó thuộc hình gì và diện tích hình đó bao nhiêu,hỏi thầy thầy kêu về tìm hiểu mà nói thật chưa biết tí gì về nó mà tìm hiểu nên lên đây nhờ ACE cho mình cái keyword ( nếu tài liệu thì càng tốt ) và nếu được em xin 1 code mẫu ngắn gọn cùng giải thích nó thì tuyệt vời luôn.

Em xin chân thành cảm ơn

Tuấn Tử Tế viết 11:25 ngày 01/10/2018

Mình chưa hiểu ý bạn nói lắm.?? Bạn có thể đưa đầy đủ yêu cầu bài toán không?

Trần Hoàn viết 11:18 ngày 01/10/2018

Bạn cho mình hỏi là để tính diện tích hình thang thì mình nhập các thông số nào (2 cạnh đáy, 2 cạnh bên hay là 2 cạnh đáy, chiều cao)
Và tam giác, vuông, hcn nữa, cần những thông số gì?

Mình dùng cách “nạp chồng phương thức” tức là tham số khác nhau, tên hàm giống nhau.

Nguyễn Văn Vương viết 11:13 ngày 01/10/2018

Yêu cầu cũng như bình thường thôi,tính diện tích các hình đó với thông số nhập vào từ bàn phím,nếu là mình thì mỗi hình mình phải làm 1 hàm tính riêng biệt nhưng thầy code chỉ 1 hàm thôi,khi nhập thông số vào rồi gọi hàm đó thì hàm đó tự biết đó là hình gì và tính diện tích ( còn những hình gì mình k nhớ lắm,trên bài kia là ví dụ thui vì thầy " khè hàng "lúc gần về nên chả kịp coi rõ)

Nguyễn Văn Vương viết 11:20 ngày 01/10/2018

cũng là các thông số như bạn code thôi nhưng đây chỉ cần 1 hàm là xong á

*grab popcorn* viết 11:12 ngày 01/10/2018

Chắc là Keyword params
https://msdn.microsoft.com/en-us/library/w5zay9db.aspx

Trần Hoàn viết 11:12 ngày 01/10/2018

Một phương thức nếu không nạp chồng thì số lượng biến đầu vào phải cố định. Không thể chỉ 1 mà lại có nhiều số lượng phần tử khác nhau. (Trừ khi tham số đầu vào là biến mảng thì có thể đọc số lượng phần tử để biết xem đó là hình gì)

Nguyễn Văn Vương viết 11:21 ngày 01/10/2018

Mình đưa câu hỏi mơ hồ quá,chân thành xin lỗi bạn nhưng đó là tất cả thông tin mình có,để mình hỏi thầy thử xem thầy có cho thêm gợi ý nào không rồi sẽ up lên đây hỏi mọi người
Một lần nữa chân thành xin lỗi bạn cùng mọi người

Trần Hoàn viết 11:17 ngày 01/10/2018

Ô, cách của @drgnz drgnz có thể dùng được đấy XD
Bạn bản chất nó vẫn là biến mảng, nhưng mà việc nhập hàm bằng tay sẽ tiện hơn một chút là với biến mảng thuần tuý.

Nguyễn Văn Vương viết 11:26 ngày 01/10/2018

Vậy để tối mình về triển khai thử,cảm ơn bạn rất nhiều.

Không nhờ làm LAB nữa,cố gắng vậy,không phải đây là lần cuối,tập thức đêm hoy

Tuấn Tử Tế viết 11:14 ngày 01/10/2018

Hình tam giác và hình tứ giác là đã có số tham số khác nhau rồi. Nên mình nghĩ thầy bạn dùng nạp chồng phương thức rồi chỉ cho bạn xem hàm main. =)))

Nguyễn Văn Vương viết 11:24 ngày 01/10/2018

Cảm ơn bạn mình sẽ tìm hiểu về vấn đề này

Trần Hoàn viết 11:14 ngày 01/10/2018

Có bạn trai thì nhờ nó giải cho
@kaitoubg Không nhất thiết phải nạp chồng…

Tuấn Tử Tế viết 11:24 ngày 01/10/2018

Cách đó thì giống như bạn @drgnz đã nói ở trên. Tức là dùng mảng và xem số cạnh là bao nhiêu. Nhưng mình nghĩ học OOP thì không nên làm theo kiểu thế.

Trần Hoàn viết 11:11 ngày 01/10/2018

Chắc thầy chỉ yêu cầu kết quả thôi :)) Với cả nếu đúng là chỉ nhập các tham số cùng một loại và trả về cùng một kiểu thì dùng params ngắn gọn hơn dùng nạp chồng.

Văn Dương viết 11:13 ngày 01/10/2018

Không biết đúng không. Để đây và không nói gì thêm (câu này mới học trên phây búc )

namespace Tinh {
    class Program {
        static double Tinh(params double[] ds) {
            if (ds.Length == 1) return ds[0] * ds[0];
            else if (ds.Length == 2) return ds[0] * ds[1];
            else if (ds.Length == 3) return (ds[0] + ds[1]) * ds[2] / 2;
            return -1;
        }



        static void Main(string[] args) {
            START:
            Console.Clear();
            Console.Write("Nhap đe may:   ");
            string s = Console.ReadLine();
            string[] sp = s.Split(' ');
            List<double> ds = new List<double>();
            double d = 0;
            for (int i = 0; i < sp.Length; i++) {
                if (double.TryParse(sp[i], out d)) ds.Add(d);
            }
            double ret = Tinh(ds.ToArray());
            if (ret == -1) Console.WriteLine("Bo chiu =.=");
            else Console.WriteLine(ret);
            Console.WriteLine("Lai khong may ???? : Y = Co, N = Khong");
            GETKEY:
            ConsoleKeyInfo ki = Console.ReadKey(true);
            if (ki.Key == ConsoleKey.Y) goto START;
            else if (ki.Key != ConsoleKey.N) {
                Console.WriteLine("Gion tao ha may =.=. Nhap lai de :");
                goto GETKEY;
            }
        }
    }
}
Cong 5 viết 11:24 ngày 01/10/2018

có thể sử dụng tính đa hình của oop để giải cũng được tạo ra 1 abstract class hình học rồi cho các class kia extends và override lại method tính diện tích khi dùng thì khởi tạo đối tượng tương ứng rồi truyền tham số vào…

Tâm Ninja viết 11:20 ngày 01/10/2018
public int magicMethod(int bottom, int top, int height){
    return (bottom + top) * height / 2;
}

Giả sử là dữ liệu nhập vào không cần validate. Yo!..

Tính hình thang: magicMethod(10, 15, 20)
Tính hình chữ nhật magicMethod(10, 10, 20)
Tính hình vuông magicMethod(10, 10, 10)
Tính tam giác: magicMethod(10, 0, 20)

NG viết 11:12 ngày 01/10/2018

key word
default value parameters
optional parameters

Cái này viết thẳng chưa có test

long dientich (int chieucao, int day1=null, int day2=null){
    if (day1 == null) day1 = chieucao;
    if (day2 == null) day2 = day1;
    return (chieucao*(day1+day2)/2);
}

code python
Cái này đã tést và chạy

def dientich (haut, large1 = None, large2 = None):
    if large1 is None:
        large1 = haut
    if large2 is None:
        large2 = large1
    return haut*(large1+large2)/2

Diện tích hình thang : dientich(10,15,18)
Diện tích hình vuông : dientich(10)
Diện tích hình chữ nhật : dientich(10,15)
Diện tích hình tam giác : dientich(10,15,0)

Nguyễn Văn Vương viết 11:26 ngày 01/10/2018

Cảm ơn tất cả mọi người , mình sẽ nghiên cứu rồi tiếp tục đăng cậu hỏi tại topic này

Một lần nữa cảm ơn mọi người rất nhiều.

Bài liên quan
0