Автор Тема: Ошибка в процедуре.  (Прочитано 1658 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн kota192

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Ошибка в процедуре.
« : 24 Февраля 2013, 12:14:20 »
Добрый день. Вылетает программа при обращении к процедуре vkluch.
При тесте на данных: размер набора 3, X1=1, Y1=1, R1=4; X2=1, Y2=2, R3=5; X3=0, Y3=0, R3=40; Должна выводиться длинна границы 3 круга.

#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);
}

//сдвиг круга по осям
cir sdvig(cir cirX, int x, int y)
{
    cirX.x+=x;
    cirX.y+=y;
    return(cirX);
}

//мастабирование круга
cir name (cir cirM, int i)
{
    cirM.rad+=i;
    return(cirM);
}

//серединный круг
int sredkrug (cir cir1, cir cir2)
{
double xa, ya, xb, yb, L, t, xc, yc, vt;
L = pow((cir1.x-cir2.x),2)+pow((cir1.y-cir2.y),2);
vt = pow((cir1.rad+cir2.rad),2);
if (L<=vt)
    {
    xc = 1 / (2*L);
    t = (1 - pow((cir2.rad),2)+pow((cir1.rad),2)) * xc;
    L = sqrt((vt-L)*(L-pow((cir1.rad-cir2.rad),2))) * xc;
    xc = (cir2.x-cir1.x) * t + cir1.x;
    yc = (cir2.y-cir1.y) * t + cir1.y;
    t = (cir2.y-cir1.y)* L;
    xa = xc + t;
    xb = xc - t;
    t = (cir1.x-cir2.x) * L;
    ya = yc + t;
    yb = yc - t;
    cir1.x=xb-xa;
    cir1.y=yb-ya;
    cir1.rad=sqrt(cir1.x*cir1.x+cir1.y*cir1.y)/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 kasanie(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 (rast+cir2.rad=cir1.rad)
            {
            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=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,mass[j])))     //если индексы неравны и второй индекс больше и есть пересечение
               {
               sred[k]=obl(mass,mass[j]);                        //получаем круговою оболочку для двух кругов
               k++;
               }
            }
        }
    printf("%i", k);
    min=mass[0].rad;                                                //минимальный круг из набора включений круговых оболочек
    for (i=0; i<size; i++)
        {
        for (j=0; j<k; j++)
            {
            if (vkluch(mass,sred[j])==1)                         //проверка на включение в круги из набора
                {
                if (mass.rad<min)
                    {
                    min=mass.rad;
                    }
                }
            }
        }
    printf("Dlinna okruznosti - %lf",dlinna(min));
    delete []mass;
    system("PAUSE");
    return 0;
}
 

 

Задание по Delphi (при введении данных возникает ошибка)

Автор PandaPivovar

Ответов: 9
Просмотров: 2183
Последний ответ 29 Ноября 2009, 15:55:57
от PandaPivovar
Метод простой итерации в MS Excel: ошибка в формуле

Автор lonesome_pirate

Ответов: 3
Просмотров: 2829
Последний ответ 06 Марта 2014, 19:41:34
от mad_math
Посмотрите где ошибка? должно быть h=0.010

Автор mike37

Ответов: 0
Просмотров: 939
Последний ответ 01 Ноября 2011, 16:12:14
от mike37
Почему возникает ошибка?

Автор Prutvel

Ответов: 25
Просмотров: 2905
Последний ответ 13 Марта 2010, 21:24:01
от Prutvel
Ошибка в коде

Автор privatnebank

Ответов: 4
Просмотров: 1238
Последний ответ 05 Февраля 2010, 20:15:36
от privatnebank