I need help with understanding how to fix my for loop and the if tests. Originally, in the for loop, for the end value i had k<=3..but this is wrong because i need to loop to keep going until it passes the test. So i was told to try setting k=0 to make it false and create an if test within the for loop to make it true, so that when it does pass the test, it stops. how does that work?

We were given an example as to what the output should look like (if that helps with understanding what i am asking):
Please enter the expected load in pounds> 9000
Please enter the length of the column in inches> 120

….Testing a beam with Area of 2.0 by 2.0 inches – Failed the tests
….Testing a beam with Area of 4.0 by 4.0 inches – Failed the tests
….Testing a beam with Area of 6.0 by 6.0 inches – Passed the tests

But here is my original code

#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;

//global constants
#define E 1700000
#define COMP_STRENGTH 445

//list function prototypes
double buckload(double area, double length, double width);
double compstress(double area);
double slender (double length, double width);

int main(void)
{
    double buck_load, area, length,ratio,max,width;
    double stress,load;
    
    ofstream outfile; /*declare var to write to a file*/
    outfile.open("hw4c.txt"); /*open output file hw4c*/
    outfile<<"Ugonna Ibe\n";
    outfile<<"hw4c\n\n";
    
    cout<<"Please enter expected load in pounds> ";
    cin>>load;
    cout<<"Please enter the length of the column in inches> ";
    cin>>length;

    for(int k=1;k=0;k++){
       width=k*2;
       area=width*width;
       ratio=slender(length,width);
       buck_load=buckload(area,length,width);
       stress=compstress(area);
       if (ratio<=50 && load<=buck_load && load<=stress){
       cout<<"\nTesting a beam with Area of "<<width<<" by "<<width<<" inches-Passed the tests\n";
       cout<<"\n\nFor a load of "<<load<<" pounds and a length of "<<length<<" inches,\nrecommended square beam has sides of "<<width<<" inches.\n";
       outfile<<"\nFor a load of "<<load<<" pounds and a length of "<<length<<" inches, recommended square beam has sides of "<<width<<".";
       }
       else{
       cout<<"Testing a beam with Area of "<<width<<" by "<<width<<" inches-Failed the tests\n";
       outfile<<"\nDo not use "<<width<<" for a load of "<<load<<".";
       }
       }
    system("pause");
    return 0;
} 
double buckload(double area, double length, double width)
{
       double x;
       x=(.3*E*area)/((length / width) * (length / width));
       return(x);
}
double compstress(double area)
{
       double y;
       y=area*COMP_STRENGTH;
       return (y);
}
double slender (double length, double width)
{
       double z;
       z=length/width;
       return (z);
}

Dani AI

Generated

The root cause here is loop control, not the beam math: the middle expression of a C/C++ for loop is the boolean test that determines whether the body runs. A single = assigns; a comparison or boolean expression must be used instead. called out the assignment bug and reminded that the condition belongs in the second slot. That explains why the original loop never behaved as intended.

A clear, safe pattern is to loop while “not found” but still cap iterations so the program cannot hang forever. Keep the loop logic readable and avoid embedding the stop test only inside a nested if that does a hidden break. Example pattern:

const int MAX_TRIALS = 50;
bool found = false;
for (int trial = 1; trial <= MAX_TRIALS && !found; ++trial) {
    double side = trial * 2.0;
    // compute area, ratio, buckling capacity, compressive capacity...
    if ( /* pass condition based on those computed values */ ) {
        found = true;
        // record chosen side
    } else {
        // log failed test and continue
    }
}
if (!found) {
    std::cout << "No suitable beam found up to " << MAX_TRIALS * 2.0 << " inch sides.\n";
}

Practical checks and troubleshooting: validate every numeric input (test std::cin.fail()), guard against division by zero (length zero), initialize variables before use, and close files after writing. Print or log the trial counter and the computed values (width, ratio, buck_load, stress) while debugging so it’s obvious why a candidate passed or failed. Prefer typed constants (const/constexpr) over #define for physical constants. Avoid platform-specific pauses (e.g., system("pause")).

