Eli, ohjelma muuntaa ydinkärjen räjähdysvoiman kilo- ,tai megatonneista
muutamaan joulen kerrannaiseen.
Tavoitteena oli harjoitella isojen lukujen käyttöä.
Ongelma:
Ohjelma antaa totuudenmukaisia lukemia, kunnes syötetty luku on tarpeeksi suuri, tälloin luku joko heittää hiukan, tai menee täysin metsään.
Laskutoimitus, jota ohjelma käyttää toimii näin:
Megatonni vastaa miljoonaa tonnia trinitrotolueenia.
Ohjelmalle syötetty luku muutetaan muutetaan kilogrammoiksi.
1 megatonni vastaa näin ollen 1000 000 000 kg trinitrotolueenia.
Trinitrotolueenin räjähdysvoima on 4,184 MJ/kg, jolloin
kerrotaan trinitrotolueenin määrä 4,184 MJ:lla (1000 000 000 * 4184000)
Vastaus olisi 4,1 petajoulea, mutta koska ohjelma ei ymmärrä desimaalien päälle,
vastaukseksi tulee 4, riittävän oikein tässä tilanteessa.
#include <iostream> using namespace std; long long int miljoona = 1000000; char kysymys; int main() { while (miljoona = 1000000) { cout << "Ydinaseen rajahdysvoimaa kuvaava laskuri"<<endl; cout<< "Muuttaa tonnit jouleiksi"<<endl; cout << "k, kilotonni"<<endl; cout << "m, megatonni"<<endl; cout << "Esim. 100m, 100 megatonnia"<<endl; cout <<"_______________________________" <<endl; cout << "Ydinkarjen rajahdysvoima: "; unsigned long long int rajahdysvoima;{ cin >> rajahdysvoima; // Luetaan räjähdysvoima } cin >> kysymys; if (kysymys == 'k') // Muutetaan kilotonneista { unsigned long long int maara_tnt (rajahdysvoima * miljoona); // Räjähdysvoima kerrotaan miljoonalla, näin saadaan trinitrotolueenin vastaava määrä (kg) unsigned long long int rajahdysvoima_tnt (4184000 * maara_tnt); // Kerrotaan trintrotolueenin vastaava määrä sen räjähdysvoimalla (4,184 MJ), muunnetaan se jouleiksi (418400) cout <<"_______________________________" <<endl; cout << rajahdysvoima_tnt << " Joulea"<<endl; // Räjähdysvoima jouleina, käytetään suoraan yllä laskettua lukua cout <<"_______________________________" <<endl; unsigned long long int kilojoule (rajahdysvoima_tnt / 1000);{ // Muunnetaan joulet kilojouleiksi, kilojoule on tuhat joulea cout << kilojoule << " Kilojoulea" <<endl;} cout <<"_______________________________" <<endl; unsigned long long int megajoule (rajahdysvoima_tnt /miljoona);{ // Muunnetaan megajouleiksi, megajoule on miljoona joulea. Käytän jo aiemmin määriteltyä arvoa cout << megajoule <<" Megajoulea" <<endl;} cout <<"_______________________________" <<endl; unsigned long long int gigajoule (rajahdysvoima_tnt / 1000000000);{ // Muunnetaan gigajouleiksi, gigajoule on miljardi joulea cout << gigajoule << " Gigajoulea"<<endl;} cout <<"_______________________________" <<endl; unsigned long long int terajoule1 (rajahdysvoima_tnt / 1000000000); // Muunnetaan terajouleiksi, terajoule on biljoona joulea unsigned long long int terajoule2 (terajoule1 / 1000);{ // Jaetaan kahteen kertaan, kääntäjä ei hyväksy noin suurta lukua kerralla cout << terajoule2<< " Terajoulea"<<endl;} unsigned long long int petajoule1 (rajahdysvoima_tnt / 1000000000); // Muunnetaan petajouleiksi, petajoule on tuhat biljoonaa joulea unsigned long long int petajoule2 (petajoule1 / miljoona); // Toimitaan samoin kun äsken, samasta syystä cout << "_______________________________" <<endl; if (petajoule2 > 0) // Jos petajoule on yli 0, se tulostetaan { cout << petajoule2 << " Petajoulea" <<endl; cout<< "_______________________________" <<endl; } } if (kysymys == 'm') // Muutetaan megatonneista { unsigned long long int maara_tnt (rajahdysvoima * 1000000000); // Räjähdysvoima kerrotaan miljardilla, näin saadaan trinitrotolueenin vastaava määrä (kg) unsigned long long int rajahdysvoima_tnt (maara_tnt * 4184000); // Kerrotaan trintrotolueenin vastaava määrä sen räjähdysvoimalla (4,184 MJ), muunnetaan se jouleiksi (418400) cout <<"_______________________________" <<endl; cout << rajahdysvoima_tnt << " Joulea" <<endl; // Räjähdysvoima jouleina, käytetään suoraan yllä laskettua lukua cout <<"_______________________________" <<endl; unsigned long long int kilojoule (rajahdysvoima_tnt / 1000);{ // Muunnetaan joulet kilojouleiksi, kilojoule on tuhat joulea cout << kilojoule << " Kilojoulea" <<endl;} cout <<"_______________________________" <<endl; unsigned long long int megajoule (rajahdysvoima_tnt / miljoona);{ // Muunnetaan joulet megajouleiksi, megajoule on miljoona joulea cout << megajoule << " Megajoulea" <<endl;} cout << "_______________________________" <<endl; unsigned long long int gigajoule (rajahdysvoima_tnt / 1000000000);{ // Muunnetaan joulet gigajouleiksi, gigajoule on miljardi joulea cout << gigajoule << " Gigajoulea" <<endl;} cout << "_______________________________" <<endl; unsigned long long int terajoule (rajahdysvoima_tnt / 1000000000); // Muunnetaan joulet terajouleiksi, terajoule on biljoona joulea unsigned long long int terajoule2 (terajoule / 1000);{ // Jaetaan kahteen kertaan, kääntäjä ei hyväksy noin suurta lukua kerralla cout<<terajoule2<<" Terajoulea"<<endl;} cout<<"_______________________________"<<endl; unsigned long long int petajoule (rajahdysvoima_tnt / 1000000000); //Muunnetaan petajouleiksi, petajoule on tuhat biljoonaa joulea unsigned long long int petajoule2 (petajoule / miljoona); // Toimitaan samoin kuin äsken, samasta syystä if (petajoule2 > 0) // Jos petajoule on yli 0, se tulostetaan { cout << petajoule2 << " Petajoulea" <<endl;} cout <<"_______________________________" <<endl; } } system("pause"); }
Toivottavasti ei tullut virheitä, vähän väsyttää...
Koodi on todella rumaa, kannattaa opetella koodaamaan siistimmin. Käytät esimerkiksi aaltosulkuja hyvin epäloogisesti etkä ole sisentänyt ollenkaan. Myös tulostuksen siirtäminen funktioon selventäisi huomattavasti, kun saisit muut rivit muotoon tulosta("kilojoulea", tnt / 1000);
.
Unsigned long long -tyyppisen vakion saa kirjoittamalla perään U:n ja kaksi L:ää, esimerkiksi 123ULL. Näin pääset tuosta kahden jakolaskun kikasta.
Kokonaislukujen lukualue on hyvin rajallinen (64-bittisellä unsigned long long -tyypillä noin 18 triljoonaan asti). Ohjelmasi luultavasti toimisi mukavammin vaikka double-tyypillä, jolloin lukualue on hyvin laaja mutta tarkkuus "vain" noin 15 desimaalia. Tällöin voisit kirjoittaa jakajatkin helpommin muodossa 1e3, 1e6, 1e9 jne.
Aihe on jo aika vanha, joten et voi enää vastata siihen.