Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.85
alemor
1 / 1 / 0
Регистрация: 03.06.2010
Сообщений: 61
#1

Используя датчик случайных чисел, получить координаты вершин треугольника x1, y1, x2, y2, x3, y3, принадлежащие отрезку [-5,5] - C++

07.10.2010, 16:12. Просмотров 2635. Ответов 42
Метки нет (Все метки)

Составьте программу для выполнения следующих заданий:
1. Ввести с клавиатуры длины отрезков a, b и c.
2. Проверить, могут ли быть эти отрезки сторонами треугольника, и вывести соответствующее сообщение.
3. Используя формулу Герона и теоремы синусов и косинусов, вычислить периметр и площадь треугольника, высоты ha, hb и hc, медианы ma, mb и mc и биссектрисы la, lb и lc треугольника.
4. Вывести результаты вычислений с комментариями на экран дисплея.
5. Используя датчик случайных чисел, получить координаты вершин треугольника x1, y1, x2, y2, x3, y3, принадлежащие отрезку [-5,5].
6. Не используя формулы Герона и теоремы косинусов, вычислить периметр, площадь и медианы треугольника.
7. Вычислить длины наибольшей и наименьшей сторон треугольника.
8. Вывести с комментариями результаты вычислений (координаты вершин, периметр, площадь и медианы, длины наименьшей и наибольшей сторон треугольника) на экран дисплея.
9. Напечатать длины сторон в порядке возрастания.

Начиная с 5 пункта не чего не получается. И не понимаю как сделать меню консольного вида(
Прошу не злится только начал изучать С++ самостоятельно и вот напал на такую задачу)

Добавлено через 21 час 29 минут
Что не кто не может помочь?

Добавлено через 6 часов 19 минут
Начал работать непосредственно в С и вот:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include "math.h"
int a,b,c;
int ha,hb,hc;
int ma,mb,mc;
int la,lb,lc;
int x1,x2,x3;
int z1,z2,z3;
double p, s;
int _tmain(int argc, _TCHAR* argv[])
{
    printf("Введите длину отрезка a\n");
    scanf("%d", &a);
    printf("Вы ввели число %d, спасибо!\n", a);
    printf("Введите длину отрезка b\n");
    scanf("%d", &b);
    printf("Вы ввели число %d, спасибо!\n", b);
    printf("Введите длину отрезка c\n");
    scanf("%d", &c);
    printf("Вы ввели число %d, спасибо!\n", c);
 {
    if (a+b<c) printf("Треугольник получился\n");
    else if (a+b>c) printf("Не треугольник попробуйте заново\n");
        p=a+b+c;
        printf("Периметр равен: %d\n", p);
    return 0;
    
 }
}
Во первых не складывает не целые числа(
Во вторых не ищет периметр(

Добавлено через 17 часов 33 минуты
Да уж ну тут и программисты(((( Вообще не кто не помог(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2010, 16:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Используя датчик случайных чисел, получить координаты вершин треугольника x1, y1, x2, y2, x3, y3, принадлежащие отрезку [-5,5] (C++):

Сформировать одномерный массив целых чисел, используя датчик случайных чисел - C++
1) Сформировать одномерный массив целых чисел, используя датчик случайных чи-сел. 2) Распечатать полученный массив. 3) Удалить элементы...

Сформировать одномерный массив целых чисел, используя датчик случайных чисел - C++
Сформировать одномерный массив целых чисел, используя датчик случайных чисел.Распечатать полученный массив. Удалить 5 первых элементов...

Сформировать одномерный массив целых чисел, используя датчик случайных чисел - C++
1)Сформировать одномерный массив целых чисел, используя датчик случайных чисел. 2)Распечатать полученный массив. 3)Перевернуть массив...

Сформировать одномерный массив целых чисел, используя датчик случайных чисел. - C++
Сформировать одномерный массив целых чисел, используя датчик случайных чисел. Удалить 5 последних элементов массива. Добавить в...

Сформировать одномерный массив целых чисел, используя датчик случайных чисел - C++
Удалить элементы кратные 7. Добавить после каждого нечетного элемента массива элемент со значением 0.

Сформировать одномерный массив целых чисел, используя датчик случайных чисел - C++
Условие такое 1.Сформировать одномерный массив целых чисел, используя датчик случайных чисел. Распечатать полученный массив. ...

42
alemor
1 / 1 / 0
Регистрация: 03.06.2010
Сообщений: 61
09.10.2010, 22:31  [ТС] #16
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
char key;
  key=getc(stdin);
  fflush(stdin);
  key=toupper(key);
  switch (key)
  {
     case '1':
     {
        float a,b,c;
        printf("Введите A: ");
        a=getc(stdin);
        fflush(stdin);
        printf("Введите B: ");
        b=getc(stdin);
        fflush(stdin);
        printf("Введите C: ");
        c=getc(stdin);
        fflush(stdin);
        if (a+b<=c || a+c<=b || b+c<=a)
        float p=a+b+c;
        printf("Периметр: %3.3f\n",p);
        p/=2;
    float s=sqrt(p*(p-a)*(p-b)*(p-c));
    printf("Площадь: %3.3f\n",s);
    float h=2*s/a; 
    float asin=h/b;
    float acos=sqrt(1-asin*asin);
    float a2sin=sqrt(0.5*(1+acos));
    float m=h/a2sin;
    float bs=2*s/a2sin/(a+b);
    printf("Высота, медиана, биссектрисса A: %3.3f, %3.3f, %3.3f\n",h,m,bs);
    h=2*s/b;
    asin=h/c;
    acos=sqrt(1-asin*asin);
    a2sin=sqrt(0.5*(1+acos));
    m=h/a2sin;
    bs=2*s/a2sin/(c+b);
    printf("Высота, медиана, биссектрисса B: %3.3f, %3.3f, %3.3f\n",h,m,bs);
    h=2*s/a;
    asin=h/c;
    acos=sqrt(1-asin*asin);
    a2sin=sqrt(0.5*(1+acos));
    m=h/a2sin;
    bs=2*s/a2sin/(a+c);
    printf("Высота, медиана, биссектрисса C: %3.3f, %3.3f, %3.3f\n",h,m,bs);
        break;
     }
     case '2':break;
     case 'X':goto end;break;
     default:goto begin;break;
  }
  getc(stdin);
  end:return 0;
}
Вроде все ок? Но почему-то пишет ошибка индификатора sqrt у всех sqrt! Что делать и как исправить.