Combine the good advice already posted: ’s while-style approach is fine for “run until success,” ’s suggestion to break on success and to bound the loop prevents infinite loops, and the assignment-vs-comparison warning from is the immediate fix.

Recommended Answers

All 9 Replies

Could you use a while loop? Here is an example of a while loop that runs until a condition is met:

bool x=false; 
int num = 0;     
while(!x){//while x is false
    //test
    if(num ==5){
    //if pass:
         cout<<"true";
         x = true;
    }
    else{ //if fail:
        cout<<num<<endl;
        num++;
    }
    //should exit when num is 5
}

What is the condition that causes TRUE? What == what? That goes in the 2nd part (condition) of the for() loop.

The condition does not have to be based on k, but if you are running from k=0,1,2... until val == 10 (something calculated in the loop), you can certainly use for (k=0; val != 10; k++) Example

for (k=0; val < 10; k++)
{
    val = k/2;
}

Also in line 30 you have

for (int k = 1; k = 0; k++)

the problem is that you are not testing for anything, you are reassigning k to 0 because you are using the single equals

Your main issue, as hag++ mentioned, is that your for loop isn't doing anything, you should write it like this:

for(int k=0; k < 100 ; ++k)
{
     //your loop code
}

In this code, k < 100 is making the assumption that your k variable will never reasonably be 100 or more.

A quick fix of the code is:

#include <iostream>
#include <cmath>
#include <fstream>
#include <conio.h>

//it is better form to prepend std:: before cout
//using namespace std;

//global constants
#define E 1700000
#define COMP_STRENGTH 445

//list function prototypes
double buckload(double area, double length, double width);
double compstress(double area);
double slender (double length, double width);

int main(void)
{
    double buck_load, area, length,ratio,width;
    double stress,load;
    
    std::ofstream outfile; /*declare var to write to a file*/
    outfile.open("hw4c.txt"); /*open output file hw4c*/
    outfile<<"Ugonna Ibe" << std::endl;
    outfile<<"hw4c" << std::endl << std::endl;
    
    std::cout<<"Please enter expected load in pounds> ";
    std::cin>>load;
    std::cout<<"Please enter the length of the column in inches> ";
    std::cin>>length;

    for(int k=1;;k++){
       width=k*2;
       area=width*width;
       ratio=slender(length,width);
       buck_load=buckload(area,length,width);
       stress=compstress(area);

       std::cout << std::endl << "Testing a beam with Area of " << width << " by " << width << " inches" << std::endl;

       if (ratio<=50 && load<=buck_load && load<=stress)
       {
			std::cout << std::endl << std::endl << "For a load of " << load << " pounds and a length of " << length << " inches," << std::endl << "recommended square beam has sides of " << width << " inches." << std::endl;
			outfile << std::endl << "For a load of " << load << " pounds and a length of " << length << " inches, recommended square beam has sides of " << width << ".";

			//end the loop
			break;
       }
       else
       {
			std::cout << "Testing a beam with Area of " << width << " by " << width << " inches-Failed the tests" << std::endl;
		    outfile << std::endl << "Do not use " << width << " for a load of " << load << ".";
       }
       }
	   
    std::cout << "press any key to exit . . ." << std::endl;
	_getch();
	
    return 0;
} 
double buckload(double area, double length, double width)
{
       double x;
       x=(.3*E*area)/((length / width) * (length / width));
       return(x);
}
double compstress(double area)
{
       double y;
       y=area*COMP_STRENGTH;
       return (y);
}
double slender (double length, double width)
{
       double z;
       z=length/width;
       return (z);
}

This works for the test condition of 9000 and 120.

Sincerely,
Nate

Where you put

for(int k=1;;k++)

i do not need a second value? So I can just skip it so that it stops on its own without me telling the loop when to stop?

