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

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

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

> Проверьте решение, Школьная задачка на равенство
Starichok
сообщение 8.11.2005 21:03
Сообщение #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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 11)
volvo
сообщение 8.11.2005 21:20
Сообщение #2


Гость






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

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


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

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

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


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

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

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


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


Гость






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





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

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


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


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

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


Дело в том, что программа должна работать на проверку при любых значениях длины стороны - a, и радиуса окружности - R...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.11.2005 1:27
Сообщение #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.

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





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

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


Ты прав 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.

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


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

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

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


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

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


Гость






Atos, yes2.gif

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

Надо бы Repeat ... Until что-ли поставить вместо этого...
 К началу страницы 
+ Ответить 
Starichok
сообщение 9.11.2005 15:41
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.11.2005 15:52
Сообщение #11


Гость






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





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

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


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


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

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

 



- Текстовая версия 20.07.2025 7:02
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"