PL/SQL Liczby pierwsze z zakresu 0-e

0

Witam

Bardzo proszę o pomoc w zadaniu... Raczkuję w tym języku i po wykonaniu mojego kodu zwraca mi błędy :(

Treść zadania
Korzystając z pętli FOR wypisać liczby pierwsze z zakresu od 0 do a, gdzie a-liczba naturalna podana z klawiatury.

Algorytm wzorowany na:

#include <iostream>
using namespace std;

int main() {

   cout << "Podaj zakres: ";
   int e; //Zakres
   cin >>e;
   cout << "W zakresie od 0 do "<< e <<" znalazlem nast. liczby pierwsze:\n" << endl;
   
   int f=e/2;

   bool l[e];
   for(int i=0;i<e;i++) l[i]=1;

   for(int i=2;i<f;i++) // sito
     if(l[i]) for(int j=i+i;j<e;j+=i) l[j]=0;

   // wypisanie liczb pierwszych od 1 do e
   int count=0;
   for(int i=1;i<e;i++)
   {
     if(l[i])
     {
        cout << i << "\t";
        count++;
     }
   }
   cout << "\n\nW sumie " << count << " liczb pierwszych" << endl;
system("pause");
return 0;
} 

Moje zapytanie:

DECLARE 
e NUMBER(5) := &arg1;
f NUMBER(5);
TYPE tablica IS TABLE OF BOOLEAN 
INDEX BY BINARY_INTEGER;
l tablica;
BEGIN
DBMS_OUTPUT.PUT_LINE('Podaj a');
DBMS_OUTPUT.PUT_LINE(e);
f:=e/2;
for i in 0..e loop
 l(i) := 1;
end loop;

for i in 2..f loop
 IF (l(i) > 0) THEN
  for j in (i+i)..e loop
   l(j) := 0;
  end loop;
 END IF;
end loop;

for i in 1..e loop
   IF (l(i) > 0) THEN
    DBMS_OUTPUT.PUT_LINE(i || ' ');
   END IF;
end loop;

END;
 

Błędy, errory:
Error report -
ORA-06550: linia 12, kolumna 10:
PLS-00382: wyrażenie jest niewłaściwego typu
ORA-06550: linia 12, kolumna 2:
PL/SQL: Statement ignored
ORA-06550: linia 16, kolumna 11:
PLS-00306: niepoprawna liczba lub typy argumentów w wywołaniu '>'
ORA-06550: linia 16, kolumna 2:
PL/SQL: Statement ignored
ORA-06550: linia 24, kolumna 13:
PLS-00306: niepoprawna liczba lub typy argumentów w wywołaniu '>'
ORA-06550: linia 24, kolumna 4:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:

1

Jeżeli używasz typu BOOLEAN nie możesz traktować tego typu jak NUMBER(1) przypisując mu wartości 1 lub 0. Ten typ przyjmuje albo TRUE albo FALSE i nic innego. Jak chcesz przerobić sobie wartość BOOLEAN na cyfrę możesz użyć funkcji sys.diutil.bool_to_int(wartosc_bool)

W moim mniemaniu przydatne linki:
http://stackoverflow.com/questions/13560040/use-of-boolean-in-pl-sql
https://community.oracle.com/thread/2174833?start=0&tstart=0

0

Dzięki. Po zmianie już nie wywala błędów, ale nie wiedzieć czemu wypisuje mi tylko 1, 2, 3 jeśli podam np. 30

0

Prosze :)

DECLARE 
e NUMBER(5) := &arg1;
f NUMBER(5);
TYPE tablica IS TABLE OF BOOLEAN 
INDEX BY BINARY_INTEGER;
l tablica;
BEGIN
DBMS_OUTPUT.PUT_LINE('Podales: ');
DBMS_OUTPUT.PUT_LINE(e);
f:=e/2;
for i in 0..e loop
 l(i) := true;
end loop;

for i in 2..f loop
 IF (l(i) != false) THEN
  for j in (i+i)..e loop
   l(j) := false;
  end loop;
 END IF;
end loop;

DBMS_OUTPUT.PUT_LINE('Liczby pierwsze: ');

for i in 1..e loop
   IF (l(i) != false) THEN
    DBMS_OUTPUT.PUT_LINE(i || ' ');
   END IF;
end loop;

END;
0

Spróbuj w ten sposób. Nie do końca dobrze przeniosłeś działanie jednej pętli.

DECLARE 
e NUMBER(5) := &arg1;
f NUMBER(5);
j NUMBER(5);
TYPE tablica IS TABLE OF BOOLEAN 
INDEX BY BINARY_INTEGER;
l tablica;
BEGIN
DBMS_OUTPUT.PUT_LINE('Podales: ');
DBMS_OUTPUT.PUT_LINE(e);
f:=e/2;
for i in 0..e loop
 l(i) := true;
end loop;

for i in 2..f loop
 IF (l(i) != false) THEN
   j:=i+i;
   WHILE (j < e)
   loop
     l(j) := FALSE;
     j:=j+i;
   END loop;
 END IF;
end loop;

DBMS_OUTPUT.PUT_LINE('Liczby pierwsze: ');

for i in 1..e loop
   IF (l(i) != false) THEN
    DBMS_OUTPUT.PUT_LINE(i || ' ');
   END IF;
end loop;

END;

Sam kod działa prawie dobrze. Jedynie kiedy np. wpisujesz wartość 30 wypisuje liczby pierwsze wraz z liczbą wpisaną. Co w wypadku liczby 30 jest błędne ale tu już chyba sobie poradzisz :)

0

Ten algorytm liczy o 2 do n (0 i 1 nie są liczbami pierwszymi) oraz nie włącza samego n do wyznaczania. Lepiej jest dodać większy zakres.

DECLARE
   n     INT := &&zakres;
   x     INT;
   y     INT;

   TYPE tablica IS TABLE OF BOOLEAN
      INDEX BY BINARY_INTEGER;

   tab   tablica;
BEGIN
   x := n / 2;

   FOR i IN 0 .. n
   LOOP
      tab (i) := TRUE;
   END LOOP;

   FOR i IN 2 .. x
   LOOP
      IF tab (i)
      THEN
         y := i + i;


         LOOP
            tab (y) := FALSE;

            y := y + i;

            EXIT WHEN (n <= y);
         END LOOP;
      END IF;
   END LOOP;

   IF tab (n) = TRUE
   THEN
      tab (n) := FALSE;
   END IF;

   FOR i IN 2 .. n
   LOOP
      IF tab (i)
      THEN
         DBMS_OUTPUT.PUT_LINE (i);
      END IF;
   END LOOP;
END;

1 użytkowników online, w tym zalogowanych: 0, gości: 1