PL/SQL Liczby pierwsze z zakresu 0-e

Odpowiedz Nowy wątek
2014-12-16 18:39
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

  1. 00000 - "line %s, column %s:\n%s"
    Cause: Usually a PL/SQL compilation error.
    Action:

Pozostało 580 znaków

2014-12-18 09:26
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/ques[...]0040/use-of-boolean-in-pl-sql
https://community.oracle.com/[...]/2174833?start=0&tstart=0

edytowany 1x, ostatnio: EroSanin, 2014-12-18 09:26

Pozostało 580 znaków

2014-12-18 10:53
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

Wrzuć kod po zmianie :) - EroSanin 2014-12-18 10:55

Pozostało 580 znaków

2014-12-19 00:48
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;

Pozostało 580 znaków

2014-12-19 08:27
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 :)

edytowany 1x, ostatnio: EroSanin, 2014-12-19 08:27

Pozostało 580 znaków

2014-12-19 11:51
Wielki Pomidor
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;

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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