Обнуление переменных после инициализации
#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 шт):
Дело в том, что у вас функция 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;
}
#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). А вот вопрос о том, нужно ли добавлять какие-либо дополнительные проверки или мы считаем, что все введённые числа имеют смысл в условиях данной задачи, хорошо бы задать составителю...
