[Java] Napisać program, który obliczy sume...

Marciin
Użytkownik
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...

Post autor: Marciin »

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.
Ostatnio zmieniony 3 cze 2019, o 14:22 przez Afish, łącznie zmieniany 1 raz.
Powód: Latex
Ponury123
Użytkownik
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...

Post autor: Ponury123 »

Warto poprosić użytkownika o podanie n

Kod: Zaznacz cały

System.out.println("Podaj n");
Dane z klawiatury możesz pobrać tak:

Kod: Zaznacz cały

int value = new Scanner(System.in).nextInt();
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.

Kod: Zaznacz cały

 Scanner scanner = new Scanner(System.in); 
Teraz sprawdźmy, czy to co wpisał jest liczbą całkowita, używamy to tego funkcji warunkowej

Kod: Zaznacz cały


        if (scanner.hasNextInt()) {
            System.out.println("yes");
            calculateProgression(1);
        } else {
            System.out.println("no");
        }

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ę.

Kod: Zaznacz cały


    private static double calculateProgression(int n) {
        return pow(n, 2) / 2;
    }

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:

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");
        }
    }
}

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:

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
Dudenzz
Użytkownik
Użytkownik
Posty: 93
Rejestracja: 8 mar 2009, o 18:21
Płeć: Mężczyzna
Pomógł: 19 razy

Re: [Java] Napisać program, który obliczy sume...

Post autor: Dudenzz »

Zauważ, że
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}\)
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 dla zadanego n obliczy sumę ciągu:

\(\displaystyle{ a_n = 3n+1}\)
wszystko byłoby jasne i sprowadzałoby się do:

Kod: Zaznacz cały

int suma = 0;
for(int i = 1; i<=n; i++)
    suma += 3*i + 1;
albo do

Kod: Zaznacz cały

int suma = (((3*n+1)+4)/2)*n;
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.
ODPOWIEDZ