Добавлено через 3 минуты
И еще сработал рандом с команды 10*rand()/RAND_MAX-5
0
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.10.2010, 22:33 #17
Вы подключили заголовочный файл math.h?
0
alemor
1 / 1 / 0
Регистрация: 03.06.2010
Сообщений: 61
10.10.2010, 14:44  [ТС] #18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include "StdAfx.h"
#include "stdio.h"
#include "ctype.h"
#include "math.h"
 
 
 
int main()
{
  printf("Лаболаторная работа номер 1\n");
  begin:printf("Выберите действие:\n   1 - Часть 1;\n   2 - Часть 2;\n   X - Выход\n");
  char key;
  key=getc(stdin);
  fflush(stdin);
  key=toupper(key);
  switch (key)
  {
     case '1':
     {
        float a,b,c;
        printf("Введите A: ");
        a=getc(stdin);
        fflush(stdin);
        printf("Введите B: ");
        b=getc(stdin);
        fflush(stdin);
        printf("Введите C: ");
        c=getc(stdin);
        fflush(stdin);
        if (a+b>=c || a+c>=b || b+c>=a) printf("Треугольник получился\n");
        else if (a+b<=c || a+c<=b || b+c<=a) printf("Не треугольник попробуйдете заново\n");
        float p=a+b+c;
        printf("Периметр: %3.3f\n",p);
        p/=2;
    float s=sqrt(p*(p-a)*(p-b)*(p-c));
    printf("Площадь: %3.3f\n",s);
    float h=2*s/a; 
    float asin=h/b;
    float acos=sqrt(1-asin*asin);
    float a2sin=sqrt(0.5*(1+acos));
    float m=h/a2sin;
    float bs=2*s/a2sin/(a+b);
    printf("Высота, медиана, биссектрисса A: %3.3f, %3.3f, %3.3f\n",h,m,bs);
    h=2*s/b;
    asin=h/c;
    acos=sqrt(1-asin*asin);
    a2sin=sqrt(0.5*(1+acos));
    m=h/a2sin;
    bs=2*s/a2sin/(c+b);
    printf("Высота, медиана, биссектрисса B: %3.3f, %3.3f, %3.3f\n",h,m,bs);
    h=2*s/a;
    asin=h/c;
    acos=sqrt(1-asin*asin);
    a2sin=sqrt(0.5*(1+acos));
    m=h/a2sin;
    bs=2*s/a2sin/(a+c);
    printf("Высота, медиана, биссектрисса C: %3.3f, %3.3f, %3.3f\n",h,m,bs);
        break;
     }
     case '2':break;
     case 'X':goto end;break;
     default:goto begin;break;
  }
  getc(stdin);
  end:return 0;
}
Вот новая все работает осталось только с рандомом сделать. И возник вопрос а можно сразу всем х и у присвоить значение 10*rand()/RAND_MAX-5 и получались разные числа? И как сделать чтобы после работы первого задания или второго он возвращался обратно в меню?
0
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.10.2010, 15:02 #19
Вы главное в начале программы напишите srand((unsigned)time(NULL)); и подключите хидер time.h. А потом просто пишите сразу
C
1
2
3
4
5
6
x1 = 10*rand()/RAND_MAX-5;
y1 = 10*rand()/RAND_MAX-5;
x2 = 10*rand()/RAND_MAX-5;
y2 = 10*rand()/RAND_MAX-5;
x3 = 10*rand()/RAND_MAX-5;
y3 = 10*rand()/RAND_MAX-5;
И везде будут разные случайные числа.
Для того, чтобы программа возвращалась в меню, засуньте принтф с предложение ввести вариант работы и далее до закрывающей скобки кейса в бесконечный цикл.
0
alemor
1 / 1 / 0
Регистрация: 03.06.2010
Сообщений: 61
10.10.2010, 15:08  [ТС] #20
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include "StdAfx.h"
#include "stdio.h"
#include "ctype.h"
#include "math.h"
#include "cstdlib"
 
 
 
 
int main()
{
  printf("Лаболаторная работа номер 1\n");
  begin:printf("Выберите действие:\n   1 - Часть 1;\n   2 - Часть 2;\n   X - Выход\n");
  char key;
  key=getc(stdin);
  fflush(stdin);
  key=toupper(key);
  switch (key)
  {
     case '1':
     {
        float a,b,c;
        printf("Введите A: ");
        a=getc(stdin);
        fflush(stdin);
        printf("Введите B: ");
        b=getc(stdin);
        fflush(stdin);
        printf("Введите C: ");
        c=getc(stdin);
        fflush(stdin);
        if (a+b>=c || a+c>=b || b+c>=a) printf("Треугольник получился\n");
        else if (a+b<=c || a+c<=b || b+c<=a) printf("Не треугольник попробуйдете заново\n");
        float p=a+b+c;
        printf("Периметр: %3.3f\n",p);
        p/=2;
        float s=sqrt(p*(p-a)*(p-b)*(p-c));
        printf("Площадь: %3.3f\n",s);
        float h=2*s/a; 
        float asin=h/b;
        float acos=sqrt(1-asin*asin);
        float a2sin=sqrt(0.5*(1+acos));
        float m=h/a2sin;
        float bs=2*s/a2sin/(a+b);
        printf("Высота, медиана, биссектрисса A: %3.3f, %3.3f, %3.3f\n",h,m,bs);
        h=2*s/b;
        asin=h/c;
        acos=sqrt(1-asin*asin);
        a2sin=sqrt(0.5*(1+acos));
        m=h/a2sin;
        bs=2*s/a2sin/(c+b);
        printf("Высота, медиана, биссектрисса B: %3.3f, %3.3f, %3.3f\n",h,m,bs);
        h=2*s/a;
        asin=h/c;
        acos=sqrt(1-asin*asin);
        a2sin=sqrt(0.5*(1+acos));
        m=h/a2sin;
        bs=2*s/a2sin/(a+c);
        printf("Высота, медиана, биссектрисса C: %3.3f, %3.3f, %3.3f\n",h,m,bs);
        break; 
        
     }
     case '2':
         {
             float x1=10*rand()/RAND_MAX-5;
             float x2=10*rand()/RAND_MAX-5;
             float x3=10*rand()/RAND_MAX-5;
             float y1=10*rand()/RAND_MAX-5;
             float y2=10*rand()/RAND_MAX-5;
             float y3=10*rand()/RAND_MAX-5;
             float a=sqrt(pow(x2-x1,2)+pow(y2-y1,2));
             float b=sqrt(pow(x3-x1,2)+pow(y3-y1,2));
             float c=sqrt(pow(x3-x2,2)+pow(y3-y2,2));
             float p=a+b+c;
             printf("Периметр: %3.3f\n",p);
             
         break;
         }
     case 'X':goto end;break;
     default:goto begin;break;
  }
  getc(stdin);
  end:return 0;
}
Но площадь без формулы герон и формул синуса и косинуса не получается найти(

Вот это вообще не понял: Для того, чтобы программа возвращалась в меню, засуньте принтф с предложение ввести вариант работы и далее до закрывающей скобки кейса в бесконечный цикл. особенно про бесконечный цикл.
0
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.10.2010, 15:18 #21
Примерно так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include "StdAfx.h"
#include "stdio.h"
#include "ctype.h"
#include "math.h"
#include "cstdlib"
 
 
 
 
int main()
{
    while (1)
    {
          printf("Лаболаторная работа номер 1\n");
          begin:printf("Выберите действие:\n   1 - Часть 1;\n   2 - Часть 2;\n   X - Выход\n");
          char key;
          key=getc(stdin);
          fflush(stdin);
          key=toupper(key);
          switch (key)
          {
             case '1':
             {
                float a,b,c;
                printf("Введите A: ");
                a=getc(stdin);
                fflush(stdin);
                printf("Введите B: ");
                b=getc(stdin);
                fflush(stdin);
                printf("Введите C: ");
                c=getc(stdin);
                fflush(stdin);
                        if (a+b>=c || a+c>=b || b+c>=a) printf("Треугольник получился\n");
                else if (a+b<=c || a+c<=b || b+c<=a) printf("Не треугольник попробуйдете заново\n");
                        float p=a+b+c;
                printf("Периметр: %3.3f\n",p);
                p/=2;
                    float s=sqrt(p*(p-a)*(p-b)*(p-c));
                    printf("Площадь: %3.3f\n",s);
                        float h=2*s/a;
                        float asin=h/b;
                        float acos=sqrt(1-asin*asin);
                        float a2sin=sqrt(0.5*(1+acos));
                        float m=h/a2sin;
                        float bs=2*s/a2sin/(a+b);
                        printf("Высота, медиана, биссектрисса A: %3.3f, %3.3f, %3.3f\n",h,m,bs);
                        h=2*s/b;
                        asin=h/c;
                        acos=sqrt(1-asin*asin);
                        a2sin=sqrt(0.5*(1+acos));
                        m=h/a2sin;
                        bs=2*s/a2sin/(c+b);
                        printf("Высота, медиана, биссектрисса B: %3.3f, %3.3f, %3.3f\n",h,m,bs);
                        h=2*s/a;
                        asin=h/c;
                        acos=sqrt(1-asin*asin);
                        a2sin=sqrt(0.5*(1+acos));
                        m=h/a2sin;
                    bs=2*s/a2sin/(a+c);
                    printf("Высота, медиана, биссектрисса C: %3.3f, %3.3f, %3.3f\n",h,m,bs);
                break;
 
             }
             case '2':
                         {
                                 float x1=10*rand()/RAND_MAX-5;
                                 float x2=10*rand()/RAND_MAX-5;
                                 float x3=10*rand()/RAND_MAX-5;
                                 float y1=10*rand()/RAND_MAX-5;
                                 float y2=10*rand()/RAND_MAX-5;
                                 float y3=10*rand()/RAND_MAX-5;
                                 float a=sqrt(pow(x2-x1,2)+pow(y2-y1,2));
                                 float b=sqrt(pow(x3-x1,2)+pow(y3-y1,2));
                                 float c=sqrt(pow(x3-x2,2)+pow(y3-y2,2));
                                 float p=a+b+c;
                                 printf("Периметр: %3.3f\n",p);
 
                         break;
                         }
             case 'X':goto end;break;
                 default:goto begin;break;
          }
    }
  getc(stdin);
  end:return 0;
}
1
alemor
1 / 1 / 0
Регистрация: 03.06.2010
Сообщений: 61
10.10.2010, 15:29  [ТС] #22
А как найти площадь и медиану без формул герона и синуса косинуса?В С++ есть какие нибуть трюки для этого?
0
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.10.2010, 15:30 #23
На счёт формулы Герона: вы же на математика учитесь! А запрет на Герона вас уже в ступор ввёл. Тут площадь как минимум двумя способами можно вычислить, исходя из известных данных:
1. S = 0.5 * c * hc (c - основание, hc - высота, на него проведённая)
2. S = 0.5 * a * b * sin(a^b).
Вы можете, имея координаты всех вершин, опустить перпендикуляр из одной вершины на прямую, проходящую через две других и узнать его длину. Вот вам и высота. Так же легко найти угол между двумя прямыми. Учебник по линейке в руки и вперёд.
0
alemor
1 / 1 / 0
Регистрация: 03.06.2010
Сообщений: 61
10.10.2010, 15:33  [ТС] #24
Это то я знаю) Я думал может в Си есть какие нибуть приемчики)(команды специальные)
0
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.10.2010, 15:34 #25
Си - язык программирования. Если бы в нём были приёмчики для нужд математиков, а ещё для физиков, про экономистов, биологов и химиков не забудем... Как думаете, сколько бы весил компилятор и сколько бы он стоил?
0
alemor
1 / 1 / 0
Регистрация: 03.06.2010
Сообщений: 61
10.10.2010, 15:38  [ТС] #26
Тоже верно) Но надежда умирает последней)
0
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.10.2010, 15:41 #27
Да у вас же всё просто, вычислили расстояние от точки до прямой - вот вам высота. Вычислили длину этой прямой - вот вам основание. Перемножили их да домножили на 0,5 - вот вам площадь.
Медианы - проще некуда! Нашли длины всех сторон. mc = sqrt((2a^2 + 2b^2 - c^2) / 4) - вот вам медиана на сторону c. Переставили длины сторон местами, получили две оставшиеся медианы... 10 строк кода, ничего сложного.
1
alemor
1 / 1 / 0
Регистрация: 03.06.2010
Сообщений: 61
10.10.2010, 15:53  [ТС] #28
А как вычислить длины наибольшей и наименьшей сторон треугольника.
0
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.10.2010, 16:02 #29
Вычисляете всё длины (они вам дальше, для вычисления площади и медианы, всё равно понадобятся) и среди них ищете наибольшую и наименьшую.
Примерно так (решение в лоб, скорее всего можно упростить):
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if (a >= b && a >= c)
    max = a;
