• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Помогите, пожалуйста, с решением двух задач в Pascal

Jenya_Miller

Ученик
Регистрация
4 Мар 2012
Сообщения
6
Реакции
0
Баллы
0
Помогите, пожалуйста, с решением двух задач в Pascal

Задачи по теме "Циклы".
Все задачи нужно решить тремя способами:
1)счетчик (for to do)
2)предпроверка условия (while do)
3)постпроверка условия (repeat until)

Задача№2
Напишите программу вычисления среднего геометрического модулей двух введенных с клавиатуры целых чисел.Условие выхода из цикла – значение числа, равное 999.

Задача№3
На воду опущен шар радиуса r, изготовленный из вещества плотности p (p<1). Найти расстояние от центра шара до поверхности воды. Указание. При составлении программы воспользоваться формулой объема шарового сегмента высоты h: V = пи*h^2 (3r - h)/3, где r - радиус шара, h - высота шарового сегмента.
 
На воду опущен шар радиуса r, изготовленный из вещества плотности p (p<1). Найти расстояние от центра шара до поверхности воды. Указание. При составлении программы воспользоваться формулой объема шарового сегмента высоты h: V = пи*h^2 (3r - h)/3, где r - радиус шара, h - высота шарового сегмента.
Что касается первой задачки, то с этим детским садом уж управьтесь самостоятельно. А вот вторая поинтереснее.
Прежде всего - рассмотрим физико-математическую сторону.
Обозначим:
R - радиус шара
V - объем шара
Vs - объем погруженного в воду сегмента
h - высота погруженного сегмента, т.е. расстояние от поверхности воды до нижней точки шара
g - ускорение свободного падения
p - плотность вещества шара
По закону Архимеда, вес плавающего шара уравновешивается выталкивающей силой, равной весу вытесненной воды. Т.е., принимая плотность воды за 1, имеем:
V*p*g=Vs*g, или (4*π*R³*p*g)/3 =(π*h²*(3R-h)*g)/3
Сокращая всё, что сокращается, и вводя обозначение x=h/R, приходим к уравнению
x³ - 3x² + 4p = 0
.
Уравнение - кубичное, а потому в программах решается численно. Сразу предупреждаю, что я использую свой любимый метод десятикратного дробления шага, а не это дебильное половинное деление, которому вас учат. Извините.
Искомая величина (d) есть (1-x)*R, при этом если центр шара находится над поверхностью воды, то считаем расстояние положительным, в противном случае - отрицательным.
Ну и сами программки:
Код:
Var
 d,p:Real;
 i:Byte;

Function Search_x(Ro:real):real;
var x,step:real; k:byte;
begin
 step:=1.0;
 x:=-0.1;
 for k:=1 to 5 do
  begin
   step:=step/10;
   Repeat
    x:=x+step;
   Until (x*x*x-x*x*3+Ro*4)<=0;
   x:=x-step;
  end;
 Search_x:=x;
end;

Begin
 For i:=1 to 19 do
  begin
   p:=0.05*i;
   d:=1-Search_x(p);
   writeln('p= ',p:4:2,'      D= ',d:8:5,'*R');
  end;
 readln;
End.
Код:
Var
 d,p:Real;

Function Search_x(Ro:real):real;
var x,step:real; k:byte;
begin
 step:=1.0;
 x:=-0.1;
 for k:=1 to 5 do
  begin
   step:=step/10;
   Repeat
    x:=x+step;
   Until (x*x*x-x*x*3+Ro*4)<=0;
   x:=x-step;
  end;
 Search_x:=x;
end;

Begin
 p:=0.5;
 While p<1 do
  begin
   write('Ball density (>0 and <1); "1" to quit: ');
   readln(p);
   d:=1-Search_x(p);
   writeln('p= ',p:4:2,'      D= ',d:8:5,'*R');
  end;
End.
Код:
Var
 d,p:Real;

Function Search_x(Ro:real):real;
var x,step:real; k:byte;
begin
 step:=1.0;
 x:=-0.1;
 for k:=1 to 5 do
  begin
   step:=step/10;
   Repeat
    x:=x+step;
   Until (x*x*x-x*x*3+Ro*4)<=0;
   x:=x-step;
  end;
 Search_x:=x;
end;

Begin
 Repeat
  write('Ball density (>0 and <1); "1" to quit: ');
  readln(p);
  d:=1-Search_x(p);
  writeln('p= ',p:4:2,'      D= ',d:8:5,'*R');
 Until p=1;
End.
 
Назад
Сверху