Rozwiązania zadań z Programowania Obiektowego Laboratorium 3 (Skaruz) Zadanie 1. Napisz program wypisujący wszystkie liczby 4-cyfrowe o sumie cyfr 21, 5 i 13. Przede wszystkim na początku trzeba obmyślić jakiś algorytm, który to zadanie jest w stanie rozwiązać i pomyśleć, co będzie potrzebne do jego wykonania. Najważniejszą rzeczą jest świadomość tego, co program ma robić, to akurat wyróżniłem w treści niebieskim kolorem. 1. Wypisujący ok, wypisywać informacje na ekran już potrafimy, za pomocą metody System.out.println(). W nawiasach oczywiście odpowiednie wyrażenie, bądź tekst ujęty w cudzysłów. To najprostsza część zadania. 2. Wszystkie liczby czterocyfrowe tu już się samo nasuwa rozwiązanie. Jeśli mamy wykonać operacje na wielu elementach, na pewno użyjemy pętli for, ale teraz rodzi się problem, w jakim zakresie. Wystarczy tylko znaleźć najmniejszą i największą liczbę czterocyfrową. Najmniejszą będzie więc 1000, a największą 9999 i właśnie w takim przedziale będziemy wykonywać naszą pętlę. 3. O sumie cyfr 21, 5 i 13 szczerze powiedziawszy, to w treści zadania jest błąd logiczny. Jedna liczba nie może mieć trzech różnych sum cyfr, zawsze suma cyfr w liczbie 21 będzie 3, bo 2+1=3, nigdy 5, nigdy 10, nigdy 291. Prawidłowo powinno więc brzmieć o sumie cyfr 21, 5 lub 13. Pomijając tą krótką dygresję, pomyślmy co się przyda do obliczenia sumy cyfr danej liczby. Będzie to oczywiście odpowiednia funkcja (a w Javie nazywana metodą) z aż dwoma parametrami. Dlaczego? Pierwszym parametrem będzie zmienna sterująca naszą pętlą, która to odpowiada kolejnej liczbie z naszego przedziału. Drugim argumentem funkcji będzie suma cyfr, jaka nas interesuje i ona będzie stała. Łatwo więc wywnioskować, że przy takim rozwiązaniu musimy napisać jedną, kilkulinijkową funkcję i zwyczajnie wywołać ją trzy razy z różnymi parametrami, zamiast trzy razy pisać to samo, ale z innymi cyferkami. Kod programu: public class Zadanie3_1 public static void main(string[] args) Zadanie3_1 zadanie = new Zadanie3_1(); System.out.println("Liczby czterocyfrowe o sumie cyfr równej 21 to:"); for(int i=1000;i<10000;i++) zadanie.sumacyfr(i,21); System.out.println("\n\nLiczby czterocyfrowe o sumie cyfr równej 5 to:"); for(int i=1000;i<10000;i++) zadanie.sumacyfr(i,5); System.out.println("\n\nLiczby czterocyfrowe o sumie cyfr równej 13 to:"); for(int i=1000;i<10000;i++) zadanie.sumacyfr(i,13); void sumacyfr(int liczba, int sc) int x, sumacyfr=0; x = liczba; while(x!=0) sumacyfr += x%10; x /= 10; if(sumacyfr==sc) System.out.printf("%d, ",liczba);
Metoda sumacyfr(int liczba, int sc) void sumacyfr(int liczba, int sc) int x, sumacyfr=0; x = liczba; while(x!=0) sumacyfr += x%10; x /= 10; if(sumacyfr==sc) System.out.printf("%d, ",liczba); Metoda jest void, bo mimo tego, że coś liczymy, to chcemy, żeby nam wypisała od razu liczbę. Moglibyśmy zrobić to jeszcze w inny sposób, zwracając z metody intowej liczbę, a wypisując po prostu tę metodę w metodzie głównej. Metoda ma dwa parametry liczba oraz sc (skrót od sumacyfr dla odróżnienia takiej samej zmiennej która jest już użyta). Parametr liczba odpowiada oczywiście za czterocyfrową liczbę, której sumę cyfr mamy policzyć, a parametr sc jest stałą, ustawioną na sztywno sumą cyfr, w przypadku której metoda wypisze liczbę. Do tego przydadzą nam się dwie nowe zmienne x oraz sumacyfr. Po nazwie sumacyfr można się domyślić, co będzie przechowywała, natomiast x jest pomocniczą zmienną służącą do przechowania podzielonej liczby. Aby obliczyć sumę cyfr danej liczby, musimy najpierw wyłuskać z niej każdą z cyfr. Problem można rozwiązać, jak widać, za pomocą dwóch instrukcji umieszczonych w pętli while, której warunkiem jest to, że x nie może być zerem. Do x przypisujemy naszą liczbę jeszcze przed wykonaniem pętli. Od teraz operujemy na zmiennej x, a nie na liczbie, bo ta nie może nam się zmodyfikować podczas wykonywania metody. Wyłuskiwanie cyfr z liczby odbywa się w dwóch etapach: dzielimy z resztą x przez 10 (podstawa systemu dziesiętnego), a następnie za x przypisujemy x dzielony przez 10. Na schemacie wygląda to mniej więcej tak dla liczby 2478: Dzielenie całkowitoliczbowe Reszta z dzielenia sumacyfr 2478 / 10 247 / 10 24 / 10 2 / 10 0 8 7 4 2 8 = 8 8 + 7 = 15 8 + 7 + 4 = 19 8 + 7 + 4 + 2 = 21 Odczytując od tyłu reszty z dzielenia widzimy, że jest to nasza wejściowa liczba. Na szczęście nie musimy tej liczby ponownie wypisywać, tylko obliczyć sumę jej cyfr. Dlatego z każdym kolejnym krokiem do zmiennej sumacyfr dodajemy wyłuskaną cyfrę, tak jak pokazane jest to w kolumnie sumacyfr. Gdy x osiągnie wartość 0, pętla zostanie przerwana i przechodzimy do instrukcji zawartych bezpośrednio po niej, a jest to instrukcja warunkowa sprawdzająca, czy obliczona wcześniej suma cyfr (sumacyfr) jest taka, jakiej potrzebujemy (parametr sc naszej metody). W przypadku, gdy jest to prawda, system wypisze tą liczbę, w przeciwnym wypadku zupełnie nic się nie stanie. No dobra, to była nasza funkcja wypisująca liczby o sumie cyfr sc, czyli mamy zrobione 30% zadania.
Ostatnimi warunkami będzie zrobienie, by funkcja wypisywała liczby czterocyfrowe, które mają sumę cyfr równą 25, 5 lub 13. Na początku musimy utworzyć nowy obiekt, dzięki któremu możemy w ogóle możemy użyć naszej metody. Tworzymy to za pomocą Zadanie3_1 zadanie = new Zadanie3_1(); dzięki czemu wszystkich metod z klasy Zadanie3_1 będziemy mogli używać tak, jak każdej innej, podając naszą zmienną zadanie i po kropce nazwę metody. Czas na sfinalizowanie zadania. Zrobimy to za pomocą pętli for, gdzie zainicjalizujemy zmienną sterującą i z wartością 1000 (najniższa liczba czterocyfrowa), a warunkiem będzie, by i nie przekroczyło 9999 (najwyższa liczba czterocyfrowa). Konstrukcję pętli for znamy. Jako instrukcję w pętli for podajemy wywołanie metody sumacyfr(i,25). W osobnych pętlach robimy dokładnie to samo, tylko jako drugi parametr metody wstawiamy 5 oraz 13. Działanie programu:
--------------------Configuration: <Default>-------------------- Liczby czterocyfrowe o sumie cyfr równej 21 to: 1299, 1389, 1398, 1479, 1488, 1497, 1569, 1578, 1587, 1596, 1659, 1668, 1677, 1686, 1695, 1749, 1758, 1767, 1776, 1785, 1794, 1839, 1848, 1857, 1866, 1875, 1884, 1893, 1929, 1938, 1947, 1956, 1965, 1974, 1983, 1992, 2199, 2289, 2298, 2379, 2388, 2397, 2469, 2478, 2487, 2496, 2559, 2568, 2577, 2586, 2595, 2649, 2658, 2667, 2676, 2685, 2694, 2739, 2748, 2757, 2766, 2775, 2784, 2793, 2829, 2838, 2847, 2856, 2865, 2874, 2883, 2892, 2919, 2928, 2937, 2946, 2955, 2964, 2973, 2982, 2991, 3099, 3189, 3198, 3279, 3288, 3297, 3369, 3378, 3387, 3396, 3459, 3468, 3477, 3486, 3495, 3549, 3558, 3567, 3576, 3585, 3594, 3639, 3648, 3657, 3666, 3675, 3684, 3693, 3729, 3738, 3747, 3756, 3765, 3774, 3783, 3792, 3819, 3828, 3837, 3846, 3855, 3864, 3873, 3882, 3891, 3909, 3918, 3927, 3936, 3945, 3954, 3963, 3972, 3981, 3990, 4089, 4098, 4179, 4188, 4197, 4269, 4278, 4287, 4296, 4359, 4368, 4377, 4386, 4395, 4449, 4458, 4467, 4476, 4485, 4494, 4539, 4548, 4557, 4566, 4575, 4584, 4593, 4629, 4638, 4647, 4656, 4665, 4674, 4683, 4692, 4719, 4728, 4737, 4746, 4755, 4764, 4773, 4782, 4791, 4809, 4818, 4827, 4836, 4845, 4854, 4863, 4872, 4881, 4890, 4908, 4917, 4926, 4935, 4944, 4953, 4962, 4971, 4980, 5079, 5088, 5097, 5169, 5178, 5187, 5196, 5259, 5268, 5277, 5286, 5295, 5349, 5358, 5367, 5376, 5385, 5394, 5439, 5448, 5457, 5466, 5475, 5484, 5493, 5529, 5538, 5547, 5556, 5565, 5574, 5583, 5592, 5619, 5628, 5637, 5646, 5655, 5664, 5673, 5682, 5691, 5709, 5718, 5727, 5736, 5745, 5754, 5763, 5772, 5781, 5790, 5808, 5817, 5826, 5835, 5844, 5853, 5862, 5871, 5880, 5907, 5916, 5925, 5934, 5943, 5952, 5961, 5970, 6069, 6078, 6087, 6096, 6159, 6168, 6177, 6186, 6195, 6249, 6258, 6267, 6276, 6285, 6294, 6339, 6348, 6357, 6366, 6375, 6384, 6393, 6429, 6438, 6447, 6456, 6465, 6474, 6483, 6492, 6519, 6528, 6537, 6546, 6555, 6564, 6573, 6582, 6591, 6609, 6618, 6627, 6636, 6645, 6654, 6663, 6672, 6681, 6690, 6708, 6717, 6726, 6735, 6744, 6753, 6762, 6771, 6780, 6807, 6816, 6825, 6834, 6843, 6852, 6861, 6870, 6906, 6915, 6924, 6933, 6942, 6951, 6960, 7059, 7068, 7077, 7086, 7095, 7149, 7158, 7167, 7176, 7185, 7194, 7239, 7248, 7257, 7266, 7275, 7284, 7293, 7329, 7338, 7347, 7356, 7365, 7374, 7383, 7392, 7419, 7428, 7437, 7446, 7455, 7464, 7473, 7482, 7491, 7509, 7518, 7527, 7536, 7545, 7554, 7563, 7572, 7581, 7590, 7608, 7617, 7626, 7635, 7644, 7653, 7662, 7671, 7680, 7707, 7716, 7725, 7734, 7743, 7752, 7761, 7770, 7806, 7815, 7824, 7833, 7842, 7851, 7860, 7905, 7914, 7923, 7932, 7941, 7950, 8049, 8058, 8067, 8076, 8085, 8094, 8139, 8148, 8157, 8166, 8175, 8184, 8193, 8229, 8238, 8247, 8256, 8265, 8274, 8283, 8292, 8319, 8328, 8337, 8346, 8355, 8364, 8373, 8382, 8391, 8409, 8418, 8427, 8436, 8445, 8454, 8463, 8472, 8481, 8490, 8508, 8517, 8526, 8535, 8544, 8553, 8562, 8571, 8580, 8607, 8616, 8625, 8634, 8643, 8652, 8661, 8670, 8706, 8715, 8724, 8733, 8742, 8751, 8760, 8805, 8814, 8823, 8832, 8841, 8850, 8904, 8913, 8922, 8931, 8940, 9039, 9048, 9057, 9066, 9075, 9084, 9093, 9129, 9138, 9147, 9156, 9165, 9174, 9183, 9192, 9219, 9228, 9237, 9246, 9255, 9264, 9273, 9282, 9291, 9309, 9318, 9327, 9336, 9345, 9354, 9363, 9372, 9381, 9390, 9408, 9417, 9426, 9435, 9444, 9453, 9462, 9471, 9480, 9507, 9516, 9525, 9534, 9543, 9552, 9561, 9570, 9606, 9615, 9624, 9633, 9642, 9651, 9660, 9705, 9714, 9723, 9732, 9741, 9750, 9804, 9813, 9822, 9831, 9840, 9903, 9912, 9921, 9930, Liczby czterocyfrowe o sumie cyfr równej 5 to: 1004, 1013, 1022, 1031, 1040, 1103, 1112, 1121, 1130, 1202, 1211, 1220, 1301, 1310, 1400, 2003, 2012, 2021, 2030, 2102, 2111, 2120, 2201, 2210, 2300, 3002, 3011, 3020, 3101, 3110, 3200, 4001, 4010, 4100, 5000, Liczby czterocyfrowe o sumie cyfr równej 13 to: 1039, 1048, 1057, 1066, 1075, 1084, 1093, 1129, 1138, 1147, 1156, 1165, 1174, 1183, 1192, 1219, 1228, 1237, 1246, 1255, 1264, 1273, 1282, 1291, 1309, 1318, 1327, 1336, 1345, 1354, 1363, 1372, 1381, 1390, 1408, 1417, 1426, 1435, 1444, 1453, 1462, 1471, 1480, 1507, 1516, 1525, 1534, 1543, 1552, 1561, 1570, 1606, 1615, 1624, 1633, 1642, 1651, 1660, 1705, 1714, 1723, 1732, 1741, 1750, 1804, 1813, 1822, 1831, 1840, 1903, 1912, 1921, 1930, 2029, 2038, 2047, 2056, 2065, 2074, 2083, 2092, 2119, 2128, 2137, 2146, 2155, 2164, 2173, 2182, 2191, 2209, 2218, 2227, 2236, 2245, 2254, 2263, 2272, 2281, 2290, 2308, 2317, 2326, 2335, 2344, 2353, 2362, 2371, 2380, 2407, 2416, 2425, 2434, 2443, 2452, 2461, 2470, 2506, 2515, 2524, 2533, 2542, 2551, 2560, 2605, 2614, 2623, 2632, 2641, 2650, 2704, 2713, 2722, 2731, 2740, 2803, 2812, 2821, 2830, 2902, 2911, 2920, 3019, 3028, 3037, 3046, 3055, 3064, 3073, 3082, 3091, 3109, 3118, 3127, 3136, 3145, 3154, 3163, 3172, 3181, 3190, 3208, 3217, 3226, 3235, 3244, 3253, 3262, 3271, 3280, 3307, 3316, 3325, 3334, 3343, 3352, 3361, 3370, 3406, 3415, 3424, 3433, 3442, 3451, 3460, 3505, 3514, 3523, 3532, 3541, 3550, 3604, 3613, 3622, 3631, 3640, 3703, 3712, 3721, 3730, 3802, 3811, 3820, 3901, 3910, 4009, 4018, 4027, 4036, 4045, 4054, 4063, 4072, 4081, 4090, 4108, 4117, 4126, 4135, 4144, 4153, 4162, 4171, 4180, 4207, 4216, 4225, 4234, 4243, 4252, 4261, 4270, 4306, 4315, 4324, 4333, 4342, 4351, 4360, 4405, 4414, 4423, 4432, 4441, 4450, 4504, 4513, 4522, 4531, 4540, 4603, 4612, 4621, 4630, 4702, 4711, 4720, 4801, 4810, 4900, 5008, 5017, 5026, 5035, 5044, 5053, 5062, 5071, 5080, 5107, 5116, 5125, 5134, 5143, 5152, 5161, 5170, 5206, 5215, 5224, 5233, 5242, 5251, 5260, 5305, 5314, 5323, 5332, 5341, 5350, 5404, 5413, 5422, 5431, 5440, 5503, 5512, 5521, 5530, 5602, 5611, 5620, 5701, 5710, 5800, 6007, 6016, 6025, 6034, 6043, 6052, 6061, 6070, 6106, 6115, 6124, 6133, 6142, 6151, 6160, 6205, 6214, 6223, 6232, 6241, 6250, 6304, 6313, 6322, 6331, 6340, 6403, 6412, 6421, 6430, 6502, 6511, 6520, 6601, 6610, 6700, 7006, 7015, 7024, 7033, 7042, 7051, 7060, 7105, 7114, 7123, 7132, 7141, 7150, 7204, 7213, 7222, 7231, 7240, 7303, 7312, 7321, 7330, 7402, 7411, 7420, 7501, 7510, 7600, 8005, 8014, 8023, 8032, 8041, 8050, 8104, 8113, 8122, 8131, 8140, 8203, 8212, 8221, 8230, 8302, 8311, 8320, 8401, 8410, 8500, 9004, 9013, 9022, 9031, 9040, 9103, 9112, 9121, 9130, 9202, 9211, 9220, 9301, 9310, 9400, Process completed.
Zadanie 2. Dla dwóch liczb a i b oblicz średnią geometryczną z liczb z przedziału od a do b. Znowu ważne jest by wiedzieć, co mamy napisać. Co program ma robić. Tu widzimy już na samym początku treści zadania dla dwóch liczb a i b i od razu wiemy, że użytkownik będzie musiał wprowadzić liczby te z klawiatury. Ponownie kolorem niebieskim zaznaczyłem, co program ma wykonać. 1. Oblicz średnią geometryczną prosta sprawa, coś mamy obliczyć. W naszym wypadku jest to średnia geometryczna. Szanowny pan doktor raczył zamieścić wzór na średnią geometryczną, który i tak nie pomoże tym, którzy nie lubią matmy, bo zaistniał tam złowrogo wyglądający symbol iloczynu nieskończonego. Wzór ten wygląda następująco: Nie jest on trudny. Przy okazji można podszlifować analizę matematyczną i dowiedzieć się, że iloczyn nieskończony jest analogicznym wyrażeniem do szeregu z tą różnicą, że kolejnych wyrazów nie dodajemy do siebie, lecz mnożymy. I tak np. 4! możemy wyrazić za pomocą działania 1*2*3*4 = 24 jak również za pomocą iloczynu. 2. Liczb z przedziału od a do b rozwiązanie znów samo nam się nasuwa. Mamy przedział od a do b, czyli jasna sprawa, że użyjemy pętli for, w której zmienną sterującą zainicjalizujemy z wartością a, a warunkiem będzie, by owa zmienna nie przekroczyła wartości b. Kod programu: import java.lang.math; import java.util.scanner; public class Zadanie3_2 static double a, b; static Zadanie3_2 zadanie = new Zadanie3_2(); public static void main(string[] args) Scanner czytaj = new Scanner(System.in); System.out.print("Podaj liczbę a: "); zadanie.a = czytaj.nextdouble(); System.out.print("Podaj liczbę b: "); zadanie.b = czytaj.nextdouble(); System.out.printf("Średnia geometryczna liczb z przedziału [%.0f..%.0f] wynosi %.2f", zadanie.a,zadanie.b,zadanie.średniageometryczna(zadanie.iloczyn(zadanie.a,zada nie.b))); double iloczyn(double a, double b) double il=1.0, czynnik; for(double i=a;i<=b;i++) il*=i; return il; double średniageometryczna(double iloczyn) double n = (zadanie.b - zadanie.a)+1; double podstawa = zadanie.iloczyn(zadanie.a,zadanie.b); double wykładnik = 1/n; return Math.pow(podstawa,wykładnik);
Zacznijmy od samego początku. Pierwsze dwie instrukcje to zaimportowanie dwóch potrzebnych do działania programu bibliotek Scanner oraz Math. Pierwsza przyda się do czytania danych z klawiatury, druga zaś do obliczeń matematycznych. Następnie z klasie głównej, podobnie jak w poprzednim programie, deklarujemy ważne zmienne globalne oraz konstruktor klasy o nazwie zadanie. W metodzie main wczytujemy sobie dane (mam nadzieję, że tego tłumaczyć nie trzeba) i następnie wywołujemy metodę średniageometryczna, która jest zdefiniowana niżej. Metoda średniageometryczna wykorzystuje wartość innej metody iloczyn. Metoda iloczyn zwraca nam wartość będącą iloczynem liczb z przedziału wczytanego z klawiatury. Oznacza to, że wykonujemy pętlę i od a do b, gdzie zmienną il (skrót od iloczyn) mnożymy przez kolejną liczbę przedziału (i). Na końcu zwracamy il by w miejscu wywołania metody, pojawiła się ta wartość. A przyda się ona, będąc parametrem metody średniageometryczna, gdzie ów zwrócony iloczyn będzie liczbą podpierwiastkową (zgodnie ze wzorem na średnią geometryczną). W innej instrukcji obliczamy ilość elementów przedziału, która to będzie stopniem pierwiastka. Pierwiastkowanie n-tego stopnia wykonujemy na zasadzie potęgi do 1/n, i tak też wygląda nasza potęga, za którą odpowiada metoda pow z biblioteki Math. Jej pierwszym argumentem jest podstawa potęgi (wcześniej obliczona), a drugim wykładnik (również wcześniej obliczony) Działanie programu: --------------------Configuration: <Default>-------------------- Podaj liczbę a: 1 Podaj liczbę b: 3 Średnia geometryczna liczb z przedziału [1..3] wynosi 1,82 Process completed.
Zadanie 3. Napisz program sumujący liczby nieparzyste z przedziału od 1 do n, gdzie n 1 podaje użytkownik na starcie programu. Program powinien zakończyć sumowanie na liczbie n, gdy liczba n jest nieparzysta lub na liczbie n 1, gdy liczba n jest parzysta. Ponownie zadanie zaczniemy od analizy treści i uświadomienia sobie, co musimy wykonać. Tak naprawdę wynikiem końcowym jest fragment zaznaczony na niebiesko. Reszta, to warunki, które musimy spełnić. 1. Sumujący liczby nieparzyste prosta sprawa, musimy napisać metodę sprawdzającą, czy podana liczba jest parzysta. 2. Z przedziału od 1 do n znowu przedział, jednak tym razem łatwiejszy, niż poprzednio, gdyż wprowadzamy jego górną granicę. Pętlowanie rozpoczniemy więc standardowo od jedynki. Pominę tłumaczenie tego program powinien zakończyć sumowanie bo zrobiłem to za pomocą dodania jednego znaku w jednej instrukcji, a później zresztą i tak to objaśnię. Kod programu: import java.util.scanner; public class Zadanie3_3 int a; static Zadanie3_3 zadanie = new Zadanie3_3(); public static void main(string[] args) Scanner czytaj = new Scanner(System.in); System.out.print("Podaj n-1: "); zadanie.a = czytaj.nextint(); System.out.printf("Suma liczb nieparzystych z zakresu [1..%d] wynosi %d",(zadanie.a),(zadanie.sumujnieparzyste(zadanie.a))); int sumujnieparzyste(int ile) int suma=0; for(int i=1;i<=ile;i++) if(i%2!=0) suma+=i; return suma; Zapis w pierwszej linijce wyjaśniłem przy okazji poprzedniego zadania, podobnie zresztą jak i kolejnych kilka. Zajmę się więc samym algorytmem. Program ma sumować liczby nieparzyste, więc przyda nam się wiedza, jak sprawdzić, czy liczba jest parzysta, czy też nie jest. A nie jest wtedy, gdy reszta z dzielenia przez 2 wynosi 1. Taki też mamy warunek w pętli, której zadanie jest sprawdzić, czy kolejna liczba będąca numerem iteracji jest nieparzysta i jeśli tak jest, to dodać ją do ogólnej sumy. Pętla nam się wykonuje do czasu, aż osiągnie numer wprowadzony przez nas z klawiatury. Gdybyśmy zapisali warunek pętli jako i<ile to wtedy wykonywałoby się faktycznie dla naszego wprowadzonego n-1, dodanie jednak symbolu =, który zmienia logikę warunku, upraszcza sprawę. Warunek i<=ile jest więc złotym środkiem na to zadanie. Co ciekawe, w metodie sumujnieparzyste zastosowałem parametr, który jest niczym innym, jak ilością liczb do policzenia, którą wprowadzamy z klawiatury. Z kolei zwrócenie sumy za pomocą
instrukcji return pozwoli nam na swobodne wyświetlenie wartości i używanie tej metody w innych metodach. Działanie programu: --------------------Configuration: <Default>-------------------- Podaj n-1: 9 Suma liczb nieparzystych z zakresu [1..9] wynosi 25 Process completed.
Zadanie 4. Napisz program, który oblicza wartość równania kwadratowego ax2+bx+c=0. Co trzeba zrobić, zaznaczyłem na niebiesko. Myślę, że tutaj już nie potrzeba tego wypunktowywać, bo w sumie cel jest jeden: obliczyć równanie kwadratowe. Faktem jest, że jest kilka metod rozwiązywania równania kwadratowego: wzory Viete a, metoda wyznaczników oraz standardowa szkolna przez deltę. I tej ostatniej użyjemy, choć najprostszą z podanych nie jest, jednak taki jest wymóg zadania. Kod programu: import java.util.scanner; import java.lang.math; public class Zadanie3_4 float a,b,c; static Zadanie3_4 zadanie = new Zadanie3_4(); public static void main(string[] args) Scanner czytaj = new Scanner(System.in); System.out.print("Wprowadź a: "); zadanie.a = czytaj.nextfloat(); System.out.print("Wprowadź b: "); zadanie.b = czytaj.nextfloat(); System.out.print("Wprowadź c: "); zadanie.c = czytaj.nextfloat(); System.out.printf("Rozwiązania równania %.2fx^2 + %.2fx + %.2f = 0 :\n",zadanie.a,zadanie.b,zadanie.c); zadanie.równaniekwadratowe(zadanie.a,zadanie.b,zadanie.c); void równaniekwadratowe(float a, float b, float c) if(a==0) System.out.print("Równanie nie jest kwadratowe"); else double delta; delta = (b*b)-4*(a*c); if(delta<0) System.out.print("Brak rozwiązań rzeczywistych"); else if(delta==0) System.out.printf("%.2f",(-(b/(2*a)))); else if(delta>0) System.out.printf("%.2f oraz %.2f",((-b- Math.sqrt(delta))/(2*a)),((-b+Math.sqrt(delta))/(2*a))); Znowu sytuacja taka, że pierwszych linijek kodu tłumaczyć nie będę, bo zostały wytłumaczone już wcześniej. Przejdę więc do samej metody równaniekwadratowe, która posiada trzy argumenty a, b i c będące odpowiednimi współczynnikami równania. Następuje sprawdzenie, czy w ogóle nasze równanie jest kwadratowe. Jest, jeśli współczynnik przy jest różny od zera. Tylko wtedy wykonujemy dalsze czynności, w przeciwnym wypadku zwracamy informację, że równanie jest liniowe. Gdy jednak delta jest różna od zera, możemy poszaleć. Mamy trzy warianty delty: ujemna brak rozwiązań rzeczywistych (należałoby liczyć liczby zespolone) zerowa istnieje tylko jedno rozwiązanie dodatnia istnieją dwa rozwiązania.
Wszystkie te trzy przypadki zostały rozpatrzone za pomocą instrukcji warunkowych i przy odpowiednich warunkach zostały wyświetlone odpowiednie rozwiązania. Działanie programu: --------------------Configuration: <Default>-------------------- Wprowadź a: 4 Wprowadź b: 7 Wprowadź c: 3 Rozwiązania równania 4,00x^2 + 7,00x + 3,00 : -1,00 oraz -0,75 Process completed.
Zadanie 5. Należy obliczyć sumę szeregu harmonicznego z dokładnością zawartą w przedziale 0<eps<1, podana przez użytkownika programu. Suma szeregu jest równa: Suma = 1+1/2 + 1/3+...+ 1/n, gdzie 1/n>=eps Kolejne z pozoru trudne zadanie, jednak po głębszej analizie wszystko nabiera sensu. Na niebiesko jest to, co mamy zaprogramować. Ważne jest, czym jest tutaj eps. Jest to dokładność szeregu, czyli przekładając to na prosty język, wyraz, do którego ma sumować. Eps to nic innego jak wyrażenie 1/n. Z prostego równanka możemy z łatwością wyliczyć n, które będzie wynosiło rozwiązać program, składający się z, uwaga, jednej pętli for. Kod programu: import java.util.scanner; public class Zadanie3_5 double eps; static Zadanie3_5 zadanie = new Zadanie3_5(); public static void main(string[] args) Scanner czytaj = new Scanner(System.in); System.out.print("Wprowadź eps: "); zadanie.eps = czytaj.nextdouble(); System.out.printf("Suma szeregu o dokładności %.2f wynosi %.5f",zadanie.eps,zadanie.sumaSzeregu(zadanie.eps)); double sumaszeregu(double eps) double suma = 0.0; int n = (int)math.round(1/eps);. Uzbrojeni w taką wiedzę możemy for(int i=1;i<=n;i++) suma += (1/(i*1.0)); return suma; Prosta sprawa. Jeśli podaliśmy eps, to możemy ten eps teraz przeistoczyć na n potrzebnego do obliczenia sumy szeregu (za pomocą pętli for). Żeby jednak otrzymać n, musimy zmienną double (bo taki jest eps) rzutować na int od razu zaokrąglając do całości, bo liczby całkowite są przecież całkowite. Tak uzyskanego n używamy w pętli for do policzenia sumy n wyrazów szeregu harmonicznego. Działanie programu: --------------------Configuration: <Default>-------------------- Wprowadź eps: 0,2 Suma szeregu o dokładności 0,20 wynosi 2,28333 Process completed.
Za wykonanie zadań chętnie przyjmę