Every programmer has, at some point, fallen into a logical trap. While building a simple console-based electrical circuit simulator in C++, I stumbled upon a classic boolean logic mistake that completely broke my code.
Here is how to build this useful engineering tool and, more importantly, how to avoid the infinite loop trap!
⚡ The Goal: An Equivalent Resistance Calculator
In physics, calculating the total resistance depends on how components are linked:
- Series: R_total = R1 + R2 + ... + Rn
- Parallel: R_total = (R1 * R2) / (R1 + R2)
We want a program where the user specifies the number of resistors, inputs their values, and chooses the connection mode (s for serial, p for parallel) interactively.
🚨 The Logical Trap: The Double Non-Equality Bug
When validating user input, my first instinct was to create a while loop that kept asking for the link mode if the user typed an invalid character. It looked like this:
// ❌ THE BUGGY CODE
while (link != 's' || link != 'p') {
cout << "Invalid link mode. Enter 's' or 'p': ";
cin >> link;
}
Why this creates an Infinite Loop:
The || (OR) operator means the condition is true if either side is true.
If the user types 's', the first check (link != 's') is False. But the second check (link != 'p') is True (because 's' is not 'p').
Since False OR True = True, the loop runs forever, blocking the program even if you type the correct letter!
🛠️ The Final, Bug-Proof Solution
To fix this, we must use the && (AND) operator. The loop should only run if the input is not 's' AND it is also not 'p'.
Here is the complete, working C++ source code:
#include <iostream>
using namespace std;
int main()
{
int n;
double R, Rc;
char link;
cout << "Enter the number of the resistances in the circuit: ";
cin >> n;
cout << "Enter the value of the first resistance (ohms): ";
cin >> R;
Rc = R;
for(int i = 2; i <= n; i++){
cout << "Enter the value of the current resistance (ohms): ";
cin >> R;
cout << "Enter the link mode (s-serial/p-parallel): ";
cin >> link;
while(link != 's' && link != 'p'){
cout << "Invalid link mode. Enter the link mode (s-serial/p-parallel): ";
cin >> link;
}
if(link == 's'){
Rc = Rc + R;
}
else {
Rc = Rc * R / (Rc + R);
}
}
cout << "The equivalent resistance of the circuit is: " << Rc << " ohms" << endl;
return 0;
}
Top comments (0)