IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Проверьте решение, Школьная задачка на равенство
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


Знакомой дали задание написать программу для решения следующей задачи:
Дано два круга с радиусами 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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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

Это твоя задача? Тогда тебе не нужна программа... Ответ - Да, можно... В любую окружность можно вписать равносторонний треугольник... Уточни условие...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Volvo, там ведь он еще вводит сторону треугольника, на сколько я понял, "значение а" - это именно она smile.gif

Starichok, ну если формулы правильные, то тогда все ок.

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Тогда достаточно проверить, что радиус окружности равен a / sqrt(3) ... Только тогда (для равностороннего треугольника) это будет описанная окружность... А исходные данные надо указывать...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 8.11.2005 21:27)
Тогда достаточно проверить, что радиус окружности равен a / sqrt(3) ...


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

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


Дело в том, что программа должна работать на проверку при любых значениях длины стороны - a, и радиуса окружности - R...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Цитата(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.

 К началу страницы 
+ Ответить 
сообщение
Сообщение #7





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


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

Program Two;

var a,R: Real;
label 1;

begin

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

Readln;
end.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Прогрессор
****

Группа: Пользователи
Сообщений: 602
Пол: Мужской
Реальное имя: Михаил

Репутация: -  9  +


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

из-за погрешности машинного представлеия вещественных чисел это равенство скорее всего в точности выполняться не будет. Эта проблема обычно решается так:
проверку делаем
Код
If abs(a-R * sqrt(3)) <е
, где е задаём как очень маленькое число, например,
Код
const е=0.00001;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Atos, yes2.gif

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

Надо бы Repeat ... Until что-ли поставить вместо этого...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






  UNTIL R=0;
nea.gif
Вот так лучше:
  UNTIL Abs( R ) < e;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 9.11.2005 15:52)
  UNTIL R=0;
nea.gif
Вот так лучше:
  UNTIL Abs( R ) < e;


Спасибо. Изменю.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 22.04.2025 17:07
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name