Код простого числа - пожалуйста, помогите мне в решении этой ошибки ('пропущен ли'?) - PullRequest
2 голосов
/ 30 января 2011
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

Ответы [ 7 ]

7 голосов
/ 30 января 2011

Это из-за этого сегмента кода, отформатированного для лучшего понимания:

 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. Вот почему, когда вы заканчиваете свой файл в строке 25 с end, он жалуется на отсутствие if после него (чтобы сделать end if).

Просто нажмите end if сразу после строки 19, и это должно исправить.


Это должно решить вашу непосредственную проблему, но у меня также есть пара быстрых комментариев.

  • , если вы используете for i in 2..n loop (начинайте с 2 вместо 1) и тестируйте counter больше 1 (вместо 2), это должно спасти некоторую работу. mod(n,1) ноль для все n.
  • в любом случае исходный тест должен был быть для больше , чем 2, а не равным: число 12 дало бы вам 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.
4 голосов
/ 30 января 2011

Я думаю, что вы ищете ключевое слово PL / SQL ELSIF. Я взял твой код, заменил

else if n=2

в строке 11 с

elsif n=2

и это сработало.

2 голосов
/ 03 декабря 2011

Для каждого IF мы должны закрыть его, используя END IF;

Но когда мы используем ELSEIF одного достаточно.

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

или

IF
  ......
   ELSE IF
   .......
   END IF;
END IF;
1 голос
/ 31 января 2011

1) Вам нужна точка с запятой после последней end в строке 25. 2) Затем вы получите еще одну ошибку (см. Примечание 1 ниже) и вам нужно исправить ее, подставив else if для *1003* в строке 11.3) Наконец, 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.

Также, см. ответ Паксдиабло для дополнительных замечаний по улучшениюэтот код относительно простых чисел.


Примечание 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 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
0 голосов
/ 10 августа 2016

проверка простых чисел.

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;
0 голосов
/ 30 октября 2013
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 голосов
/ 08 августа 2012
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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...