1

Тема: Функції у мові С

Народ, допоможіть з розв'язком задачі, другий день мучусь..
Дано сторони двох трикутників: a, b, c та d, e, f.
Знайти, на скільки площа одного трикутника більша від другого.
Площа трикутника ABC зі сторонами A, B, C обчислюється за
формулою Герона
S = sqrt(R(R - A)(R - B)(R - C)),
де R - півпериметр трикутника ABC. Обчислення площі трикутників оформити у вигляді прцедури.

2

Re: Функції у мові С

Варто використати бібліотеку math.h, там є функція sqrt().
Підключити її можна так:

#include <math.h>

Після підключення бібліотек опишіть прототип функції:

float triangleSquare(float a, float b, float c, float ph);

По коду цю функцію можна буде викликати так:

triangleSquare(a, b, c, perimeterHalf);

Описати функцію варто після функції main(), при чому тіло функції заключити у фігурні дужки:

float triangleSquare(float a, float b, float c, float ph){
    // ... тіло функції
    return square;
}

Оголосити змінні в головній функції можна так:

float a, b, c, d, e, f;

Визначити їх за допомогою вводу так:

scanf("%f", &a);

Так для кожної змінної.
Також варто оголосити змінну для периметру.
Обчислення півпериметру можна провести так:

perimeterHalf = (a + b + c) / 2;

Це і буде ваш R.
Формула для площі у вас є, просто покладіть її всередину фунції. Тут я вашу S записав як square.
Порівняння площ можна здійснити за допомогою віднімання. Просто оголосіть іще дві змінні і потім в одній збережіть результат функції для першого трикутнику, а в іншій для другого, а потім виведіть користувачу повідомлення, в якому буде різниця:

printf("Trykutnyk 1 vidriznyaetsa vid trykutnyku 2 na %.4f\n", square1 - square2);

Спробуйте це зробити і скажіть в чому виникли проблеми, розберемось. :)

Білий Лунь

3

Re: Функції у мові С

dimaborodach написав:

Народ, допоможіть з розв'язком задачі, другий день мучусь..
Дано сторони двох трикутників: a, b, c та d, e, f.
Знайти, на скільки площа одного трикутника більша від другого.
Площа трикутника ABC зі сторонами A, B, C обчислюється за
формулою Герона
S = sqrt(R(R - A)(R - B)(R - C)),
де R - півпериметр трикутника ABC. Обчислення площі трикутників оформити у вигляді прцедури.

Показуйте код. Чи вас треба лиш морально підтримати?

I belong to the Dead Generation.
Подякували: koala1

4

Re: Функції у мові С

ні, морально підтримувати не треба
Дякую за допомогу у роз'ясненні, погортав форум, знайшов дещо подібне
Можливо викладачу не сподобається мій варіант розв'язку, але все ж він є

5

Re: Функції у мові С

dimaborodach написав:

ні, морально підтримувати не треба
Дякую за допомогу у роз'ясненні, погортав форум, знайшов дещо подібне
Можливо викладачу не сподобається мій варіант розв'язку, але все ж він є

А ви покажіть його тут - може, шанси сподобатися викладачеві у нього зростуть. :)

I belong to the Dead Generation.
Подякували: Ярослав, koala2

6 Востаннє редагувалося HegardD (12.01.2014 18:49:04)

Re: Функції у мові С

Якщо у вас є довжини всіх сторін, то я думаю зручніше зробить через іншу формулу. Ось таку -
S=sqrt((a+b+c)*(b+c-a)*(a+c-b)*(a+b-c))*1/4

Задача дуже проста)

7 Востаннє редагувалося Bartash (17.01.2014 16:12:52)

Re: Функції у мові С

Мій хід думок викладачу показався трошки громіздким, сказав переписати
помилок багацько, дайте поради і настанови як це виправити
ось що в мене вийшло:

#include <stdio.h>
#include <math.h>
#include <conio.h>

float t1(float a, float b, float c, float ph);
float t2(float d, float e, float f, float ph);

main()
{
 float r;
 float a,b,c,d,e,f;
 printf("Enter number - ");
 printf("A - "); scanf("%f",&a);
 printf("B - "); scanf("%f",&b);
 printf("C - "); scanf("%f",&c);
 printf("D - "); scanf("%f",&d);
 printf("E - "); scanf("%f",&e);
 printf("F - "); scanf("%f",&f);
 r=t1(a,b,c)-t2(d,e,f);
 printf ("%f", r);
 getch();
 return 0;
 }

