Witam. Ostatnio zapisałem się szkoły policealnej, informatycznej i od razu zostałem wrzucony do głębokiej wody. Dostałem na start niesamowitą ilość rzeczy do zrobienia pomimo, bardzo krótkiego czasu , dlatego też chciałbym was prosić o pomoc z jednym zadaniem, a mianowicie:
Musze napisać w javie program, który obliczy sume:
\(\displaystyle{ S^\frac{a_1,a_n}{2} \cdot n \\
a_n = 3n+1 \\
a_1 = 3 \cdot 1+1=4}\)
Jeśli źle wrzuciłem posta to proszę o przeniesienie.
Z góry dziękuje za pomoc.
[Java] Napisać program, który obliczy sume...
-
- Użytkownik
- Posty: 1
- Rejestracja: 1 cze 2019, o 09:38
- Płeć: Mężczyzna
- Lokalizacja: świętochłowice
[Java] Napisać program, który obliczy sume...
Ostatnio zmieniony 3 cze 2019, o 14:22 przez Afish, łącznie zmieniany 1 raz.
Powód: Latex
Powód: Latex
-
- Użytkownik
- Posty: 128
- Rejestracja: 5 lip 2015, o 14:48
- Płeć: Mężczyzna
- Lokalizacja: nie wiem
- Podziękował: 11 razy
- Pomógł: 24 razy
[Java] Napisać program, który obliczy sume...
Warto poprosić użytkownika o podanie n
Dane z klawiatury możesz pobrać tak:
powyższy kod przypisuje do zmiennej value podana liczbę całkowitą, warto jednak zabezpieczyć się przed podaniem czegoś co liczbą całkowitą nie jest, np. literą. Można to zrobić na kilka sposobów.
Stwórzmy obiekt typu Scanner, ten obiekt będzie przechwytywał to co użytkownik wpisał w konsoli.
Teraz sprawdźmy, czy to co wpisał jest liczbą całkowita, używamy to tego funkcji warunkowej
Jeśli scanner.hasNextInt() jest prawdą to powinniśmy obliczyć naszą sumę.
Stwórzmy więc funkcję calculateProgression(int n), która przyjmuje liczbę całkowitą. żeby nie było za łatwo moja funkcja oblicza wyrażenie \(\displaystyle{ \frac{ n^{2} }{2}}\), będziesz musiał podmienić to na swoją sumę.
funkcja jest prywatna, bo korzystam z niej tylko w jednej klasie, statyczna ponieważ wywołuje ją w main(), jest typu double ponieważ chce żeby zwracała wynik, który może być liczbą niecałkowitą.
finalnie mamy coś takiego:
Teraz tak, jak zachowa się ten nasz program, po pierwsze wyświetli Podaj n, jeśli użytkownik poda liczbę całkowita to wywoła się funkcja calculateProgression, jej wynik zostanie przypisany do zmiennej sum, a zaraz potem wyświetlimy wartość tej zmiennej w konsoli. Jednak jeśli uzytkownik poda coś innego niż liczbę całkowitą, to wyświetli nam się "no" i program się zakończy, trochę to kiepskie, będziemy musieli uruchomić go ponownie i spróbować od nowa. Warto więc zrobić cos, żeby program się nie kończył tylko mówił, że nie wpisałeś liczby całkowitej, spróbuj ponownie, można to zrobić poprzez rekurencje, czyli wywołanie tej samej funkcji wewnątrz jej ciała. Wygląda to tak:
Teraz do póki użytkownik nie poda liczby całkowitej program niezakończony się. Jednak jest jedno ale, mianowicie wywoływanie przez rekurencje odkłada dane na stosie, a ten ma skończoną pojemność, w efekcie teoretycznie(bo trochę by to trwało) użytkownik podając bez przerwy złe dane może doprowadzić do tak zwanego overflow i wywalenia programu. Można temu zapobiec dodając konstrukcję try catch
Teraz jeśli doszłoby do overflow na stosie, program nie wywali się tylko przechwyci error i przerwie kolejne wywoływanie funkcji getvalue, dzięki czemu nadal będzie działać.
Myślę że dasz sobie teraz radę z napisaniem swojego programu, wrazi problemów pisz
Kod: Zaznacz cały
System.out.println("Podaj n");
Kod: Zaznacz cały
int value = new Scanner(System.in).nextInt();
Stwórzmy obiekt typu Scanner, ten obiekt będzie przechwytywał to co użytkownik wpisał w konsoli.
Kod: Zaznacz cały
Scanner scanner = new Scanner(System.in);
Kod: Zaznacz cały
if (scanner.hasNextInt()) {
System.out.println("yes");
calculateProgression(1);
} else {
System.out.println("no");
}
Stwórzmy więc funkcję calculateProgression(int n), która przyjmuje liczbę całkowitą. żeby nie było za łatwo moja funkcja oblicza wyrażenie \(\displaystyle{ \frac{ n^{2} }{2}}\), będziesz musiał podmienić to na swoją sumę.
Kod: Zaznacz cały
private static double calculateProgression(int n) {
return pow(n, 2) / 2;
}
finalnie mamy coś takiego:
Kod: Zaznacz cały
import java.util.Scanner;
import static java.lang.Math.pow;
public class Main {
private static double calculateProgression(int n) {
return pow(n, 2) / 2;
}
public static void main(String[] args) {
System.out.println("Podaj n");
Scanner scanner = new Scanner(System.in);
if (scanner.hasNextInt()) {
double sum = calculateProgression(scanner.nextInt());
System.out.println("Suma wynosi " + sum);
} else {
System.out.println("no");
}
}
}
Kod: Zaznacz cały
private static void getValue() {
System.out.println("Podaj n");
Scanner scanner = new Scanner(System.in);
if (scanner.hasNextInt()) {
double sum = calculateProgression(scanner.nextInt());
System.out.println("Suma wynosi " + sum);
} else {
System.out.println("To nie liczba calkowita, sprobuj ponownie");
getValue();
}
}
Teraz do póki użytkownik nie poda liczby całkowitej program niezakończony się. Jednak jest jedno ale, mianowicie wywoływanie przez rekurencje odkłada dane na stosie, a ten ma skończoną pojemność, w efekcie teoretycznie(bo trochę by to trwało) użytkownik podając bez przerwy złe dane może doprowadzić do tak zwanego overflow i wywalenia programu. Można temu zapobiec dodając konstrukcję try catch
Kod: Zaznacz cały
private static void getValue() {
System.out.println("Podaj n");
Scanner scanner = new Scanner(System.in);
if (scanner.hasNextInt()) {
double sum = calculateProgression(scanner.nextInt());
System.out.println("Suma wynosi " + sum);
} else {
System.out.println("To nie liczba calkowita, sprobuj ponownie");
try {
getValue();
} catch (StackOverflowError e) {
System.out.println(e);
}
}
}
Teraz jeśli doszłoby do overflow na stosie, program nie wywali się tylko przechwyci error i przerwie kolejne wywoływanie funkcji getvalue, dzięki czemu nadal będzie działać.
Myślę że dasz sobie teraz radę z napisaniem swojego programu, wrazi problemów pisz
Re: [Java] Napisać program, który obliczy sume...
Zauważ, że
albo do
PS. Wiem, że notatka dotyczy wzoru na sumę ciągu arytmetycznego, ale nie wynika to z poprawnego zapisu, tylko z tego, że można się domyślić co masz na myśli.
jest całkowicie nieczytelne. Co jest tutaj daną, a co szukaną? Co oznacza przecinek w liczniku? Czy tutaj liczba S, jest podnoszona do potęgi, czy może indeks górny ma jakieś inne znaczenie, jakie? Jeżeli S jest liczbą, to jaką, czy jest to suma podanego ciągu? Gdyby zadanie brzmiało tak:Musze napisać w javie program, który obliczy sume:
\(\displaystyle{ S^\frac{a_1,a_n}{2} \cdot n \\ a_n = 3n+1 \\ a_1 = 3 \cdot 1+1=4}\)
wszystko byłoby jasne i sprowadzałoby się do:Musze napisać w javie program, który dla zadanego n obliczy sumę ciągu:
\(\displaystyle{ a_n = 3n+1}\)
Kod: Zaznacz cały
int suma = 0;
for(int i = 1; i<=n; i++)
suma += 3*i + 1;
Kod: Zaznacz cały
int suma = (((3*n+1)+4)/2)*n;