Else without a previous if C++

Chào các bác ạ, em mới học lập trình được 2 tuần và đang vướng mắc ở bài toán gà và chó kinh điển này ạ. Chương trình báo lỗi ở hàm if else, cụ thể là trước else không có if nhưng em đã include if cũng như có đầy đủ dấu { } r ạ. Các bác chỉ e với, e cảm ơn nhiều ạ.

#include <iostream>
using namespace std;
int main() {
    int s, sf;
    cin >> s >> sf;
    for (int c=1;c<s;c++) {
        for (int g=1; g<s; g++) {
            if (((2*g + 4*c) ==sf) && (g+c==s)) {
            cout << "chicken = " << g << ", dog = " << c << endl; }
            break;
    }
    }
            else { cout << "invalid" << endl;
            }
}

nếu viết lại code thì nó sẽ như thế này, trông sẽ dễ đọc và dễ bắt lỗi hơn nhiều

#include <iostream>

using namespace std;
int main() {
  int s, sf;
  cin >> s >> sf;
  for (int c = 1; c < s; c++) {
    for (int g = 1; g < s; g++) {
      if (((2 * g + 4 * c) == sf) && (g + c == s)) {
        cout << "chicken = " << g << ", dog = " << c << endl;
      }
      break;
    }
  } else {
    cout << "invalid" << endl;
  }
}
2 Likes

v là lỗi ở đâu thế ạ

lỗi là trước đoạn else là for chứ không phải if nên nó báo lỗi là trước else không có if

1 Like

v nếu muốn in ra invalid thì có thể thay hàm else bằng cách nào ạ

Tạm thời mình sẽ không quan tâm thuật toán của bạn là gì vì nhìn code mình đoán bạn muốn chạy nested loops (lặp trong lặp), nếu đúng điều kiện thì in ra rồi dừng vòng lặp và dừng chương trình, nếu không thì in ra “invalid”.

Đoạn break; trong code này sẽ không hoạt động như mình muốn vì nó chỉ thoát khỏi vòng lặp trong cùng (ở đây là int g = 1; g < s; g++), vòng lặp int c = 1; c < s; c++ vẫn sẽ được tiếp tục và tạo ra vòng lặp int g = 1; g < s; g++ mới.

Có thể sẽ có cách khác để cải thiện code của bạn nhưng mình chỉ đưa ra 2 giải pháp để thoát khỏi nested loops:

  1. return để kết thúc luôn hàm. Nếu là hàm void thì chỉ cần return; thôi nhưng vì đây là hàm main nên mình sẽ tận dụng để trả về status code của nó luôn
int main() {
  int s, sf;
  cin >> s >> sf;
  for (int c = 1; c < s; c++) {
    for (int g = 1; g < s; g++) {
      if (((2 * g + 4 * c) == sf) && (g + c == s)) {
        cout << "chicken = " << g << ", dog = " << c << endl;
        return 0; // Dừng luôn chương trình
      }
    }
  }
  cout << "invalid" << endl;
  return 1;
}
  1. Dùng flag. Cái này thì nó sẽ tốn dòng code hơn nhưng vẫn có thể dùng được
// Xem reply bên dưới
2 Likes

cách sửa thứ nhất thì em đã hiểu và run thành công rồi ạ. Tuy nhiên cách thứ 2 dính lỗi chưa khai báo c và g ở dòng cout gần cuối thì em đã bỏ khai báo int c, g trong for mà nhét luôn lên đầu cùng s và sf ở hàm int đầu tiên r và đã fix được ạ nhưng khi run và nhập 36 và 100 thì kết quả trả về đúng ra sẽ là 22 và 14 tuy nhiên lại ra 23 và 15 ạ. Mong anh giải thích giúp em ạ, em cảm ơn.

Cái này mình quên mất vì mải copy & paste :PP
Bạn có thể khai báo biến c,g trước để có thể dùng nó sau này

int main() {
  int s, sf, c, g;
  cin >> s >> sf;
  bool flag = false;
  for (c = 1; c < s && !flag; c++) {
    for (g = 1; g < s && !flag; g++) {
      if (((2 * g + 4 * c) == sf) && (g + c == s)) {
        flag = true; // Đã tìm thấy
      }
    }
  }
  if (flag) {
    cout << "chicken = " << g << ", dog = " << c << endl;
  } else {
    cout << "invalid" << endl;
  }
}

run code này thì nhập 36 100 nó ra invalid ạ :sweat_smile:

Mình đã sửa lại code rồi nhé. Mình chưa chạy thử code và mình không nghĩ bộ đếm sẽ lại hoạt động như thế :(((((

tên biến ghi đầy đủ ra chứ có 1 kí tự thế kia viết code cho máy đọc à :unamused:

ví dụ

int dogCount = 0;
int chickCount = 0;
int dogLegCount = 0;
int chickLegCount = 0;
constexpr int kLegsPerDog = 4;
constexpr int kLegsPerChick = 2;

int dogChickCount = 0;
int legCount = 0;
std::cin >> dogChickCount >> legCount;

for (int dogCount = 0; dogCount <= dogChickCount; ++dogCount) {
    const int chickCount = dogChickCount - dogCount;
    const int dogLegCount = kLegsPerDog * dogCount;
    const int chickLegCount = kLegsPerChick * chickCount;
    if (dogLegCount + chickLegCount == legCount) {
        std::cout << "Chicken = " << chickCount << ", dog = " << dogCount << "\n";
        break;
    }
}

:hocho: :hocho:

giang hồ còn đồn đoán có thể xài emoji cho tên biến nữa nhưng ma thuật hắc ám này ko nên xài :hocho:
https://godbolt.org/z/8hbefY7qd :triumph:

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