Помощь - Поиск - Пользователи - Календарь
Полная версия: Проверьте решение
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Starichok
Знакомой дали задание написать программу для решения следующей задачи:
Дано два круга с радиусами R1 и R2. Можно ли вписать в какой-нибудь из них равносторонний треугольник?
Площадь равностороннего треугольника
S=a^2*sqrt(3)/4;
Площадь треугольника вписанного в окружность
S=a^3/(4*R);

Возможно ли следующее решение:

Program First;

var
A,B,C,D: Real;

begin

Write('Введите значение a: ');
Readln(A);
Write('Введите значение R1: ');
Readln(B);
{Площадь равностороннего треугольника}
C:= A * A * sqrt(3) / 4;
{Площадь треугольника вписанного в окружность}
D:= A * A * A / (4 * B);
If C<>D Then Writeln ('Не возможно для R1')
else Writeln ('Возможно для R1');
Write ('Введите значение R2: ');
Readln(B);
If C<>D Then Writeln ('Не возможно для R2')
else Writeln ('Возможно для R2');

Readln;
end.


P.S. Не судите строго - с Паскалем знаком второй день. no1.gif

М
Незнание правил не освобождает от ответственности, правила читать будем ?
Исходный текст программы надо заключать в теги CODE.
klem4

volvo
To: Starichok
Цитата
Дано два круга с радиусами R1 и R2. Можно ли вписать в какой-нибудь из них равносторонний треугольник?

Это твоя задача? Тогда тебе не нужна программа... Ответ - Да, можно... В любую окружность можно вписать равносторонний треугольник... Уточни условие...
klem4
Volvo, там ведь он еще вводит сторону треугольника, на сколько я понял, "значение а" - это именно она smile.gif

Starichok, ну если формулы правильные, то тогда все ок.
volvo
Тогда достаточно проверить, что радиус окружности равен a / sqrt(3) ... Только тогда (для равностороннего треугольника) это будет описанная окружность... А исходные данные надо указывать...
Starichok
Цитата(volvo @ 8.11.2005 21:27)
Тогда достаточно проверить, что радиус окружности равен a / sqrt(3) ...


Спасибо. Я тоже об этом подумал.

Цитата(volvo @ 8.11.2005 21:27)
А исходные данные надо указывать...


Дело в том, что программа должна работать на проверку при любых значениях длины стороны - a, и радиуса окружности - R...
volvo
Цитата(klem4 @ 8.11.2005 20:21)
Starichok, ну если формулы правильные, то тогда все ок.

Ага, сейчас прямо... blum.gif Особенно вот это:

Цитата(Starichok @ 8.11.2005 20:03)
begin
  { ... }
  Write('Введите значение R1: '); Readln(B);

  {Площадь равностороннего треугольника}
  C:= A * A * sqrt(3) / 4;
  {Площадь треугольника вписанного в окружность}
  D:= A * A * A / (4 * B);

  If C<>D Then Writeln ('Не возможно для R1')
  else Writeln ('Возможно для R1');

  {
    Спрашивается, зачем вводим B второй раз ???
    Все равно ничего не пересчитывалось...
  }
  Write ('Введите значение R2: '); Readln(B);
  If C<>D Then Writeln ('Не возможно для R2')
  else Writeln ('Возможно для R2');

  Readln;
end.

Starichok
Ты прав volvo, программа писалась под заданное условие: дано одно значение стороны треугольника - a и два значения радиуса - R1 R2. Но, как потом выяснилось, учительница хотела большего, чем просто проверки двух значений радиуса. Новый вариант выглядит прблизительн так:

Program Two;

var a,R: Real;
label 1;

begin

Write('Введите значение a: ');
Readln(a);
1:
Write('Введите значение R: ');
Readln®;
If a=R * sqrt(3) Then Writeln ('Возможно')
else Writeln ('Невозможно');
Goto 1;

Readln;
end.

Atos
Проверь, а будет ли программа вообще выдавать "Возможно"? Проблемы могут быть вот здесь
Код
If a=R * sqrt(3)

из-за погрешности машинного представлеия вещественных чисел это равенство скорее всего в точности выполняться не будет. Эта проблема обычно решается так:
проверку делаем
Код
If abs(a-R * sqrt(3)) <е
, где е задаём как очень маленькое число, например,
Код
const е=0.00001;
volvo
Atos, yes2.gif

Starichok,
а еще проблемы могут быть с выходом из программы. Как заканчивать работу с программой? Только ввести заведомо НЕчисловое значение, чтобы произошла RunTime Error. У тебя же по GoTo постоянный переход на ввод R... Но согласись, выход из программы через ошибку - это несерьезно...

Надо бы Repeat ... Until что-ли поставить вместо этого...
Starichok
Atos
Спасибо за подсказку, я именно в это и уперся. Попробовал сделать по твоему совету, но, учитывая, что в условии задачи R это либо целое число, либо десятичная дробь с двумя знаками после запятой, для того чтобы получить ответ "Возможно" пришлось изменить значение e на следующее:
Код

const e=0.01;

volvo
Цитата
а еще проблемы могут быть с выходом из программы...

Ты абсолютно прав volvo.
Цитата
согласись, выход из программы через ошибку - это несерьезно...

Полностью согласен.
Цитата
Надо бы Repeat ... Until что-ли поставить вместо этого...

Благодарю за совет. Поставил. Вот, что получилось:


Program Three;
const e=0.01;
var a, R: Real;

begin
Write('Введите значение a: ');
Readln(a);
REPEAT
Write('Введите значение R (0 - выход): ');
Readln( r );
If abs(a-R * sqrt(3)) <e Then Writeln ('Возможно')
else Writeln ('Невозможно');
UNTIL R=0;
Write('Конец программы...');
Readln;
end.
volvo
  UNTIL R=0;
nea.gif
Вот так лучше:
  UNTIL Abs( R ) < e;
Starichok
Цитата(volvo @ 9.11.2005 15:52)
  UNTIL R=0;
nea.gif
Вот так лучше:
  UNTIL Abs( R ) < e;


Спасибо. Изменю.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.