Обнуление переменных после инициализации

Изначальное задание: введите сюда описание изображения

#include <iostream>
#include <math.h>
using namespace std;
unsigned short choose() {
    cout << "Выберите вид оснований усечённой пирамиды:" << endl << "1 - треугольник" << endl << "2 - квадрат" << endl << "3 - прямоугольник" << endl;
    short var;
    cin >> var;
    while (true) {
        if (var == 1 || var == 2 || var == 3) {
            return var;
        }
        else {
            cout << "Введите 1, 2 или 3";
            break;
        }
    }
}
double calc(short var_defined) {
    double s;
    int a, b, c;
    if (var_defined == 1) {
        cout << "Введите длины сторон треугольника a,b,c" << endl;
        cin >> a >> b >> c;
        double p = (a + b + c) / 2; //полупериметр треугольника
        s = sqrt(p * (p - a) * (p - b) * (p - c));
        return s;
    }
    else if (var_defined == 2) {
        cout << "Введите длину стороны квадрата:" << endl;
        cin >> a;
        s = pow(a, 2);
        return s;
    }
    else if (var_defined == 3) {
        cout << "Введите длины сторон прямоугольника a и b" << endl;
        cin >> a;
        cin >> b;
        s = a * b;
        return s;
    }
    else {
        exit(0);
    }
}
int main()
{
    setlocale(LC_ALL, "Russian");
    short c = choose();
    cout << "Введите параметры для большего основания" << endl;
    int s_big = calc(c); //площадь большего основания
    cout << "Введите параметры для меньшего основания" << endl;
    int s_small = calc(c); //площадь меньшего основания
    double H;
    cout << "Введите высоту усечённой пирамиды" << endl;
    cin >> H;
    while (H <= 0){
        cout << "Введите положительное значение высоты!" << endl;
        cin >> H;
    }
    double V = (H / 3) * (s_big + s_small + sqrt(s_big * s_small));
    cout << "Объём усечённой пирамиды равен " << V;
    
}

Попробовал написать простой калькулятор для объёма усечённой пирамиды. По задумке, сначала пользователь выбирает вид основания - т.к. даны только длины сторон оснований то у нас 3 варианта - треугольник, квадрат и прямоугольник, ведь только у этих фигур можно найти площадь зная только длины сторон. Выбор основания записывается в переменную short c , после чего рассчитывается значение площади большего и меньшего оснований (s_big и s_small) через функцию calc(c). Затем пользователь вводит высоту усеченной пирамиды double H , и зная все эти значения по формуле из изначального задания высчитывается объём.

Проблема: после подсчёта значения s в функции calc(c) для переменной s_big эта функция внутри себя всё считает верно, но возвращает для s_big и s_small нулевое значение. Других ошибок не возникает Если есть ещё какие то замечания кроме данной проблемы, то буду рад? Строго не судите, я начинающий :))


Ответы (2 шт):

Автор решения: MX32

Дело в том, что у вас функция double calc(short var_defined) возвращает double, а присваиваете вы ее к переменной типа int int s_big = calc(c) Так же я бы советовал в самом методе стороны тоже сделать double

double calc(short var_defined) {
double s;
int a, b, c;

Та и в целом при работе с точными вычислениями не рекомендуется использовать int, тем более в работе с double, так как может произойти потеря данных. Исправленный код:

#include <iostream>
#include <math.h>
using namespace std;
unsigned short choose() {
    cout << "Выберите вид оснований усечённой пирамиды:" << endl << "1 - треугольник" << endl << "2 - квадрат" << endl << "3 - прямоугольник" << endl;
    short var;
    cin >> var;
    while (true) {
        if (var == 1 || var == 2 || var == 3) {
            return var;
        }
        else {
            cout << "Введите 1, 2 или 3";
            break;
        }
    }
}
double calc(short var_defined) {
    double s;
    double a, b, c;
    if (var_defined == 1) {
        cout << "Введите длины сторон треугольника a,b,c" << endl;
        cin >> a >> b >> c;
        double p = (a + b + c) / 2; //полупериметр треугольника
        s = sqrt(p * (p - a) * (p - b) * (p - c));
        return s;
    }
    else if (var_defined == 2) {
        cout << "Введите длину стороны квадрата:" << endl;
        cin >> a;
        s = pow(a, 2);
        return s;
    }
    else if (var_defined == 3) {
        cout << "Введите длины сторон прямоугольника a и b" << endl;
        cin >> a;
        cin >> b;
        s = a * b;
        return s;
    }
    else {
        exit(0);
    }
}
int main()
{
    setlocale(LC_ALL, "Russian");
    short c = choose();
    cout << "Введите параметры для большего основания" << endl;
    double s_big = calc(c); //площадь большего основания
    cout << "Введите параметры для меньшего основания" << endl;
    double s_small = calc(c); //площадь меньшего основания
    double H;
    cout << "Введите высоту усечённой пирамиды" << endl;
    cin >> H;
    while (H <= 0) {
        cout << "Введите положительное значение высоты!" << endl;
        cin >> H;
    }
    double V = (H / 3) * (s_big + s_small + sqrt(s_big * s_small));
    cout << "Объём усечённой пирамиды равен " << V;

}
→ Ссылка
Автор решения: NunOfIt
#include <iostream>
#include <math.h>

using namespace std;

void scan(int*& arr, int& len) {
    cout << "Input length: ";
    cin >> len;
    
    arr = new int[len];
    for(int i = 0; i < len; ++i) {
        cout << "Input val " << i << ": ";
        cin >> arr[i];
    }
    cin.clear();
}

void calc(double& S1, double& S2, int*& arr, int len) {
    switch (len) {
        case 3:
            S1 = arr[0] * arr[0];
            S2 = arr[1] * arr[1];
            break;
            
        case 5:
            S1 = arr[0] * arr[1];
            S2 = arr[2] * arr[3];
            break;
            
        case 7:
            double p1 = (arr[0] + arr[1] + arr[2]) / 2.0;
            double p2 = (arr[3] + arr[4] + arr[5]) / 2.0;
            
            S1 = sqrt(p1 * (p1 - arr[0]) * (p1 - arr[1]) * (p1 - arr[2]));
            S2 = sqrt(p2 * (p2 - arr[3]) * (p2 - arr[4]) * (p2 - arr[5]));
            break;
    }
}

int main()
{
    int len;
    int* arr;
    (void) scan(arr, len);
    
    double S1, S2;
    (void) calc(S1, S2, arr, len);
    
    double V = arr[len - 1] * (S1 + S2 + sqrt(S1 * S2)) / 3;
    cout << "V: " << V << '\n';

    delete[] arr;
    return 0;
}

Мне кажется решение лучше оформить как-то так, просто записывать необходимые данные в массив и потом уже отталкиваясь от его длины (3 - квадрат, 5 - прямоугольник, 7 - треугольник) искать S1 и S2.

P.S. В задаче ничего об этом не сказано, но ведь введённые числа могут быть и отрицательными, ну или не удовлетворять неравенству треугольника (a + b > c, a + c > b, b + c > a). А вот вопрос о том, нужно ли добавлять какие-либо дополнительные проверки или мы считаем, что все введённые числа имеют смысл в условиях данной задачи, хорошо бы задать составителю...

→ Ссылка