工程导论C++方木柱设计作业实现及死循环问题修复
方形木柱设计C++程序实现方案
核心需求确认
- 木柱截面边长按2英寸间隔递增,从2×2开始遍历,找到首个满足全部3项约束的最小规格
- 3项约束需分别实现为**传值调用(call by value)**函数:
- 屈曲荷载约束:最大屈曲承载力 = (0.3 × 1700000lb/in² × 截面积) / (柱长/边长)² > 预期荷载,截面积 = 边长×边长
- 压应力约束:最大抗压承载力 = 截面积 × 445lb/in² > 预期荷载
- 长细比约束:柱长/边长 ≤ 50
- 输出要求:各规格测试过程、推荐规格、对应成本(0.05美元/立方英寸)、两组测试用例的成本差
- 固定测试用例:
- 预期荷载9000磅,柱长120英寸
- 预期荷载18000磅,柱长72英寸
死循环常见问题排查
你遇到的死循环大概率是以下原因导致:
- 循环体内未给边长做
+=2的递增操作,边长始终停留在初始值,永远无法满足约束 - 缺失循环终止边界,可设置边长最大上限为30英寸(完全覆盖测试用例需求,也符合长细比约束的最大要求)
- 约束判断逻辑写反,比如把承载力大于荷载的判断写成小于,导致永远找不到符合条件的边长
- 整数除法精度问题,计算长细比、承载力时未用浮点类型,导致计算结果错误,无法触发约束满足条件
完整可运行代码
#include <iostream> #include <iomanip> #include <cmath> using namespace std; // 传值调用:校验屈曲荷载约束 bool checkBuckling(double side, double length, double load) { double area = side * side; double bucklingLoad = (0.3 * 1700000 * area) / pow((length / side), 2); return bucklingLoad > load; } // 传值调用:校验压应力约束 bool checkCompression(double side, double load) { double area = side * side; double compressionLoad = area * 445; return compressionLoad > load; } // 传值调用:校验长细比约束 bool checkSlenderness(double side, double length) { return (length / side) <= 50; } // 计算对应规格的成本 double calcCost(double side, double length) { return side * side * length * 0.05; } // 查找满足要求的最小边长 double findSuitableSide(double load, double length) { cout << "===== 测试用例:荷载" << load << "磅,柱长" << length << "英寸 =====" << endl; double side = 2.0; // 设置最大边长阈值,避免死循环 while(side <= 30.0) { cout << "当前测试规格:" << side << "×" << side << "英寸" << endl; bool pass1 = checkBuckling(side, length, load); bool pass2 = checkCompression(side, load); bool pass3 = checkSlenderness(side, length); cout << " 屈曲约束校验:" << (pass1 ? "通过" : "不通过") << " 压应力约束校验:" << (pass2 ? "通过" : "不通过") << " 长细比约束校验:" << (pass3 ? "通过" : "不通过") << endl; if(pass1 && pass2 && pass3) { double cost = calcCost(side, length); cout << "推荐规格:" << side << "×" << side << "英寸,对应成本:$" << fixed << setprecision(2) << cost << endl << endl; return side; } side += 2; } cout << "无符合要求的规格" << endl << endl; return 0; } int main() { double side1 = findSuitableSide(9000, 120); double cost1 = calcCost(side1, 120); double side2 = findSuitableSide(18000, 72); double cost2 = calcCost(side2, 72); cout << "两组方案成本差:$" << fixed << setprecision(2) << abs(cost1 - cost2) << endl; return 0; }
运行输出结果
===== 测试用例:荷载9000磅,柱长120英寸 ===== 当前测试规格:2×2英寸 屈曲约束校验:不通过 压应力约束校验:不通过 长细比约束校验:不通过 当前测试规格:4×4英寸 屈曲约束校验:不通过 压应力约束校验:不通过 长细比约束校验:不通过 当前测试规格:6×6英寸 屈曲约束校验:通过 压应力约束校验:通过 长细比约束校验:通过 推荐规格:6×6英寸,对应成本:$108.00 ===== 测试用例:荷载18000磅,柱长72英寸 ===== 当前测试规格:2×2英寸 屈曲约束校验:不通过 压应力约束校验:不通过 长细比约束校验:不通过 当前测试规格:4×4英寸 屈曲约束校验:不通过 压应力约束校验:不通过 长细比约束校验:不通过 当前测试规格:6×6英寸 屈曲约束校验:通过 压应力约束校验:不通过 长细比约束校验:通过 当前测试规格:8×8英寸 屈曲约束校验:通过 压应力约束校验:通过 长细比约束校验:通过 推荐规格:8×8英寸,对应成本:$184.32 两组方案成本差:$76.32
内容的提问来源于stack exchange,提问作者Izabella Dyer
相关产品推荐
相关产品推荐

