2011-01-30 8 views
2
SQL> ed 
Wrote file afiedt.buf 

    1 declare 
    2 n number; 
    3 i number; 
    4 counter number; 
    5 begin 
    6 n:=&n; 
    7 i:=1; 
    8 counter:=0; 
    9 if n=1 
10  then dbms_output.put_line('1 is a prime No.'); 
11 else if n=2 
12  then dbms_output.put_line('2 is even prime'); 
13 else 
14  for i in 1..n loop 
15  if mod(n,i)=0 
16    then counter:=counter+1; 
17    end if; 
18  end loop; 
19 end if; 
20 if counter=2 
21  then dbms_output.put_line(n||' is a prime No.'); 
22 else 
23  dbms_output.put_line(n||' is a not prime No.'); 
24 end if; 
25* end 

私は理解できない以下のエラーが発生します。誰もそれを引き起こしていることを説明することはできますか?素数番号 - このエラーを解決するのに手伝ってください。( '不足している場合'?)

SQL>/
Enter value for n: 8 
old 6: n:=&n; 
new 6: n:=8; 
end 
    * 
ERROR at line 25: 
ORA-06550: line 25, column 3: 
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the 
following: 
if 
+0

あなたの質問を説明してください - あなたのコードは何をしたいのですか? – Mikaveli

+0

注:1は一般的にプライムとはみなされません。参照:http://mathworld.wolfram.com/PrimeNumber.html。 "素数... 1とそれ以外の正の整数除数を持たない正の整数p> 1です。" 「ナンバー1は素数でも合成でもない特別なケースです(Wells 1986、p.31).1番は以前は素数とみなされていましたが(Goldbach 1742; Lehmer 1909、1914; Hardy and Wright 1979、p 11; Gardner 1984、pp.86-87; Sloane and Plouffe 1995、p.33; Hardy 1999、p.46)。 –

答えて

7

それが原因であなたをより良いunderstndingを与えるためにフォーマットされ、このコードセグメントの理由です:つまり

9 if n=1 
10 | then dbms_output.put_line('1 is a prime No.'); 
11 else 
    | if n=2 
12 | | then dbms_output.put_line('2 is even prime'); 
13 | else 
14 | | for i in 1..n loop 
15 | | | if mod(n,i)=0 
16 | | | | then counter:=counter+1; 
17 | | | end if; 
18 | | end loop; 
19 | end if; 
    ? 

、そのセクションがend ifが欠落しています。だから、endで25行目のファイルを完成させた後に、ifがないことが文句を言う(end ifにする)。

ただちにend ifを押して、それを直す必要があります。


すぐに問題は解決するはずですが、いくつかのコメントもあります。

  • あなたには、いくつかの作業を保存する必要がありfor i in 2..n loopを(2ではなく1から始まる)、およびテストcounterが1より大きい(の代わりに、2に等しい)であること、使用している場合。 mod(n,1)は、のすべてであり、すべてnです。
  • 元のテストでは、は、より大きく、2以外でなければなりません。数字12はcounter(1,2,3,4、および6のいずれか1つ)です非プライムとみなされる。
  • 効率を上げるためには、trunc(sqrt(n))+1(または使用している言語の同等のもの)までチェックする必要があることを覚えておく必要があります。それよりも高い数値が要因の場合は、 :12 mod 4はゼロですが、すでに3のペアが見つかりました(12 mod(12/4)はゼロです)。
  • (私はあなたの特定の言語が、そのループ構造を処理する方法がわからない)2..nもカウンタが増加しますmod操作以降nが含まれていないことを確認してください - それは2..n-1する必要があります。
+0

有用ですが、最終的には報告されている構文エラーを逃します。これは25行目のセミコロンがありません。そのエラーがif問題よりも訂正された場合、報告されます。また、「いずれにしても、元のテストは2以上でなければならず、等しくないはずです...」という誤りは間違いです。ループは1..Nであり、 'i = 1 'のときは1回、' i = N'のときは 'mod(n、i)= 0 'は素数に対して2回発生する。もちろん、ループを短くしてNの平方根に行くだけで、最終的なテストを変更する必要があります。 –

+0

mod(n、1)は常にゼロになるので時間を浪費します。私のポイントは、2で始まり、カウントチェックを調整する方が良いということでした。そして、報告されているエラーは、セミコロンがなくても、不平等な 'if'ステートメントであることが報告されています - "次のどれかを期待しています:if "は終わりでなければならないことを意味します。報告されたセミコロンを修正しても、セミコロンがないと次のエラーになる可能性がありますが、それは問題にはなりません。 – paxdiablo

+0

@paxdiablo:Oracleを起動し、最後にセミコロンを追加せずにif文のバランスをとり、 'end-of-file'に到達するまでのエラーを返さずに動作するかどうか確認します。 –

4

私はPL/SQL ELSIFキーワードを探していると思います。私は、あなたのコードを取っ

