Câu hỏi liên quan

Là sử dụng goto một cách hợp pháp để thoát ra khỏi hai vòng?


0 Phiếu
Đã hỏi 08/3/2016 bởi NyyTreib (69,360 điểm)
Tôi sẽ giải quyết vấn đề 9 trên dự án Euler . Giải pháp của tôi tôi sử dụng một statement "goto" để thoát ra khỏi hai cho vòng lặp. Vấn đề là như sau:
A Pytago triplet là một tập hợp của ba số tự nhiên, c b, mà, một ^ 2 + b ^ 2 = c ^ 2 ví dụ, 3 ^ 2 + 4 ^ 2 = 9 + 16 = 25 = 52. Có tồn tại một bộ ba Pytago mà một + b + c = 1000. Tìm sản phẩm abc.
giải pháp của tôi là trong c ++:
int a,b,c;
const int sum = 1000;
int result = -1;
for (a = 1; a<sum; a++){
	for (b = 1; b < sum; b++){
			c = sum-a-b;
			if (a*a+b*b == c*c){
				result = a*b*c;
				goto found;
			}
	}	
}
found:
std::cout << "a:" << a << std::endl;
std::cout << "b:" << b << std::endl;
std::cout << "c:" << c << std::endl;
std::cout <<"Result:" << result << std::endl;
kể từ khi phát biểu "goto" không rất phổ biến trong c ++ lập trình viên, tôi muốn biết nếu điều này có thể được coi là một sử dụng hợp lý của "goto". Hoặc nếu có một giải pháp tốt hơn cho những vấn đề mà không cần "goto". Do đó, tôi không có nghĩa là một giải pháp mà chỉ cần tránh "goto", nhưng mà tránh "goto" một cách cải thiện các thuật toán.

3 Câu trả lời

0 Phiếu
Đã trả lời 12/3/2016 bởi Znx2762Toro (1,140 điểm)
được bình chọn là câu trả lời hay nhất 14/3/2016 bởi Thing_Lugg
 
Câu trả lời hay nhất
IMO bằng cách sử dụng một goto là tốt trong các tình huống. BTW, condescending thuyết giảng chống lại goto thường xuất phát từ những người sử dụng chỉ vẹt những gì họ nghe người khác nói hay đọc ở đâu đó...
Đã bình luận 12/3/2016 bởi Svacruse (380 điểm)
Tôi yêu các tab 8-không gian bạn đang sử dụng... rất sexy.
Đã bình luận 14/3/2016 bởi Thing_Lugg (1,500 điểm)
cảm ơn bạn, như chúng tôi quá :-)
0 Phiếu
Đã trả lời 09/3/2016 bởi Fub_a (208,400 điểm)
Tôi không thể nghĩ ra một lựa chọn tốt hơn. Nhưng một trong những lựa chọn không sử dụng goto sẽ thay đổi for đầu tiên-loop:
for (a = 1; a<sum && result == -1; a++){
sau đó break trên for thứ hai-vòng lặp. Điều đó sẽ làm việc giả sử kết quả sẽ không bao giờ là -1 sau khi for thứ hai-loop đã bị phá vỡ bởi break.
–1 Phiếu
Đã trả lời 12/3/2016 bởi Is_mador (1,140 điểm)
return là một goto "cấu trúc" mà lập trình tìm thấy hơn chấp nhận được! Vì vậy:
static int findit(int sum, int* pa, int* pb, int* pc)
{
    for (int a = 1; a<sum; a++) {
        for (int b = 1; b < sum; b++) {
            int c = sum-a-b;
            if (a*a+b*b == c*c) {
                *pa = a; *pb = b; *pc = c;
                return a*b*c;
        }
    }
    return -1;    
}
int main() {
    int a, b, c;
    const int sum = 1000;
    int result = findit(sum, &a, &b, &c);
    if (result == -1) {
        std::cout << "No result!" << std::endl;
        return 1;
    }
    std::cout << "a:" << a << std::endl;
    std::cout << "b:" << b << std::endl;
    std::cout << "c:" << c << std::endl;
    std::cout <<"Result:" << result << std::endl;
    return 0;
}

ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...