Консультация № 174593
27.11.2009, 19:16
0.00 руб.
0 10 1
Помогите уважаемые эксперты с задачкой:
1)Описать ф-цию подсчета кол-ва трехзначных натур.чисел,сумма цифр которых равняется n (1<=n<=27)
2)Описать процедуру нахождения длины стороны и велечин двух углов треугольника по велечине одного угла,длине противоположной стороны и длине одной стороны треугольника!

Обсуждение

Неизвестный
27.11.2009, 20:56
общий
То есть, этот известный угол НЕ МЕЖДУ сторонами с известными длинами?
Неизвестный
28.11.2009, 14:17
общий
да!
Неизвестный
28.11.2009, 19:35
общий
это ответ
Здравствуйте, angel.nero.
Это несложное задание. На будущее совет - не помещайте два вопроса в одну форму. Трудно делить.
Я, поскольку Вам нужны подпрограммы, все поместил в одну программу вместе с небольшими комментариями
Одно только, для второго задания сделал не процедуру, а функцию, которая возвращает результат логического типа.
Сами посудите: угол = 90[$186$], а гипотенуза (противоположная сторона) короче катета (прилежащая сторона)

Пример окна окна программы:
Код:
Введите целое число от 1 до 27: 4
Число трехзначных чисел, сумма цифр которого равна 4 равно 10
c = 3.00, betta = 53.13, gamma = 36.87


Приложение:
function CalcCount(n: Integer): Integer;
var sum, i, j: Integer;
count: Integer;
begin
count := 0;
for i:= 100 to 999 do begin
sum := 0;
j:=i;
while j > 0 do begin
sum := sum + j mod 10;
j := j div 10;
end;
if sum = n then inc(count)
end;
CalcCount := count
end;

{Хотя просили процедуру, написал функцию - возвращает результат =
можно ли построить. Пример: прямой угол, но противоположная сторона
(гипотенуза) задана меньше прилежащей (катет)}

{Угол задается в градусах}
function GetTriangle(angle1, len_opposite, len_another: Real;
VAR len, angle2, angle3: Real): Boolean;
begin
{Для вычислений используется теорема синусов. Помните её?}
{Сначала угол - а вдруг он задан больше 360 градусов?
Первым делом сохраним знак углаю. Так проще будет}
if angle1 > 0 then len :=1 else len :=-1;
angle1 := abs(angle1);
while angle1 > 360 do angle1 := angle1 - 360;
angle1 := angle1 * len;

GetTriangle := False;
angle1 := angle1*pi/180; {Переводим в радианы}
{Найдем угол напротив заданной стороны - потом с его помощью и нужный}
{Сначала синус угла}
angle2 := len_another*sin(angle1)/len_opposite;
{Вот проверка на существование! Синус по модулю не может быть больше 1}
if abs(angle2) > 1 then Exit; {Результат уже установлен = FALSE,
просто выходим}
{Особый случай angle = 1. Это, собственно, не прямоуголник, а прямая.
Но ведь может быть задано!}
if angle2 = 1 then angle2 := pi/2
else if angle2 = - 1 then angle2 := - pi/2
else angle2 := arctan(angle2/sqrt(1 - angle2*angle2));
{Третий угол найдем из условия, что сумма углов в треугольнике равна
180 градусов. У нас углы в радианах, значит pi}
angle3 := pi - angle1 - angle2;
{Длину третьей стороны через найденный угол и теорему синусов}
len := len_opposite*sin(angle3)/sin(angle1);
{Теперь в градусы}
angle2 := angle2*180/pi;
angle3 := angle3*180/pi;
{И сигнал о том, что все нормально}
GetTriangle := True
end;

