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 :(得分:7)
这是因为这个代码段的格式是为了让你更好地理解为什么:
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
)。
在第19行之后立即敲打end if
,然后修复它。
这应该可以解决您当前的问题,但我也有一些快速评论。
for i in 2..n loop
(从2开始而不是1),并且测试counter
大于1(而不是等于2),则应该节省一些工作。对于所有 mod(n,1)
,n
为零。counter
5(一个为1,2 ,3,4和6)因此将被视为非素数。trunc(sqrt(n))+1
(或者使用您使用的任何语言的等效词),因为如果数字高于这个数字,那么您将拥有已经找到它的配对:12 mod 4为零,但你已经发现它的3对(12 mod(12/4)为零)。2..n
不包含n
,因为mod
操作也会增加计数器(我不知道您的特定语言如何处理该循环结构) - 它可能必须是2..n-1
。答案 1 :(得分:4)
我认为您正在寻找PL / SQL ELSIF
关键字。我拿了你的代码,替换了
else if n=2
在第11行
elsif n=2
并且有效。
答案 2 :(得分:2)
对于每个IF
,我们应该使用END IF;
但是当我们使用ELSEIF
时,就足够了。
IF
......
ELSEIF
......
END IF;
或
IF
......
ELSE IF
.......
END IF;
END IF;
答案 3 :(得分:1)
1)在第25行的最后end
之后你需要一个分号.2)然后你得到另一个错误,(参见下面的注释1)并且需要用elsif
代替{{ 1)}在第11行.3)最后,1不是素数,第10行也需要校正,else if
所以纠正的代码是:
then dbms_output.put_line('1 is neither prime nor composite.);
此外,请参阅paxdiablo's答案,了解有关根据素数改进此代码的其他说明。
注1:第二种语法错误如下:
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.
答案 4 :(得分: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;
答案 5 :(得分: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;
答案 6 :(得分: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;