![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Starichok |
![]() ![]()
Сообщение
#1
|
|||
Группа: Пользователи Сообщений: 5 Пол: Мужской Репутация: ![]() ![]() ![]() |
Знакомой дали задание написать программу для решения следующей задачи:
Дано два круга с радиусами 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. Не судите строго - с Паскалем знаком второй день. ![]()
|
|||
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
To: Starichok
Цитата Дано два круга с радиусами R1 и R2. Можно ли вписать в какой-нибудь из них равносторонний треугольник? Это твоя задача? Тогда тебе не нужна программа... Ответ - Да, можно... В любую окружность можно вписать равносторонний треугольник... Уточни условие... |
klem4 |
![]()
Сообщение
#3
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Volvo, там ведь он еще вводит сторону треугольника, на сколько я понял, "значение а" - это именно она
![]() Starichok, ну если формулы правильные, то тогда все ок. Сообщение отредактировано: klem4 - 8.11.2005 21:26 -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Тогда достаточно проверить, что радиус окружности равен a / sqrt(3) ... Только тогда (для равностороннего треугольника) это будет описанная окружность... А исходные данные надо указывать...
|
Starichok |
![]()
Сообщение
#5
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата(volvo @ 8.11.2005 21:27) Тогда достаточно проверить, что радиус окружности равен a / sqrt(3) ... Спасибо. Я тоже об этом подумал. Цитата(volvo @ 8.11.2005 21:27) А исходные данные надо указывать... Дело в том, что программа должна работать на проверку при любых значениях длины стороны - a, и радиуса окружности - R... |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Цитата(klem4 @ 8.11.2005 20:21) Starichok, ну если формулы правильные, то тогда все ок. Ага, сейчас прямо... ![]() Цитата(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 |
![]()
Сообщение
#7
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ты прав 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.
|
Atos |
![]()
Сообщение
#8
|
![]() Прогрессор ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 602 Пол: Мужской Реальное имя: Михаил Репутация: ![]() ![]() ![]() |
Проверь, а будет ли программа вообще выдавать "Возможно"? Проблемы могут быть вот здесь
Код If a=R * sqrt(3) из-за погрешности машинного представлеия вещественных чисел это равенство скорее всего в точности выполняться не будет. Эта проблема обычно решается так: проверку делаем Код If abs(a-R * sqrt(3)) <е , где е задаём как очень маленькое число, например, Код const е=0.00001; |
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Atos,
![]() Starichok, а еще проблемы могут быть с выходом из программы. Как заканчивать работу с программой? Только ввести заведомо НЕчисловое значение, чтобы произошла RunTime Error. У тебя же по GoTo постоянный переход на ввод R... Но согласись, выход из программы через ошибку - это несерьезно... Надо бы Repeat ... Until что-ли поставить вместо этого... |
Starichok |
![]()
Сообщение
#10
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Репутация: ![]() ![]() ![]() |
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 |
![]()
Сообщение
#11
|
Гость ![]() |
UNTIL R=0;
![]() Вот так лучше: UNTIL Abs( R ) < e;
|
Starichok |
![]()
Сообщение
#12
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата(volvo @ 9.11.2005 15:52) UNTIL R=0;
![]() Вот так лучше: UNTIL Abs( R ) < e;
Спасибо. Изменю. |
![]() ![]() |
![]() |
Текстовая версия | 27.07.2025 10:38 |