Показаны сообщения с ярлыком Си. Показать все сообщения
Показаны сообщения с ярлыком Си. Показать все сообщения

четверг, 17 мая 2012 г.

Решение задачки на Си


Решил задачку для студента Пермского политеха, вот ниже решение без матчасти и в упрощенной постановке (чтоб не показывать как нашел точку пересечения эллипса с окружностью, в этом соль решения). Определяем принадлежность точки областям А или B.

#include <stdlib.h>
#include <stdio.h>    // чтоб обеспечить ввод/вывод
#include <math.h>     // чтоб использовать стандартные математические функции
#include <windows.h> // Чтоб русифицировать вывод в консоль, в окне консоли шрифт поменять

int blnCircle(double x,double  y,double R,double xo,double yo );
int blnEllips(double x,double  y,double a,double b,double xe,double ye);

int main()
{
    //Чтоб русифицировать вывод в консоль, в окне Свойства консоли шрифт поменять на TT
    // в аргументах кодировка файла для UTF-8 ~ 65001, а для cp1251 ~ 1251
    SetConsoleCP(65001);
    SetConsoleOutputCP(65001);

    double R,x,y,a,b,xo,yo,xe,ye;
    double t1,t2,c;     // Промежут. данные для расчета центра эллипса

    do
    {
        printf("Введите радиус окружности (R>=15):\n");
        scanf("%lf",&R);
    }
    while(R<15);

    do
    {
        printf("Введите значения полуосей эллипса a и b (b>a, 2b>=40 ):\n");
        scanf("%lf%lf",&a ,&b) ;
    }
    while(b<=a || 2.0*b<40);

    printf("Введите координаты точки для проверки, принадлежности её областям A или B\n");
    scanf("%lf%lf",&x ,&y) ;

    /// Определим центр окружности
    xo=(38-sqrtf(-900+60*R));
    yo=(R-30);

    /// Определим центр эллипса
    c=sqrt(pow(b,2)-pow(a,2));
    t1=pow(40.0-b+c,2);
    t2=pow(c-40+b,2);
    xe=9.0 - sqrt((4.0*t1*t2-pow(t1+t2-4*b*b,2))/(-16.0*pow(b,2)));
    ye=40.0-b;




    if( blnEllips(x,y,a,b,xe,ye) && x<=0 && y>=9 && !blnCircle(x,y,R,xo,yo))
        printf ("Точка принадлежит области A\n");
    else if(!blnEllips(x,y,a,b,xe,ye) && blnCircle(x,y,R,xo,yo) && y>=0 && x>=0 && y<=9)
        printf("Точка принадлежит области B\n");
    else
        printf("Точка не принадлежит областям A и B\n");

    system("pause"); // Останов программы под Windows, чтоб успеть результат посмотреть
    return 0;
}


/// Проверка принадлежности точки области ограниченой окружностью и получения её цнтра
int blnCircle(double x,double  y,double R,double xo,double yo)
{
    return (pow((x-xo),2)+pow(y-yo,2)<=pow(R,2));
}

/// Проверка принадлежности точки области внутри эллипса и его центр
int blnEllips(double x,double y,double a,double b,double xe,double ye)
{
    return ( pow(x-xe,2)/pow(a,2)+pow(y-ye,2)/pow(b,2)<=1 );
}


суббота, 23 апреля 2011 г.

Компиляция для Windows из под FreeBSD

Ставил mingw32 из портов, результат не очень.
Но вот набрел на страницу http://mingw-cross-env.nongnu.org
Сделал:
В FreeBSD должно быть установлено: automake111 autoconf268 bash bison cmake flex gmake gsed intltool libtool openssl patch perl p5-XML-Parser pkg-config scons unzip wget yasm
И ещё wine для проверки работоспособности кода.

0. cd ~/mingw32
1. wget https://bitbucket.org/vog/mingw-cross-env/downloads/mingw-cross-env-2.20.tar.gz
2. tar -xzvf mingw-cross-env-2.20.tar.gz
3. cd mingw-cross-env-2.20
4. gmake download-gcc
Возможны проблемы с загрузкой этой командой, но можно и скачать обычным способом. То, что не сможет через скрипт скачать, можно подсмотреть в папке pkg, потестив архивы, можно ещё подсмотреть откуда качает в директории src , найдя соответствующий .mk файл
5. gmake gcc
можно приписать и другие порты после gcc, например, gmake gcc gdb и т.д.
6. редактирую ~/.cshrc , добавляю строку :
setenv PATH ~/mingw/mingw-cross-env-2.20/bin:$PATH
так как использую SHELL=csh,
для SHELL=bash в файле ~/.profile можно прописать:
export PATH = ~/mingw/mingw-cross-env-2.20/bin:$PATH
7. Компилить прогу написанную на Си можно так
i686-pc-mingw32-gcc -o main.exe main.c
8. А, запускать так
wine main.exe