Форум программистов, компьютерный форум CyberForum.ru

Ошибка в процедуре - C++

Восстановить пароль Регистрация
 
Kota1921
0 / 0 / 0
Регистрация: 05.02.2013
Сообщений: 5
24.02.2013, 02:10     Ошибка в процедуре #1
Добрый день, вечер, ночь. При проверке включения одного круга в другой программа вылетает, можете посмотреть код?

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
88
89
90
91
92
93
94
95
struct cir
{
    int x,y;
    float rad;
};
 
//длинна окружности
double dlinna(double length)              //вычесление длинны окружности
{
    length=2*M_PI*length;
    return length;
 
int peresech(cir cir1, cir cir2)
    {
    if ((pow((cir1.x-cir2.x),2)+pow((cir1.y-cir2.y),2))<=(pow((cir1.rad+cir2.rad),2)))
        {
        return(1);
        }
    else
        {
        return(0);
        }
    }
 
//включение одного круга в другой
int vkluch(cir cir1, cir cir2)
    {
    float rast;
    if (cir1.rad>cir2.rad)
       {
       rast=sqrt(pow((cir2.x-cir1.x),2)+pow((cir2.y-cir1.y),2));
       if (cir1.rad>rast)
          {
          return(1);
          }
       else
          {
          return(0);
          }
       }
    else
       {
       return(0);
       }
    }
 
int main()
{
    int size,                           //размер набора
        i,j,k,n;                        //счетчики
    double min;                          //наименьший круг из набора
 
    printf("Vvedite razmer nabora ");
    scanf("%i",&size);                   //количество кругов в наборе
 
    cir mass[size];                      //массив набора кругов
 
    for (i=0; i<size; i++)
        {
        mass[i]=vvod();                  //ввод данных о круге
        }
    system("CLS");
 
    cir sred[(size-1*size-2)%2];         //массив сдерних кругов
    k=0;                                 //обнуление k-счетчика
    for (i=0; i<size; i++)
        {
        for (j=0; j<size; j++)
            {
            if ((i!=j) && (i<j) && (peresech(mass[i],mass[j])))     //если индексы неравны и второй индех больше и есть пересечение
               {
               sred[k]=obl(mass[i],mass[j]);                        //получаем круговою оболочку для двух кругов
               k++;
               }
            }
        }
 
    min=mass[0].rad;                                                //минимальный круг из набора включений круговых оболочек
    for (i=0; i<size; i++)
        {
        for (j=0; j<k; j++)
            {
            if (vkluch(mass[i],sred[j])==1)                         //проверка на включение в круги из набора
                {
                if (mass[i].rad<min)
                    {
                    min=mass[i].rad;
                    }
                }
            }
        }
    printf("Dlinna okruznosti - %d",dlinna(min));
    system("PAUSE");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2013, 02:10     Ошибка в процедуре
Посмотрите здесь:

Процедура в процедуре. Как сделать. C++
C++ ошибка в процедуре вставки в упор. массив
Ошибки в процедуре для сравнений C++
C++ OpenGL. Передать в процедуру рисования Draw коэффициенты прямой, вычисляемые в другой процедуре
C++ В процедуре поменять местами столбцы вещественной матрицы
C++ Написать программу которая выводит сумму чисел от a до b. Сложение чисел выполнять в процедуре
C++ Как изменить значение глобальной переменной в процедуре?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Черный ворон
129 / 123 / 6
Регистрация: 31.01.2012
Сообщений: 435
24.02.2013, 02:40     Ошибка в процедуре #2
здесь не хватает двух функций. vvod() и obl(mass[i],mass[j]);
ввод на скорую руку дописал. поправил динамические массивы. было
C++
1
cir mass[size];
надо
C++
1
2
cir *mass;                      
    mass = new cir[size];
и в конце программы
C++
1
delete []mass;
итого в нижеприведенном компилятор выдает ошибку только в одной строке с отсутствующей функцией obl. (какой там должен быть алгоритм не понимаю и не представляю из исходных данных)
Кликните здесь для просмотра всего текста
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <math.h>
#include <iostream.h>
#include <stdlib.h>
struct cir
{
    int x,y;
    float rad;
};
 
 
double dlinna(double length)             
{
    length=2*M_PI*length;
    return length;}
 
int peresech(cir cir1, cir cir2)
    {
    if ((pow((cir1.x-cir2.x),2)+pow((cir1.y-cir2.y),2))<=(pow((cir1.rad+cir2.rad),2)))
        {
        return(1);
        }
    else
        {
        return(0);
        }
    }
 
cir vvod(){
cir temp;
cout<<"input x,y, rad"<<endl;
cin>>temp.x>>temp.y>>temp.rad;
return temp;
}
 
 
int vkluch(cir cir1, cir cir2)
    {
    float rast;
    if (cir1.rad>cir2.rad)
       {
       rast=sqrt(pow((cir2.x-cir1.x),2)+pow((cir2.y-cir1.y),2));
       if (cir1.rad>rast)
          {
          return(1);
          }
       else
          {
          return(0);
          }
       }
    else
       {
       return(0);
       }
    }
 
int main()
{
    int size,                          
        i,j,k,n;                        
    double min;                     
 
    printf("Vvedite razmer nabora ");
    scanf("%i",&size);                
 
    cir *mass;                     
    mass = new cir[size];
    for (i=0; i<size; i++)
        {
        mass[i]=vvod();               
        }
    system("CLS");
 
    cir *sred;
    sred = new cir[(size-1*size-2)%2];     
    k=0;                             
    for (i=0; i<size; i++)
        {
        for (j=0; j<size; j++)
            {
            if ((i!=j) && (i<j) && (peresech(mass[i],mass[j])))    
               {
               sred[k]=obl(mass[i],mass[j]);                        
               k++;
               }
            }
        }
 
    min=mass[0].rad;                                                
    for (i=0; i<size; i++)
        {
        for (j=0; j<k; j++)
            {
            if (vkluch(mass[i],sred[j])==1)                       
                {
                if (mass[i].rad<min)
                    {
                    min=mass[i].rad;
                    }
                }
            }
        }
    printf("Dlinna okruznosti - %d",dlinna(min));
    system("PAUSE");
    delete []mass;
    delete []sred;
    return 0;
}
Kota1921
0 / 0 / 0
Регистрация: 05.02.2013
Сообщений: 5
24.02.2013, 02:52  [ТС]     Ошибка в процедуре #3
Извиняюсь упустил сейчас поправлю, просто забыл их скопировать из исходного кода.

Добавлено через 7 минут
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include <iostream>
#include <math.h>
#include <locale.h>
using namespace std;
 
struct cir
{
    int x,y;
    float rad;
};
 
 
//получение координат центра и радиуса
cir vvod()
{
    cir cir1;
    printf("Vvedite koordinatu X ");
    scanf("%i",&cir1.x);
    printf("Vvedite koordinatu Y ");
    scanf("%i",&cir1.y);
    printf("Vvedite radius ");
    scanf("%f",&cir1.rad);
    return(cir1);
 
}
 
 
//длинна окружности
double dlinna(double length)              //вычесление длинны окружности
{
    length=2*M_PI*length;
    return length;
}
 
//внешняя круговая оболочка
cir obl(cir cir1, cir cir2)
{
    cir cirresult;         //средний круг
 
    cirresult.x=(cir2.x-cir1.x)/2;         //середина отрезка по Х
    cirresult.y=(cir2.y-cir1.y)/2;         //середина отрезка по Y
    cirresult.rad=(cir1.rad+cir2.rad)/2;   //средний радиус
    return(cirresult);
}
 
//включение одного круга в другой
int vkluch(cir cir1, cir cir2)
    {
    float rast;
    if (cir1.rad>cir2.rad)
       {
       rast=sqrt(pow((cir2.x-cir1.x),2)+pow((cir2.y-cir1.y),2));
       if (cir1.rad>rast)
          {
          return(1);
          }
       else
          {
          return(0);
          }
       }
    else
       {
       return(0);
       }
    }
 
int peresech(cir cir1, cir cir2)
    {
    if ((pow((cir1.x-cir2.x),2)+pow((cir1.y-cir2.y),2))<=(pow((cir1.rad+cir2.rad),2)))
        {
        return(1);
        }
    else
        {
        return(0);
        }
    }
 
int main()
{
    int size,                           //размер набора
        i,j,k,n;                        //счетчики
    double min;                          //наименьший круг из набора
 
    setlocale(LC_CTYPE,"Russian");      //подключение кирилицы
 
    printf("Vvedite razmer nabora ");
    scanf("%i",&size);                   //количество кругов в наборе
 
    cir *mass;                      //массив набора кругов
        mass = new cir[size];
    for (i=0; i<size; i++)
        {
        mass[i]=vvod();                  //ввод данных о круге
        }
    system("CLS");
 
    cir sred[(size-1*size-2)%2];         //массив сдерних кругов
    k=0;                                 //обнуление k-счетчика
    for (i=0; i<size; i++)
        {
        for (j=0; j<size; j++)
            {
            if ((i!=j) && (i<j) && (peresech(mass[i],mass[j])))     //если индексы неравны и второй индех больше и есть пересечение
               {
               sred[k]=obl(mass[i],mass[j]);                        //получаем круговою оболочку для двух кругов
               k++;
               }
            }
        }
 
    min=mass[0].rad;                                                //минимальный круг из набора включений круговых оболочек
    for (i=0; i<size; i++)
        {
        for (j=0; j<k; j++)
            {
            if (vkluch(mass[i],sred[j])==1)                         //проверка на включение в круги из набора
                {
                if (mass[i].rad<min)
                    {
                    min=mass[i].rad;
                    }
                }
            }
        }
    printf("Dlinna okruznosti - %d",dlinna(min));
    delete []mass;
    system("PAUSE");
    return 0;
}

Компилятор не ругается, но когда доходит до вызова vkluch, то происходит вылет.
Программа должна находить длину границы наименьшего из кругов, содержащего в себе хотя
бы одну внешнюю круговую оболочку пересечения двух других кругов из заданного набора;

При тесте на данных: размер набора 3, X1=1, Y1=1, R1=4; X2=1, Y2=2, R3=5; X3=0, Y3=0, R3=40; Должна выводиться длинна границы 3 круга.
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.02.2013, 03:29     Ошибка в процедуре #4
У меня такой код не компилируется. Размер sred должен быть константой.
Нет функции pow() с первым параметром int. Нужно приведение к float или double.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
24.02.2013, 03:34     Ошибка в процедуре #5
Цитата Сообщение от Kota1921 Посмотреть сообщение
C++
1
cir sred[(size-1*size-2)%2]; //массив сдерних кругов
слишком маленький размер массива.


Цитата Сообщение от Kota1921 Посмотреть сообщение
C
1
printf("Dlinna okruznosti - %d",dlinna(min));
замените на:
C
1
   printf("Dlinna okruznosti - %lf",dlinna(min));
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.02.2013, 03:41     Ошибка в процедуре #6
Удалил.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2013, 13:04     Ошибка в процедуре
Еще ссылки по теме:

Вывод в файл в цикле в процедуре C++

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

Или воспользуйтесь поиском по форуму:
Kota1921
0 / 0 / 0
Регистрация: 05.02.2013
Сообщений: 5
24.02.2013, 13:04  [ТС]     Ошибка в процедуре #7
У меня появился еще один вопрос. Почему при увеличении к в первом цикле, переменная принимает значения 0 1 2 и 1077936129 вместо 3

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
int main()
{
    int size,                           //размер набора
        i,j,k,n;                        //счетчики
    double min;                          //наименьший круг из набора
 
    setlocale(LC_CTYPE,"Russian");      //подключение кирилицы
 
    printf("Vvedite razmer nabora ");
    scanf("%i",&size);                   //количество кругов в наборе
 
    cir mass[size];                      //массив набора кругов
 
    for (i=0; i<size; i++)
        {
        mass[i]=vvod();                  //ввод данных о круге
        }
    system("CLS");
 
    cir sred[(size-1*size)%2];            //массив сдерних кругов
 
    k=0;                                 //обнуление k-счетчика
    for (i=0; i<size; i++)
        {
        for (j=0; j<size; j++)
            
            if ((i!=j) && (i<j) && (peresech(mass[i],mass[j])))     //если индексы неравны и второй индекс больше и есть пересечение
               {
               sred[k]=obl(mass[i],mass[j]);                        //получаем круговою оболочку для двух кругов
               k++;
               printf("%i\n",k);
               }
            }
        }
    system("PAUSE");
    min = mass[0].rad;                                                //минимальный круг из набора включений круговых оболочек
    for (i=0; i<size; i++)
        {
        for (j=0; j<k; j++)
            {
            if (vkluch(mass[i],sred[j])==1)                         //проверка на включение в круги из набора
                {
                printf("Прошло %i %i\n",i,j);
                }
            }
        }
    printf("Dlinna okruznosti - %lf",dlinna(min));
    system("PAUSE");
    return 0;
}
Добавлено через 6 минут
Все понял, какой же я нехороший.
Yandex
Объявления
24.02.2013, 13:04     Ошибка в процедуре
Ответ Создать тему
Опции темы

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