Your main issue, as hag++ mentioned, is that your for loop isn't doing anything, you should write it like this:

for(int k=0; k < 100 ; ++k)
{
     //your loop code
}

In this code, k < 100 is making the assumption that your k variable will never reasonably be 100 or more.

A quick fix of the code is:

#include <iostream>
#include <cmath>
#include <fstream>
#include <conio.h>

//it is better form to prepend std:: before cout
//using namespace std;

//global constants
#define E 1700000
#define COMP_STRENGTH 445

//list function prototypes
double buckload(double area, double length, double width);
double compstress(double area);
double slender (double length, double width);

int main(void)
{
    double buck_load, area, length,ratio,width;
    double stress,load;
    
    std::ofstream outfile; /*declare var to write to a file*/
    outfile.open("hw4c.txt"); /*open output file hw4c*/
    outfile<<"Ugonna Ibe" << std::endl;
    outfile<<"hw4c" << std::endl << std::endl;
    
    std::cout<<"Please enter expected load in pounds> ";
    std::cin>>load;
    std::cout<<"Please enter the length of the column in inches> ";
    std::cin>>length;

    for(int k=1;;k++){
       width=k*2;
       area=width*width;
       ratio=slender(length,width);
       buck_load=buckload(area,length,width);
       stress=compstress(area);

       std::cout << std::endl << "Testing a beam with Area of " << width << " by " << width << " inches" << std::endl;

       if (ratio<=50 && load<=buck_load && load<=stress)
       {
			std::cout << std::endl << std::endl << "For a load of " << load << " pounds and a length of " << length << " inches," << std::endl << "recommended square beam has sides of " << width << " inches." << std::endl;
			outfile << std::endl << "For a load of " << load << " pounds and a length of " << length << " inches, recommended square beam has sides of " << width << ".";

			//end the loop
			break;
       }
       else
       {
			std::cout << "Testing a beam with Area of " << width << " by " << width << " inches-Failed the tests" << std::endl;
		    outfile << std::endl << "Do not use " << width << " for a load of " << load << ".";
       }
       }
	   
    std::cout << "press any key to exit . . ." << std::endl;
	_getch();
	
    return 0;
} 
double buckload(double area, double length, double width)
{
       double x;
       x=(.3*E*area)/((length / width) * (length / width));
       return(x);
}
double compstress(double area)
{
       double y;
       y=area*COMP_STRENGTH;
       return (y);
}
double slender (double length, double width)
{
       double z;
       z=length/width;
       return (z);
}

This works for the test condition of 9000 and 120.

Sincerely,
Nate

Where you put

for(int k=1;;k++)

i do not need a second value? So I can just skip it so that it stops on its own without me telling the loop when to stop?

This is an infinite loop. It will not stop on it's own. Somewhere in the loop you will have to break; out of it.

Oh okay. Thank you for your help!

This is an infinite loop. It will not stop on it's own. Somewhere in the loop you will have to break; out of it.

I should have mentioned the infinite loop in the code.

The way I changed the code, there is an assumption that at some point k will become big enough to satisfy your test condition and therefore dump you out of the loop with a break.

A much better practice would be to limit k to some reasonable value like this:

for(int k=0;k<100;++k)

In this example, you are asserting that no matter the inputs, it is never reasonable or expected that k will ever be 100 or larger. This limiting value could also be queried from the user:

while(0 != inch_max && inch_max < 1000)
{
    std::cout<<"Please enter maximum inches> ";
    std::cin>>inch_max;

    if(0 == inch_max || inch_max >= 1000)
        std::cout << "You entered an invalid value" << std::endl;
}

and then your loop would look like:

for(int k=0;k<inch_max;++k)

I just realized that I should mention input checking.

You existing code has no checking for valid input. You really should check for valid input after each std::cin. Take a look at my most recent example. My input prompt is checked for a number between 0 and 1000, non-inclusive. This is an example of input validation.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.