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.