else
{
    if (b >= a && b >= c)
        max = b;
    else
        max = c;
}
 
if (a <= b && a <= c)
    min = a;
else
{
    if (b <= a && b <= c)
        min = b;
    else
        min = c;
}
0
alemor
1 / 1 / 0
Регистрация: 03.06.2010
Сообщений: 61
10.10.2010, 16:13  [ТС] #30
А как вывести на экран наибольшую и наименьшую стороны. Изходя из выше написанного.
0
10.10.2010, 16:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2010, 16:13
Привет! Вот еще темы с ответами:

Используя датчик случайных чисел, запол*нить массив из двадцати -элементов неповторяющи*мися числами - C++
Используя датчик случайных чисел, запол*нить массив из двадцати -элементов неповторяющи*мися числами.

Используя датчик случайных чисел на интервале получить целочисленный массив, состоящий из 320 элементов - Turbo Pascal
С помощью датчика случайных чисел на интервале (-250,100) получить целочисленный массив,состоящий из 320 элементов.

Сформировать одномерный массив целых чисел, используя датчик случайных чисел - Turbo Pascal
1) Сформировать одномерный массив целых чисел, используя датчик случайных чисел. 2) Распечатать полученный массив. 3) Удалить последний...

Используя датчик случайных чисел, составить программу подбрасывания монеты - PascalABC.NET
Используя датчик случайных чисел, составить программу, моделирующую процесс подбрасывания монеты. Подсчитать число выпадений &quot;орла&quot; и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru