Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C: Pallokolmion käsittely

jormi [16.04.2008 09:09:35]

#

Esimerkki pallokolmion ratkaisemisesta. Tehty vanhanaikaisella lcc-win32 kääntäjällä. Haluaisin vinkin ainakin getch() funktion korvaamiseksi uudemmalla JVM

/*--- Lasketaan pallokolmion kulmat, kun sivut tunnetan.---*/
/*--- Testiin 15.04. 2008 ---*/
/*--- Tehty vanhalla kääntäjällä. ainakin
 conio.h ja getch() täytyy vaihtaa uudemmissa. ---*/
#include <stdio.h>
#include <conio.h>
#include <math.h>

struct OSA
{
    double rad;
    double aste;
    double min;
    double sek;
};

struct KOL
{
    struct OSA sivu[3];
    struct OSA kulma[3];
    double ala;
}kol1;

void Radtodeg( struct OSA *osa );
void Degtorad( struct OSA *osa );
struct OSA Haeosa( void );
void TuoOsa( struct OSA osa );
void Haetunnetut( void );
void Tuolasketut( void );
int Tarkistasivut( void );
int Laske_ABC( void );
int Laske_ABC2( void );
int Laske_ABC3( void );

/*--- Pääfunktio, muiden funktioiden ohjaus ---*/
int main(void)
{
    int virheno1, virheno2, virheno3;

    Haetunnetut();
    virheno1 = Tarkistasivut();
    printf( "\n Virheno1 on %d \n", virheno1 );
    if( virheno1 == 0 )
    {
        printf( "\n Kaava1.\n" );
        Laske_ABC();
        Tuolasketut();
        printf( "\n Kaava 2. \n" );
        Laske_ABC2();
        Tuolasketut();
        printf( "\n Kaava 3. \n" );
         Laske_ABC3();
         Tuolasketut();
    }
    printf( "\n Paina Enter" );
    getch();
    return 0;
}

/*-- Muuttaa radiaanit asteiksi, minuuteiksi ja sekunneiksi --*/
void Radtodeg( struct OSA *osa )
{
    double aste, min, sek, kokaste, kokmin;
    aste = osa->rad * 180.0/M_PI;
    min = modf( aste, &kokaste );
    osa->aste = kokaste;
    min = min * 60.0;
    sek = modf( min, &kokmin );
    osa->min = kokmin;
    osa->sek = sek * 60.0;
}

/*-- Muuttaa asteet, minuutit ja sekunnit radiaaneiksi. --*/
void Degtorad( struct OSA *osa )
{
   osa->rad = ( osa->aste + osa->min/60.0 + osa->sek/3600.0 ) * M_PI/180.0;
}

/*-- Osan tietojen kysely. --*/
struct OSA Haeosa( void )
{
    struct OSA temp;
    printf( " Anna aste min sek (max 180 aste): ");
   scanf( "%lf %lf %lf", &temp.aste, &temp.min, &temp.sek );
   Degtorad( &temp );
   return temp;
}

/*-- Osan tietojen esitys.--*/
void TuoOsa( struct OSA osa )
{
    printf( " %6.5f  %3.1f  %3.1f  %3.1f \n", osa.rad, osa.aste, osa.min, osa.sek );
}

/*-- Lähtötietojen kysely --*/
void Haetunnetut( void )
{
    printf( "Anna sivu a:\n" );
    kol1.sivu[0] = Haeosa();
    printf( "Anna sivu b:\n" );
    kol1.sivu[1] = Haeosa();
    printf( "Anna sivu c:\n" );
    kol1.sivu[2] = Haeosa();
}

/*-- Esittää lasketut osat --*/
void Tuolasketut( void )
{
    printf( " Lasketut osat rad  aste  min  sek \n" );
    printf( " Kulma A " );
    TuoOsa( kol1.kulma[0] );
    printf( " Kulma B " );
    TuoOsa( kol1.kulma[1] );
    printf( " Kulma C " );
    TuoOsa( kol1.kulma[2] );
}