float t1(float a, float b, float c, float ph)
 {
  ph=(a+b+c)/2;
  float s1=sqrt(ph*(ph-a)*(ph-b)*(ph-c));
  return s1;
 }
float t2(float d, float e, float f, float ph)
{
 ph=(d+e+f)/2;
 float s2=sqrt(ph*(ph-d)*(ph-e)*(ph-f));
 return s2;
}

Bartash: код слід брати у теги [ code ].

8 Востаннє редагувалося dimaborodach (17.01.2014 16:29:59)

Re: Функції у мові С

Здається повинно бути ось так?

#include <stdio.h>
#include <math.h>
#include <conio.h>

float t1(float a, float b, float c);

main()
{
 float r;
 float a,b,c,d,e,f,s1,s2;
 printf("Enter number - ");
 printf("A - "); scanf("%f",&a);
 printf("B - "); scanf("%f",&b);
 printf("C - "); scanf("%f",&c);
 printf("D - "); scanf("%f",&d);
 printf("E - "); scanf("%f",&e);
 printf("F - "); scanf("%f",&f);
 s1=t1(a,b,c);
 s2=t1(d,e,f);
 r=s1-s2;
 printf ("%f", r);
 getch();
 return 0;
 }

float t1(float a, float b, float c)
 {
  float ph;
  ph=(a+b+c)/2;
  return sqrt(ph*(ph-a)*(ph-b)*(ph-c));
  }



9 Востаннє редагувалося koala (17.01.2014 21:35:14)

Re: Функції у мові С

Можна ще спростити:

#include <stdio.h>
#include <math.h>
#include <conio.h>

float input(char *name);
float s(float a, float b, float c);//логічніше так назвати
#define read(x) x = input(#x);
void main()
{
  float a,b,c,d,e,f;
  printf("Enter numbers: ");
  read(a);read(b);read(c);
  read(d);read(e);read(f);
  printf ("Difference = %f", s(a,b,c)-s(d,e,f));
  getch();
}

float input(char *name)
{
  float f;
  printf("%s = ", name);
  scanf("%f", &f);
  return f;
}

float s(float a, float b, float c)
{
  float ph=(a+b+c)/2;
  return sqrt(ph*(ph-a)*(ph-b)*(ph-c));
}

10

Re: Функції у мові С

koala, скажіть, а якщо функцію реалізувати отак:

float s(float a, float b, float c)
{
  return sqrt(((a+b+c)/2)*(((a+b+c)/2)-a)*(((a+b+c)/2)-b)*(((a+b+c)/2)-c));
}

Компілятор зможе зоптимізувати вираз ((a+b+c)/2)?
(скажімо, візуал компілятор).

I belong to the Dead Generation.

11 Востаннє редагувалося koala (17.01.2014 21:55:16)

Re: Функції у мові С

1. Що ви маєте на увазі під "зоптимізувати"? Якось він це оптимізує, а як саме - треба дивитися.
2. "Візуал компілятор" - що це за річ така?

12

Re: Функції у мові С

koala написав:

1. Що ви маєте на увазі під "зоптимізувати"? Якось він це оптимізує, а як саме - треба дивитися.
2. "Візуал компілятор" - що це за річ така?

1. У сенсі - чи зоже він розпізнати, що той вираз кілька разів обчислюється в одному рядку і замість щоразу обчислювати його зробить це раз, а далі підставлятиме готове? Здається, я чув про щось подібне.
2. MSVC

I belong to the Dead Generation.

13

Re: Функції у мові С

Допоможіть із рекурсіями

#include <stdio.h>
#include <math.h>
#include <conio.h>
#define p 3.14

double fac(int n, int x);

double fac(int n, int x)
{
 double y=0;
 printf ("y - %d", y);
 y=x*sqrt(2/p)*(1-(pow((x/2),2*n)/((n-1)*n)*(2*n+1)));
 return;
}
main()
{
 float n,x;
 clrscr();
 printf ("Enter X - "); scanf ("%f",&x);
 printf ("Enter kilkist factorialiv - "); scanf ("%f",&n);
 fac(n,x);
 getch();
 return(0);
}

Завдання
https://pp.vk.me/c616916/v616916676/4e7f/pzUey7UkKrY.jpg

Post's attachments

Безымянный.jpg 47.77 kb, 37 downloads since 2014-01-18 

14

Re: Функції у мові С

Правила почитайте, га?

Подякували: Bartash1

15

Re: Функції у мові С

Код - із Борлянда. І неробочий.
То у чому питання, ТС?

Прогледів спросоння.

dimaborodach, зауваження: для окремих задач створюйте окремі теми.

I belong to the Dead Generation.