Среда, 24 Апреля 2024, 22:58

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Delphi/Pascal/Object Pascal » Помогите решить задачу. (Турбо Паскаль.)
Помогите решить задачу.
QWER56Дата: Воскресенье, 19 Сентября 2010, 08:39 | Сообщение # 1
старожил
Сейчас нет на сайте
Нужно написать программу, которая высчитывает площадь треугольника по длинам трёх сторон, по формуле Герона.

Вот, что у меня получилось:

Code
program ger;
uses crt;
var a, b, c:integer;
function geron(a,b,c:integer):double;
var p:double;
begin
      p:=(a+b+c)/2;
      geron:=p*(p-a)*(p-b)*(p-c);
end;
begin
      write('vvedite a-> '); readln(a);
      write('vvedite b-> '); readln(b);
      write('vvedite c-> '); readln(c);
      writeln(geron(a,b,c));
      readkey;
end.
         
     

Но программа выдаёт такой ответ:


Как это исправить? А то в Паскале я не очень разбираюсь.

Для тех кто не знает, то ФОРУМУЛА ГЕРОНА.

Прикрепления: 4794526.jpg (22.5 Kb)


ConsMark - поисковик по интернет магазинам.

Сообщение отредактировал QWER56 - Воскресенье, 19 Сентября 2010, 08:42
mitchДата: Воскресенье, 19 Сентября 2010, 09:35 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
QWER56, а квадратный корень у тебя где?
должно же быть вроде так:
geron := sqrt ( p * ( p - a ) * ( p - b ) * ( p - c ) )

и зачем там функция geron?
можно же просто завести переменные a, b, c, p, geron

Сообщение отредактировал mitch - Воскресенье, 19 Сентября 2010, 09:36
QWER56Дата: Воскресенье, 19 Сентября 2010, 12:58 | Сообщение # 3
старожил
Сейчас нет на сайте
mitch, щас попробую.

Добавлено (19.09.2010, 12:58)
---------------------------------------------
Только всё равно та же проблема.


ConsMark - поисковик по интернет магазинам.
bumДата: Воскресенье, 19 Сентября 2010, 13:12 | Сообщение # 4
почетный гость
Сейчас нет на сайте
Как уже было сказано выше - пропущен квадратный корень в формуле герона. Но я так понимаю, вас больше интересует как увидеть результат в более привычном виде? Можно использовать некоторые возможности паскаля в плане форматированного вывода:
Code

writeln(geron(a,b,c):10:3);    

Здесь первое число после двоеточия - количество символьных розрядов которые вы хотите выделить под вывод данных (данные будут выведены с выравниванием по правому краю), а второе число указывает на желаемое количество десятичных разрядов.

Вот я чуть подправил код: http://ideone.com/Mxs15

Сообщение отредактировал bum - Воскресенье, 19 Сентября 2010, 13:19
lvovandДата: Воскресенье, 19 Сентября 2010, 13:17 | Сообщение # 5
старожил
Сейчас нет на сайте
правильно сказали, во-первых корень взять, sqrt ( p * ( p - a ) * ( p - b ) * ( p - c ) )
во-вторых вывод результата чмитаемым сделай через форматированный вывод
формат
Write(n:s:d);

n - это переменная вещественного типа;
s - количество позиций для вывода значения переменной n;
d - количество знаков после запятой


Разработка и продвижение сайтов. Дизайн
TrueIfritДата: Суббота, 25 Сентября 2010, 19:58 | Сообщение # 6
Свободный геймдизайнер
Сейчас нет на сайте
Code
program ger;
uses crt;
label metka;
var a, b, c: longint;
function geron(a,b,c:integer): extended;
var p: extended;
begin
           p:=(a+b+c)/2;
           geron:=sqrt(p*(p-a)*(p-b)*(p-c));
end;
begin
           metka : clrscr;
           write('Please, enter the A -> '); readln(a);
           write('Please, enter the B -> '); readln(b);
           write('Please, enter the C -> '); readln(c);
           if ((a + b) >= c) and ((a + c) >= b) and ((b + c) >= a) then
               writeln(geron(a,b,c):10:3)
           else goto metka;
           readkey;
end.

При вводе значений 3, 3 и 3 все работало. При вводе 1, 3 и 5 была ошибка:
Quote

Program
[путь к программе]
exited with
exitcode = 207

