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

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

Войти
Регистрация
Восстановить пароль
 
Kota1921
0 / 0 / 0
Регистрация: 05.02.2013
Сообщений: 5
#1

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

24.02.2013, 02:10. Просмотров 314. Ответов 6
Метки нет (Все метки)

Добрый день, вечер, ночь. При проверке включения одного круга в другой программа вылетает, можете посмотреть код?

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;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2013, 02:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка в процедуре (C++):

ошибка в процедуре вставки в упор. массив - C++
void insert (int a,int &amp;n,int x) { int i=n; int j=n+1; while (a&gt;x) a=a; a=x; if (j!=0) while (j&gt;=0) a=a; ...

Процедура в процедуре. Как сделать. - C++
Вопрос в том, можно ли вызвать в процедуру процедуру. Если да, то какой синтаксис будет в этом случае правильным.

Ошибки в процедуре для сравнений - C++
Привет всем.! Дорогие друзья,помогите разобраться пытаюсь скомпилить свой код, выдает ошибку в строке Cross = s1*s2&lt;=0; не могу понять...

Вывод в файл в цикле в процедуре - C++
Всем привет) В процедуру передается указатель на строку и в зависимости от условий, она либо пишется в файл, либо нет. процедура...

Как изменить значение глобальной переменной в процедуре? - C++
Как изменить значение глобальной переменной в процедуре? #include &lt;iostream&gt; using std:: cin; using std:: cout; using std::...

В процедуре поменять местами столбцы вещественной матрицы - C++
описать процедуру SwapCol (A,M,N,K1,K2), осуществляющую перемену местами столбцов вещественной матрицы А размера M на N с номерами К1 и К2....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Черный ворон
130 / 124 / 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;
}
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 круга.
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.02.2013, 03:29 #4
У меня такой код не компилируется. Размер sred должен быть константой.
Нет функции pow() с первым параметром int. Нужно приведение к float или double.
0
valeriikozlov
Эксперт C++
4670 / 2496 / 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));
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.02.2013, 03:41 #6
Удалил.
0
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 минут
Все понял, какой же я нехороший.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2013, 13:04
Привет! Вот еще темы с ответами:

OpenGL. Передать в процедуру рисования Draw коэффициенты прямой, вычисляемые в другой процедуре - C++
Пишу программу, используя OPENGL.Проблема следующая, как мне передать в процедуру рисования Draw коэффициенты прямой,вычисляемые в другой...

Написать программу которая выводит сумму чисел от a до b. Сложение чисел выполнять в процедуре - C++
Где ошибка? #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;cmath&gt; using namespace std; int Sum (int x, int y) { int S; ...

Ошибка в процедуре - Delphi
Создал простенькую процедуру. procedure spravka; var f: TextFile; line: string; begin assignfile(f,'s\s1.txt'); reset(f); ...

Ошибка в процедуре - Delphi
procedure TForm1.btn3Click(Sender: TObject); var q, i,g:Integer; begin matr.Create(StrToInt(Edit1.Text),StrToInt(Edit2.Text)); for...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.02.2013, 13:04
Ответ Создать тему
Опции темы

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