Program wyszukujący liczby pierwsze z podanego zakresu

Program wyszukujący liczby pierwsze z podanego zakresu
M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0

To musze stworzyc jeden plik z samą klasą LiczbyPierwsze drugi z Klasa Test i potem co? bez sensu..

atmal
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 913
0

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

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0

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

atmal
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 913
0

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.

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0

To skąd klasa test ma wiedzieć, że istnieje takie coś jak klasa liczby pierwsze?

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0

Test.java:17: error: cannot find symbol
System.out.print(pierwsze.liczba(Integer.parseInt(args[i])));
^
symbol: variable pierwsze
location: class Test
1 error

atmal
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 913
0

Wychodzi na to że w tym miejscu nie istnieje coś takiego jak pierwsze. Pokaż swój kod jeszcze raz.

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0
Kopiuj

```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];
   }
}
atmal
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 913
0

W pętli forPrzed pętlą for musisz utworzyć obiekt typu LiczbyPierwsze:

Kopiuj
LiczbyPierwsze pierwsze = new LiczbyPierwsze(n);
M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0

Działa tylko nie wiem dlaczego dla 11 wyskakuje 1 a dla 7 2 :/

atmal
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 913
0

Chyba o tą linię chodzi:

Kopiuj
System.out.print(" " + i);

Każda linia ma 2 kolumny - n-ta liczba pierwsza oraz i.
Twoja metoda main powinna wyglądać tak:

Kopiuj
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 :/.

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0

Teraz to w ogóle jaja, dla 7 wyskakuje mi "0 1" a dla 2 "5 2"..nie wiem o co chodzi

atmal
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 913
0

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.

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0

D:\Kurs Programowania>java Test 15 2 5
5 1
13 2

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0

cos w printach jest zle..

atmal
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 913
1

"Ź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ą. 0 to 2, 1 to 3, 2 to 5 i tak dalej.
M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0

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

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0

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.

Kopiuj

Kopiuj

Kopiuj

```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

atmal
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 913
1

Potrzebujesz czegoś takiego:

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

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0

A nie można zmodyfikować tego jakoś z try i catch w Tescie?

atmal
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 913
0

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.

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0

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.

Kopiuj
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();
               }
            }
         }
      } 
   }
}
atmal
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 913
0

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ć:

Kopiuj
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:

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

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0

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ć?

atmal
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 913
0

Już o tym pisałem tutaj:

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.

Teraz próbujesz dostać 14 liczbę pierwszą ale tablica zapełnia do 15 (nie 15 liczb)

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0

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.

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0

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.

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0
Kopiuj

```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
atmal
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 913
0

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:

Kopiuj
public int getMax() {
	return max; // Załóżmy że największa liczba pierwsza nazywa się max.
}

Potem wystarczy Ci if w Test:

Kopiuj
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ść.

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0

No moją liczbą pierwszą jest i. Więc ja chce żeby mi jakoś to zapamiętało abym mógł to wrzucic to tego int getMax. Ale gdy odwołuje się do i w getMax wyskakuje błąd: cannot find symbol.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.