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, */Aihe on jo aika vanha, joten et voi enää vastata siihen.