var
Cnt: Integer;
alpha, betta, gamma, a, b, c: Real;
BEGIN
repeat
Write('Введите целое число от 1 до 27: '); ReadLn(Cnt);
if (Cnt < 1) or (Cnt > 27) then
Writeln('Неверный ввод. Попробуйте ещё раз');
until (Cnt >= 1) and (Cnt <= 27);
WriteLn('Число трехзначных чисел, сумма цифр которого равна ',Cnt,
' равно ',CalcCount(Cnt));
alpha := 90;
a := 5;
b := 4;
if GetTriangle(alpha, a, b, c, betta, gamma) then
WriteLn('c = ', c:10:2,', betta = ', betta:4:2,', gamma = ', gamma:4:2);
END.
Неизвестный
24.12.2009, 00:56
общий
Boriss:
Добрый вечер,Boriss!!!А вы можете проконсультировать по задачке на которую ответили?????
Неизвестный
24.12.2009, 10:57
общий
angel.nero:
Конечно. Это моя обязанность даже
Неизвестный
25.12.2009, 00:20
общий
Boriss:
Простите меня пожалуста,вот у меня вопросы по этой части текста
begin
{Для вычислений используется теорема синусов cначала угол - а вдруг он задан больше 360 градусов?
Первым делом сохраним знак углаю.}
if angle1 > 0 then
len :=1
else
len :=-1;
angle1 := abs(angle1);
while angle1 > 360 do
angle1 := angle1 - 360;
angle1 := angle1 * len;
GetTriangle := False;
angle1 := angle1*pi/180; {Переводим в радианы}
{Найдем угол напротив заданной стороны - потом с его помощью и нужный}
{Сначала синус угла}
angle2 := len_another*sin(angle1)/len_opposite;
{Вот проверка на существование! Синус по модулю не может быть больше 1}
if abs(angle2) > 1 then
Exit; {Результат уже установлен = FALSE,
просто выходим}
{случай angle = 1. Это, собственно, не прямоуголник, а прямая.Но ведь может быть задано!}
if angle2 = 1 then
angle2 := pi/2
else
if angle2 = - 1 then
angle2 := - pi/2
else
angle2 := arctan(angle2/sqrt(1 - angle2*angle2));
{Третий угол найдем из условия, что сумма углов в треугольнике равна
180 градусов. У нас углы в радианах, значит pi}
angle3 := pi - angle1 - angle2;
{Длину третьей стороны через найденный угол и теорему синусов}
len := len_opposite*sin(angle3)/sin(angle1);
{Теперь в градусы}
angle2 := angle2*180/pi;
angle3 := angle3*180/pi;
GetTriangle := True
1) В цикле While какие точно выполняются операторы,а какие не в цикле(это когда мы смотрим что пока больше 360)
2) Можно ли сделать без цикла
3)Можно ли сделать с помощью процедуры????
4) когда мы смотрим на проверку на сущетвование синуса,как сделать так чтобы exit,break не использовать???
Неизвестный
25.12.2009, 07:59
общий
1) В цикле While выполняется ТОЛЬКО один оператор
angle1 := angle1 - 360;

2) Можно. Если бы это было целое число, то можно было бы с помощью операции MOD (остаток от деления).
А тут придется с помощью еще одной целочисленной переменной (по сути, число циклов), например:
Код:
VAR
n: Integer;
...
Angle1 := Abs(Angle1); {Это все дальнейшее облегчат - "верхняя" полуплоскость}
n := Trunc(Angle1/360); {Вычисляет целую часть выражения, округляя в сторону нуля}
Angle1 := Angle1 - n*360;

3) С помощью процедуры что? Угол?
Тогда, например, так:
Код:
function GetAngle(Angle: Real): Real;
begin
Angle := abs(Angle);
While Angle > 360 do Angle := Angle - 360;
GetAngle := Angle
end;


4) Пишем так:
if abs(Angle2 <= 1) then
begin
{Все остальное до GetTriangle := True; включая и эту строку}
end
else
GetTriangle := False;

Если что-то останется непонятным - пишите сразу. Я практически весь день в сети
Неизвестный
25.12.2009, 19:41
общий
Boriss:
большое спасибо!Сегодня буду проверять,если что-то останется не понятным обязательно спрошу
Неизвестный
27.12.2009, 23:38
общий
у меня ругается при запуске на if abs(Angle2 <= 1) then пишет : подпрограммы.pas(36) : Нет перегруженной подпрограммы с такими типами параметров
использую pascal abc net (вузовская версия)
Неизвестный
27.12.2009, 23:43
общий
Boriss:
хотя вот заменил это if abs(Angle2 <= 1) на if (Angle2 >= -1) and (Angle2 <=1) then заработало!
P.S.
хотелось бы сразу уточнить к какой части или к какому оператору относится вот эта часть после else ???(просто у нас даже еслине правильно отформатируешь текст,у тебя задачку не примут)
angle2 := arctan(angle2/sqrt(1 - angle2*angle2));
{Третий угол найдем из условия, что сумма углов в треугольнике равна
180 градусов. У нас углы в радианах, значит pi}
angle3 := pi - angle1 - angle2;
{Длину третьей стороны через найденный угол и теорему синусов}
len := len_opposite*sin(angle3)/sin(angle1);
{Теперь в градусы}
angle2 := angle2*180/pi;
angle3 := angle3*180/pi;
GetTriangle := True;
end
else
GetTriangle := False;
Форма ответа