/*--  Tarkista, että sivuista syntyy kolmio --*/
int Tarkistasivut( void )
{
    double da, db, dc, summa;

    da = kol1.sivu[0].rad;
    db = kol1.sivu[1].rad;
    dc = kol1.sivu[2].rad;
    summa = da+db+dc;
    if( summa > 2*M_PI )
        return 1;
    if(( da >= db+dc )||
       ( db >= da+dc )||
        ( dc >= da+db ))
        return 2;
    if(( da <= fabs(db-dc ))||
          ( db <= fabs(da-dc ))||
          ( dc <= fabs(da-db )))
          return 3;
   return 0;
}


/*-- Tunnetaan sivut, lasketaan kulmat. --*/
int Laske_ABC( void )
{
    double da, db, dc;
    double cosA, cosB, cosC;

    da = kol1.sivu[0].rad;
    db = kol1.sivu[1].rad;
    dc = kol1.sivu[2].rad;

    cosA = (cos(da)-cos(db)*cos(dc))/(sin(db)*sin(dc));
    cosB = (cos(db)-cos(da)*cos(dc))/(sin(da)*sin(dc));
    cosC = (cos(dc)-cos(da)*cos(db))/(sin(da)*sin(db));

    kol1.kulma[0].rad = acos(cosA);
    kol1.kulma[1].rad = acos(cosB);
    kol1.kulma[2].rad = acos(cosC);

    Radtodeg( &kol1.kulma[0] );
    Radtodeg( &kol1.kulma[1] );
    Radtodeg( &kol1.kulma[2] );

    kol1.ala = kol1.kulma[0].rad + kol1.kulma[1].rad + kol1.kulma[2].rad - M_PI;
    printf( " \n Kolmion ala = %f \n", kol1.ala );

    return 0;
}

/*-- Tunnetaan sivut, lasketaan kulmat. Menetelmä 2.--*/
int Laske_ABC2( void )
{
    double da, db, dc, summa, piiri;
    double cosA2, cosB2, cosC2;

    da = kol1.sivu[0].rad;
    db = kol1.sivu[1].rad;
    dc = kol1.sivu[2].rad;
    summa = da+db+dc;
    piiri = summa/2.0;

    cosA2 = sqrt(sin(piiri)*sin(piiri-da)/(sin(db)*sin(dc)));
    cosB2 = sqrt(sin(piiri)*sin(piiri-db)/(sin(da)*sin(dc)));
    cosC2 = sqrt(sin(piiri)*sin(piiri-dc)/(sin(da)*sin(db)));

    kol1.kulma[0].rad = 2*acos(cosA2);
    kol1.kulma[1].rad = 2*acos(cosB2);
    kol1.kulma[2].rad = 2*acos(cosC2);

    Radtodeg( &kol1.kulma[0] );
    Radtodeg( &kol1.kulma[1] );
    Radtodeg( &kol1.kulma[2] );

    return 0;
}

/*-- Tunnetaan sivut, lasketaan kulmat. Menetelmä 3.--*/
int Laske_ABC3( void )
{
    double da, db, dc, summa, piiri;
    double tanA2, tanB2, tanC2;

    da = kol1.sivu[0].rad;
    db = kol1.sivu[1].rad;
    dc = kol1.sivu[2].rad;
    summa = da+db+dc;
    piiri = summa/2.0;

    tanA2 = sqrt(sin(piiri-db)*sin(piiri-dc)/(sin(piiri)*sin(piiri-da)));
    tanB2 = sqrt(sin(piiri-da)*sin(piiri-dc)/(sin(piiri)*sin(piiri-db)));
    tanC2 = sqrt(sin(piiri-da)*sin(piiri-db)/(sin(piiri)*sin(piiri-dc)));

    kol1.kulma[0].rad = 2*atan(tanA2);
    kol1.kulma[1].rad = 2*atan(tanB2);
    kol1.kulma[2].rad = 2*atan(tanC2);

    Radtodeg( &kol1.kulma[0] );
    Radtodeg( &kol1.kulma[1] );
    Radtodeg( &kol1.kulma[2] );

    return 0;
}

/* End of File, */

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta