To musze stworzyc jeden plik z samą klasą LiczbyPierwsze drugi z Klasa Test i potem co? bez sensu..
Program wyszukujący liczby pierwsze z podanego zakresu
- Rejestracja: dni
- Ostatnio: dni
- Postów: 913
To że klasa będzie w osobnym pliku nie oznacza że nie będzie można się do niej odwołać. Kodu w klasie Test nie będziesz musiał w ogóle modyfikować.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 88
No zrobiłem nowy plik ale dalej wyskakuje błąd. W notatniku powinienem miec oddzielnie klasy czy w klasie test może byc klasa LiczbyPierwsze która mam w osobnym pliku.?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 913
W klasie Test nie może być klasy LiczbyPierwsze.
W pliku Test.java ma być tylko publiczna klasa Test.
W pliku LiczbyPierwsze.java ma być tylko publiczna klasa LiczbyPierwsze.
Przydało by się abyś powiedział mi co to za błąd.
Zamiast pisać w notatniku pisz w jakimś IDE, np. IntelliJ IDEA. Dzięki temu będziesz widział od razu z czym jest problem i gdzie.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 88
To skąd klasa test ma wiedzieć, że istnieje takie coś jak klasa liczby pierwsze?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 88
Test.java:17: error: cannot find symbol
System.out.print(pierwsze.liczba(Integer.parseInt(args[i])));
^
symbol: variable pierwsze
location: class Test
1 error
- Rejestracja: dni
- Ostatnio: dni
- Postów: 913
Wychodzi na to że w tym miejscu nie istnieje coś takiego jak pierwsze. Pokaż swój kod jeszcze raz.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 88
```public class Test
{
public static void main(String[] args)
{
int n=Integer.parseInt(args[0]);
if(n<2)
{
System.out.print(args[0]);
System.out.print(" - "+"Nieprawidłowy zakres");
}
else
{
for(int i=1; i<args.length; i++)
{
System.out.print(pierwsze.liczba(Integer.parseInt(args[i])));
System.out.print(" "+i);
System.out.println();
}
}
}
}
public class LiczbyPierwsze
{
private int[] liczby;
public LiczbyPierwsze(int n)
{
liczby = new int[n];
int index = 0;
for (int i = 2; i < n; i++)
{
if (isPrime(i))
{
liczby[index++] = i;
}
}
}
private boolean isPrime(int n)
{
if (n < 2)
{
return false;
}
for (int i = 2; i < n; i++)
{
if (n % i == 0)
{
return false;
}
}
return true;
}
public int liczba(int m)
{
return liczby[m];
}
}
- Rejestracja: dni
- Ostatnio: dni
- Postów: 913
W pętli forPrzed pętlą for musisz utworzyć obiekt typu LiczbyPierwsze:
LiczbyPierwsze pierwsze = new LiczbyPierwsze(n);
- Rejestracja: dni
- Ostatnio: dni
- Postów: 88
Działa tylko nie wiem dlaczego dla 11 wyskakuje 1 a dla 7 2 :/
- Rejestracja: dni
- Ostatnio: dni
- Postów: 913
Chyba o tą linię chodzi:
System.out.print(" " + i);
Każda linia ma 2 kolumny - n-ta liczba pierwsza oraz i.
Twoja metoda main powinna wyglądać tak:
public static void main(String[] args) {
args = new String[] {"200", "11", "7"};
int n = Integer.parseInt(args[0]);
if (n < 2) {
System.out.print(n);
System.out.print(" - " + "Nieprawidłowy zakres");
} else {
LiczbyPierwsze pierwsze = new LiczbyPierwsze(n); // To ma być przed pętlą, tak jakteraz
for (int i = 1; i < args.length; i++) {
System.out.print(pierwsze.liczba(Integer.parseInt(args[i])));
System.out.print(" " + i);
System.out.println();
}
}
}
Tworzenie obiektu ma być przed pętlą nie w niej, źle napisałem wcześniej, wybacz :/.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 88
Teraz to w ogóle jaja, dla 7 wyskakuje mi "0 1" a dla 2 "5 2"..nie wiem o co chodzi
- Rejestracja: dni
- Ostatnio: dni
- Postów: 913
Jeżeli wyskakuje Ci 0 to pewnie pierwszy argument jest za mały.
7ma liczba pierwsza to 19 więc ten argument musi być > 19.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 88
D:\Kurs Programowania>java Test 15 2 5
5 1
13 2
- Rejestracja: dni
- Ostatnio: dni
- Postów: 913
"Źle", "nie działa", "nie tak" - to nic nikomu nie mówi. Opisz problem jak należy.
Program działa tak:
- Tworzysz obiekt
pierwsze. Jako argument do konstruktora przekazujesz pierwszy argument z linii poleceń. Jest to górny zakres do którego liczby będą generowane - liczba zwraca
m-tą liczbę pierwszą.0to2,1to 3,2to5i tak dalej.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 88
Aaaa bo ja myślałem, że "zrobiłem" to w sposób taki ze jak dam 2 to wyskoczy mi 0 ok już poprawiam :) Dziękuje za całą pomoc Mistrzu :D
- Rejestracja: dni
- Ostatnio: dni
- Postów: 88
A i ostatnie pytanko jak podam daną typu string ma wyskoczyć błędna dana a jak spoza zakresu to ma wyskoczyc spoza zakresu :) To ostatnie jest akurat proste, ale nie wiem jak mam napisać dla tego stringa.
```public class Test
{
public static void main(String[] args)
{
int n=Integer.parseInt(args[0]);
if(n<2)
{
System.out.print(args[0]);
System.out.print(" - "+"Nieprawidłowy zakres");
}
else
{
LiczbyPierwsze pierwsze = new LiczbyPierwsze(n);
for(int i=1; i<args.length; i++)
{
if(Integer.parseInt(args[0])>Integer.parseInt(args[i]))
{
System.out.print(Integer.parseInt(args[i])+ " - ");
System.out.print(pierwsze.liczba(Integer.parseInt(args[i])));
System.out.println();
}
else
{
System.out.print(Integer.parseInt(args[i]));
System.out.print("-"+"Liczba spoza zakresu");
System.out.println();
}
}
}
}
}```java
- Rejestracja: dni
- Ostatnio: dni
- Postów: 913
Potrzebujesz czegoś takiego:
private static boolean isInteger(String string) {
for(char c : string.toCharArray()) { // Pętla sprawdza każdy znak w stringu
if (!Character.isDigit(c)) // Jeżeli znak nie jest cyfrą
return false; // Zwracamy false
}
return true; // Jeżeli wszystkie znaki są cyframi - zwracamy prawdę
}
Ta metoda będzie zwracać true jeżeli String zawiera tylko cyfry, a w przeciwnym razie false.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 88
A nie można zmodyfikować tego jakoś z try i catch w Tescie?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 913
Można.
Integer.parseInt rzuca NumberFormatException jeżeli nie można przekonwertować String na int. Dokumentacja
Możesz więc wrzucić większość (jeśli nie cały) kod do try a w catch wyłapywać ten wyjątek i obsługiwać go.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 88
A Mógłbyś mi powiedzieć gdzie tu szybko wrzucic try i catcha żeby nie modyfikować całej klasy. Chodzi mi tylko o te stringi.
public class Test
{
public static void main(String[] args)
{
if(Integer.parseInt(args[0])<2)
{
System.out.print("Nieprawidłowy zakres");
return;
}
else
{
int n=Integer.parseInt(args[0]);
if(n<2)
{
System.out.print(args[0]);
System.out.print(" - "+"Nieprawidłowy zakres");
}
else
{
LiczbyPierwsze pierwsze = new LiczbyPierwsze(n);
for(int i=1; i<args.length; i++)
{
if(Integer.parseInt(args[0])>Integer.parseInt(args[i]))
{
System.out.print(Integer.parseInt(args[i])+ " - ");
System.out.print(pierwsze.liczba(Integer.parseInt(args[i])));
System.out.println();
}
else
{
System.out.print(Integer.parseInt(args[i]));
System.out.print("-"+"Liczba spoza zakresu");
System.out.println();
}
}
}
}
}
}
- Rejestracja: dni
- Ostatnio: dni
- Postów: 913
Wszędzie tam gdzie masz parseInt musiałbyś mieć obsługę wyjątków gdyby nie można było przekonwertować na int. Tylko bez sensu robić:
try {
do_a();
} catch (SomeException ex) {
System.err.println("Some error occurred");
}
do_b();
try {
do_c();
} catch (SomeException ex) {
System.err.println("Some error occurred");
}
Lepiej:
try {
do_a();
do_b();
do_c();
} catch (SomeException ex) {
System.err.println("Some error occurred");
}
Pamiętaj o tym gdy będziesz modyfikował swój kod.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 88
I dlaczego w kodzie jest taki błąd ze jak dam zakres do 15 i np wpisze 14 to mi się wyświetli 0 a nie liczba spoza zakresu..jak to naprawić?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 88
No ok ale chce sobie zrobić warunek że jestli to jest większe od tej ostatniej liczby pierwszej to wyskoczy Za duża liczba a nie 0.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 88
Nie wiem jaki mam dać warunek..Tzn wiem co musi być ale no nie wiem jak to zapisać, że wartość tablicy dla ostatniego indexu jest wieksza od args[i] to mi wyskakuje ten błąd a nie 0.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 88
```LiczbyPierwsze pierwsze = new LiczbyPierwsze(n);
for(int i=1; i<args.length; i++)
{
if(Integer.parseInt(args[0])>Integer.parseInt(args[i]) )
{
System.out.print(Integer.parseInt(args[i])+ " - ");
System.out.print(pierwsze.liczba(Integer.parseInt(args[i])));
System.out.println();
}
else
{
System.out.print(Integer.parseInt(args[i]));
System.out.print("-"+"Liczba spoza zakresu");
System.out.println();
}
}
Nie wiem jaki warunek jeszcze w Ifie
- Rejestracja: dni
- Ostatnio: dni
- Postów: 913
Możesz zmodyfikować kod w LiczbyPierwsze i zapisać ostatnią liczbę pierwszą jako prywatną zmienną w klasie.
Następnie utworzyć getter aby pobrać wartość tej zmiennej:
public int getMax() {
return max; // Załóżmy że największa liczba pierwsza nazywa się max.
}
Potem wystarczy Ci if w Test:
if (args[i] > pierwsze.getMax()) {
// Ups, program nie wygenerował tylu liczb
}
if który masz jest zły bo tak jak tłumaczyłem, pierwszy argument to górny limit liczb które mają być wygenerowane a nie ich ilość.