fork download
  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4.  
  5. double z(double x, double y, double &z0){
  6. z0=-1; //<-- место для ввода слагаемых функции f(x, y) не под корнем чётной степени.
  7. return (2-x*x-y*y)<0? z0:sqrt(2-x*x-y*y)+z0;//<-- место для ввода функции z=f(x, y).
  8. }
  9. long double dl(double x, double y, double z){
  10. return sqrt(x*x+y*y+z*z);//Длина вектора.
  11. }
  12. double ras(double xi, double xj, double yi, double yj){
  13. double zii, zjj, zij, zji, v1x=0, v1y=0, v1z=0, v2x=0, v2y=0, v2z=0, z0=0;
  14. zii=z(xi, yi, z0); //Найдём координату z каждой вершины треугольников.
  15. zjj=z(xj, yj, z0);
  16. zij=z(xi, yj, z0);
  17. zji=z(xj, yi, z0);
  18. if(z(xi, yi, z0)!=z0||z(xi, yj, z0)!=z0||z(xj, yi, z0)!=z0){//Используем функцию z(), потому что z0 может оказаться переменной.
  19. v1x=(yj-yi)*(zji-zii); //Вычислим векторное произведение векторов.
  20. v1y=(zij-zii)*(xj-xi);
  21. v1z=(yi-yj)*(xj-xi);
  22. }
  23. if(z(xj, yj, z0)!=z0||z(xi, yj, z0)!=z0||z(xj, yi, z0)!=z0){
  24. v2x=(yi-yj)*(zji-zjj);
  25. v2y=(zij-zjj)*(xi-xj);
  26. v2z=(yj-yi)*(xi-xj);
  27. }
  28. return (dl(v1x, v1y, v1z)+dl(v2x, v2y, v2z))/2;//Найдём площадь треугольников.
  29. }
  30.  
  31. int main(){
  32. double xi, xj, yi, yj, s=0, h, z0=0;
  33. int a, b, c, d;
  34. cin >> a >> b >> c >> d >> h;
  35. xi = a;
  36. while(xi<=(b-h)){
  37. yi=c;
  38. xj=xi+h;
  39. while(yi<=(d-h)){
  40. yj=yi+h;
  41. s+=ras(xi, xj, yi, yj);
  42. yi=yj;
  43. }
  44. xi=xj;
  45. }
  46. cout<<s;
  47. return 0;
  48. }
Success #stdin #stdout 2.47s 3476KB
stdin
-2 2 -2 2 0.0005
stdout
12.5835