Это связано с тем что треугольник 1, 3 и 5 невозможен, задача решена, спасибо, Йож wink


Сообщение отредактировал TrueIfrit - Суббота, 25 Сентября 2010, 21:02
ezhickovichДата: Суббота, 25 Сентября 2010, 20:46 | Сообщение # 7
[Великий и могучий хозяинъ]
Сейчас нет на сайте
Code
#include <stdio.h>
#include <math.h>

float fuckthisbrain (int a, int b, int c)
{
  float p = (a + b +c)/2;
  return sqrt (p*(p - a)*(p - b)*(p - c));
}

int main ()
{
  int a, b, c;
   
  scanf ("%d%d%d", &a, &b, &c);
  printf ("%f", fuckthisbrain (a, b, c));
   
  return 0;
}

Добавлено (25.09.2010, 20:46)
---------------------------------------------

Quote (TrueIfrit)
При вводе 1, 3 и 5 была ошибка

Quote
[20:41:20] <ezhickovich> хмм...
[20:41:48] <ezhickovich> 1 + 3 + 5 = 9
[20:42:01] <ezhickovich> 9/2 = 4.5
[20:42:17] <ezhickovich> 4.5 - 1 = 3.5
[20:42:30] <ezhickovich> 4.5 - 3 = 1.5
[20:42:48] <TrueIfrit> странно
[20:42:50] <TrueIfrit> все это
[20:42:51] <ezhickovich> 4.5 - 5 = -1.5
[20:43:01] <TrueIfrit> хмм...
[20:43:02] <ezhickovich> -1.5!!!!!!!!!!!!
[20:43:21] <TrueIfrit> но почему он не хочет показывать отрицательные значения?
[20:43:23] <ezhickovich> при умножении на минус получается минус...
[20:43:43] <ezhickovich> а из минуса нельзя вычичлить корень...
[20:43:52] <ezhickovich> FAIL
[20:43:58] <ezhickovich> во как...
[20:44:48] <ezhickovich> треугольник 1 3 5 просто невозможен...
[20:45:15] <ezhickovich> вот поэтому и FAIL



Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
simtikoДата: Суббота, 25 Сентября 2010, 20:47 | Сообщение # 8
почти ветеран
Сейчас нет на сайте
Code


program ger;
uses crt;
var a, b, c,p,geron:real;

begin
       write('vvedite a-> '); readln(a);
       write('vvedite b-> '); readln(b);
       write('vvedite c-> '); readln(c);
       p:=(a+b+c)/2;
       geron := sqrt ( p * ( p - a ) * ( p - b ) * ( p - c ) );
       writeln(geron);
       readkey;
end.
TrueIfritДата: Суббота, 25 Сентября 2010, 20:49 | Сообщение # 9
Свободный геймдизайнер
Сейчас нет на сайте
Изменил свой вариант решения - [клик!] - делал в Free Pascal IDE, все работает
ezhickovich, еще раз аригато wink
lvovandДата: Суббота, 25 Сентября 2010, 20:49 | Сообщение # 10
старожил
Сейчас нет на сайте
сумма длин двух сторон треугольника всегда больше длины третьей стороны, таким образом треугольника со сторонами 1, 3 и 5 просто не может существовать, можно перед расчетом площади организовать эту проверку

Разработка и продвижение сайтов. Дизайн
TrueIfritДата: Суббота, 25 Сентября 2010, 21:02 | Сообщение # 11
Свободный геймдизайнер
Сейчас нет на сайте
Добавил в свой код проверку, спс lvovand
ezhickovichДата: Суббота, 25 Сентября 2010, 21:03 | Сообщение # 12
[Великий и могучий хозяинъ]
Сейчас нет на сайте
Code
#include <stdio.h>
#include <math.h>

float fuckthisbrain (int a, int b, int c)
{
  float p = (a + b +c)/2;
  return sqrt (p*(p - a)*(p - b)*(p - c));
}

int main ()
{
  int a, b, c;
   
  do {
  scanf ("%d%d%d", &a, &b, &c);
  } while (!((a + b >= c) && (b + c >= a) && (a + c >= b)));
   
  printf ("%f", fuckthisbrain (a, b, c));
   
  return 0;
}

Исправил... ( с учётом проверок )



Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
Форум игроделов » Программирование » Delphi/Pascal/Object Pascal » Помогите решить задачу. (Турбо Паскаль.)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг