L1A/main.cpp

190 lines
No EOL
6.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* CSCI 200: Lab 1A (Math Equation Solver): Tyler Beckman
*
* Author: Tyler Beckman
*
* A C++ program to interactively solve 10 different mathmatical equations,
* using the appropriate constants where relevant. I decided to implement all 10
* rather than just 2 because it sounded interesting and I wanted to challenge
* myself. It also will keep prompting for the equation to solve until you
* explicitly respond with a 0 or CTRL+C it, rather than just exit once the
* equation is calculated.
*/
#include <iostream>
#include <cmath>
double const MOLAR_GAS_CONSTANT = 8.314'462'618'153'24;
double const GRAVITATIONAL_CONSTANT = 0.000'000'000'066'740'8;
double const SPHERE_VOLUME_RATIO = 4.0 / 3;
double const VACUUM_PERMITTIVITY = 0.000'000'000'008'854'187'818'8;
double ideal_gas_law(double moles, double gas_absolute_temperature,
double volume) {
return (moles * MOLAR_GAS_CONSTANT * gas_absolute_temperature) / volume;
}
double average_acceleration(double pos_start, double pos_end, double time_start,
double time_end) {
return (pos_end - pos_start) / std::pow(time_end - time_start, 2);
}
double ohms_law(double voltage, double resistance) {
return voltage / resistance;
}
double universal_gravitation(double mass_one, double mass_two,
double distance) {
return GRAVITATIONAL_CONSTANT *
((mass_one * mass_two) / std::pow(distance, 2));
}
double pythagorean_theorem(double x, double y) {
return std::sqrt(std::pow(x, 2) + std::pow(y, 2));
}
double sphere_volume(double radius) {
return SPHERE_VOLUME_RATIO * M_PI * std::pow(radius, 3);
}
double deflection(double weight, double length, double elasticity_modulus,
double moment_of_inertia) {
return (weight * std::pow(length, 3)) /
(3 * elasticity_modulus * moment_of_inertia);
}
double heat_transfer_rate(double transfer_coefficient, double surface_area,
double temperature_change) {
return transfer_coefficient * surface_area * temperature_change;
}
double stress(double force, double area) { return force / area; }
double shear_stress(double sigma_x, double sigma_y, double tau_xy,
double theta) {
return -0.5 * (sigma_x - sigma_y) * sin(2 * theta) + tau_xy * cos(2 * theta);
}
double coulombs_law(double charge_1, double charge_2,
double relative_static_permittivity, double distance) {
return std::fabs(charge_1 * charge_2) /
(4 * M_PI * VACUUM_PERMITTIVITY * relative_static_permittivity *
std::pow(distance, 2));
}
double input_double(std::string prompt) {
double out;
while (true) {
std::cout << prompt + ": ";
std::cin >> out;
if (std::cin.fail()) {
// The clear and ignore are necessary because otherwise it seems to keep
// reusing the first input a person enters
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "Invalid number, please make sure your number is formatted "
"correctly."
<< std::endl;
} else {
break;
}
}
return out;
}
int main() {
while (true) {
std::cout << "[0] Quit program" << std::endl
<< "[1] Ideal gas law" << std::endl
<< "[2] Average acceleration" << std::endl
<< "[3] Ohm's law" << std::endl
<< "[4] Universal gravitation" << std::endl
<< "[5] Pythagorean theorem" << std::endl
<< "[6] Sphere volume" << std::endl
<< "[7] Deflection" << std::endl
<< "[8] Heat transfer rate" << std::endl
<< "[9] Stress" << std::endl
<< "[10] Shear Stress" << std::endl
<< "[11] Coulomb's law" << std::endl;
int equation_choice =
input_double("Which equation would you like to calculate?");
double calculated_value;
switch (equation_choice) {
case 0:
return 0;
case 1:
calculated_value = ideal_gas_law(
input_double("Please enter amount of moles"),
input_double("Please enter the gas absolute temperate"),
input_double("Please enter the volume"));
break;
case 2:
calculated_value = average_acceleration(
input_double("Please enter the starting position"),
input_double("Please enter the ending position"),
input_double("Please enter the starting time"),
input_double("Please enter the ending time"));
break;
case 3:
calculated_value =
ohms_law(input_double("Please input the voltage"),
input_double("Please input the resistance"));
break;
case 4:
calculated_value = universal_gravitation(
input_double("Please input the mass of object 1"),
input_double("Please input the mass of object 2"),
input_double("Please input the distance between objects"));
break;
case 5:
calculated_value =
pythagorean_theorem(input_double("Please input the x distance"),
input_double("Please input the y distance"));
break;
case 6:
calculated_value =
sphere_volume(input_double("Please input the sphere radius"));
break;
case 7:
calculated_value =
deflection(input_double("Please input the force of weight"),
input_double("Please input the length"),
input_double("Please input the elasticity modulus"),
input_double("Please input the moment of inertia"));
break;
case 8:
calculated_value = heat_transfer_rate(
input_double("Please input the transfer coefficient"),
input_double("Please input the surface area"),
input_double("Please input the change in temperature"));
break;
case 9:
calculated_value =
stress(input_double("Please input the amount of force"),
input_double("Please input the surface area"));
break;
case 10:
calculated_value = shear_stress(
input_double("Please enter σ_x"), input_double("Please enter σ_y"),
input_double("Please enter τ_xy"),
input_double("Please enter θ (in radians)"));
break;
case 11:
calculated_value = coulombs_law(
input_double("Please input the first charge"),
input_double("Please input the second charge"),
input_double("Please input the relative static permittivity"),
input_double("Please input the distance between charges"));
break;
default:
std::cout << "That is not a valid equation choice. Please try again."
<< std::endl;
continue;
}
std::cout << "The result of that calculation is: " << calculated_value
<< std::endl;
}
}