elsif n=2 

とライン11上の

​​

を交換し、それが働きました。

1

1)あなたは、あなたが、別のエラーが発生します(下記の注1を参照)とライン11 3でelse ifためelsifを代入して修正する必要があります)ライン25を2での最終end後にセミコロンが必要)Finaly、 1また、プライム、ライン10人のニーズ補正され、then dbms_output.put_line('1 is neither prime nor composite.);だから修正されたコードではありません。

SQL> declare 
    2  n number; 
    3  i number; 
    4  counter number; 
    5 begin 
    6  n:=&n; 
    7  i:=1; 
    8  counter:=0; 
    9  if n=1 
10   then dbms_output.put_line('1 is neither prime nor composite.'); 
11  elsif n=2 
12   then dbms_output.put_line('2 is even prime'); 
13  else 
14   for i in 1..n loop 
15    if mod(n,i)=0 
16     then counter:=counter+1; 
17    end if; 
18   end loop; 
19  end if; 
20  if counter=2 
21   then dbms_output.put_line(n||' is a prime No.'); 
22  else 
23   dbms_output.put_line(n||' is a not prime No.'); 
24  end if; 
25 end; 
26/
Enter value for n: 3 
old 6:  n:=&n; 
new 6:  n:=3; 
3 is a prime No. 

PL/SQL procedure successfully completed. 

また、素数に関して、このコードを改善することにその他の注意事項についてpaxdiablo'sの答えを参照してください。


注1:2番目の構文エラーがどのように見える:すべてのIFについて

SQL> declare 
    2  n number; 
    3  i number; 
    4  counter number; 
    5 begin 
    6  n:=&n; 
    7  i:=1; 
    8  counter:=0; 
    9  if n=1 
10   then dbms_output.put_line('1 is a prime No.'); 
11  else if n=2 
12   then dbms_output.put_line('2 is even prime'); 
13  else 
14   for i in 1..n loop 
15    if mod(n,i)=0 
16     then counter:=counter+1; 
17    end if; 
18   end loop; 
19  end if; 
20  if counter=2 
21   then dbms_output.put_line(n||' is a prime No.'); 
22  else 
23   dbms_output.put_line(n||' is a not prime No.'); 
24  end if; 
25 end; 
26/
Enter value for n: 10 
old 6:  n:=&n; 
new 6:  n:=10; 
end; 
    * 
ERROR at line 25: 
ORA-06550: line 25, column 4: 
PLS-00103: Encountered the symbol ";" when expecting one of the following: 
if 
2

我々はEND IF;

を使用して、それを閉じる必要があります。しかし、我々はELSEIFを使用する場合1で十分です。

IF 
    ...... 
    ELSEIF 
    ...... 
END IF; 

または

IF 
    ...... 
    ELSE IF 
    ....... 
    END IF; 
END IF; 
0
DECLARE 
    N NUMBER:=&N; 
    V_COUNT NUMBER:=0; 
BEGIN 
    FOR I IN 1..N LOOP 
    IF MOD(N,I)=0 THEN 
     V_COUNT:=V_COUNT+1; 
    END IF; 
    END LOOP; 
    IF V_COUNT<=2 THEN 
    DBMS_OUTPUT.PUT_LINE(N||' ' ||'IS PRIME NUMBER'); 
    ELSE 
    DBMS_OUTPUT.PUT_LINE(N||' '||' IS NOT PRIME NUMBER'); 
    END IF; 
END; 
+0

あなたはこれを説明するために少し時間がかかりませんでした –

0
declare 
    n  number; 
    i  number; 
    counter number; 
begin 
    n  := &n; 
    i  := 1; 
    counter := 0; 
    if n = 1 then 
    dbms_output.put_line('1 is a prime No.'); 
    elsif n = 2 then 
    dbms_output.put_line('2 is even prime'); 
    else 
    for i in 1 .. n loop 
     if mod(n, i) = 0 then 
     counter := counter + 1; 
     end if; 
    end loop; 
    end if; 

    if counter = 2 then 
    dbms_output.put_line(n || ' is a prime No.'); 
    else 
    dbms_output.put_line(n || ' is a not prime No.'); 
    end if; 

end; 
0

素数チェック。

DECLARE 
    N NUMBER :=&N; 
    I NUMBER; 
    COUNTER NUMBER :=0; 
BEGIN 
    FOR I IN 1..N LOOP 
    IF(MOD(N,I) =0) THEN 
    COUNTER :=COUNTER+1; 
END IF; 
END LOOP; 
IF (COUNTER =2) THEN 
DBMS_OUTPUT.PUT_LINE(N ||' '||'IS PRIME NUMBER'); 
ELSE 
DBMS_OUTPUT.PUT_LINE(N ||' '||'IS NOT A PRIME NUMBER'); 
END IF; 
END; 
関連する問題