Другие языки программирования и технологии

Простая программа, а проблемы сложные. Си.

Имеем задание:

Пользователь вводит значения высоты (h) правильной пирамиды и стороны (a)
правильного шестиугольника, лежащего в ее основании.
Составить функцию, которая получает введенные значения в качестве параметров и
возвращает значение площади полной поверхности (S) данного тела. Составить такую
же функцию для вычисления его объема (V).

Имеем код:

#include
#include
double v(double x, double y);
double s(double g);
int main(void)
{
double h,a,V,S;
printf("Input the height and edge of the pyramids.\n");
scanf("%.e", &h);
scanf("%.e", &a);
V=v(h,a);
S=s(a);
printf("Total square= %.e\n", S);
printf("Volume= %.e\n", V);
return(0);
}
double s(double g)
{
double p;
p=(((3*sqrt(3)*g*g)/3)+(6*0.5*g*g));
return(p);
}
double v(double x, double y)
{
double q;
q=((1/3)*((3*sqrt(3)*y*y)/3)*x);
return(q);
}

При попытке запустить, запрашивается значение h и a, а после, при вводе одного значения, программа резко переходит в конец и выдаёт всё по нулям, оставляя меня с выражением удивления на лице. Нет НИКАКОЙ вообще идеи, почему так происходит.
=Миха Крылов=
=Миха Крылов=
1 638
В сканф передавай "%lf"
Глеб Ермаков
Глеб Ермаков
8 452
Лучший ответ
=Миха Крылов= Спасибо, это помогло разобраться с проблемой ввода.
Ну так твоё %.e - это ошибка. Надо %e - безо всяких точек.
Jesus Igorkov
Jesus Igorkov
59 940
#define _USE_MATH_DEFINES
#include <iostream>
#include <iomanip>
using namespace std;
double base(double a, unsigned n);
double area(double h, double a, unsigned n);
double volume(double h, double a, unsigned n);
int main() {
setlocale(LC_CTYPE, "Russian");
const unsigned n = 6;
cout << "Высота пирамиды: ";
double h;
cin >> h;
double a;
cout << "Сторона основания пирамиды: ";
cin >> a;
cout
<< fixed << setprecision(12)
<< "S = " << area(h, a, n)
<< "\nV = " << volume(h, a, n)
<< endl;
cin.sync();
cin.get();
}
double base(double a, unsigned n) {
return n * a * a * cos(M_PI / n) / 2;
}
double area(double h, double a, unsigned n) {
return n * a * sqrt(h * h + pow(a / (2 * tan(M_PI / n)), 2)) / 2 + base(a, n);
}
double volume(double h, double a, unsigned n) {
return base(a, n) * h / 3;
}
Сергей Артюхин
Сергей Артюхин
50 482
Формулы совершенно ужасные.
Например, (((3*sqrt(3)*g*g)/3)+(6*0.5*g*g));
Умножаешь на 3 и тут же делишь на 3, пишешь легко вычисляемые в уме выражения вроде 6*0.5, а g*g спокойно выносится за скобки... Да и вообще зачем там переменная p? Можно писать просто
double s(double g){return (3+sqrt(3))*g*g;}
Если, конечно, исходная формула была верна, я ее не проверял.
Николаха- )))
Николаха- )))
82 087
Про %e уже сказали. А еще 1/3 - целочисленное деление, и 1/3==0. Надо писать 1.0/3.0.
Влад Просто
Влад Просто
55 360
=Миха Крылов= Спасибо, это решило уже следующую проблему.
а почему return(p); а не return p; -?
отладку сделайте