Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Помогите оформить выход из вечного цикла на Pascal  (Прочитано 2114 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12141
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Εὐφροσύνη, у вас по коду выход из цикла внутри него. Это классически делается по brake.

goto - муветон в паскале.
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн Γιος Ιάφεθ

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
  • \0
    • Просмотр профиля
while 0=0 do
  begin
    repeat
      write('N: ');
      readln(n);
    until
      (n>1)and(n<=500000);
    if n = 0 then break;

Тогда так:
while 0=0 do
  begin
    repeat
      write('N: ');
      readln(n);
    until
      (n>=0)and(n<=500000);
    if n = 0 then break;
А то 0 не удовлетворяет условиям вложенного цикла и из него 0 Никогда не выйдет
А то у вас
Ругается


1)[Error] Project2.dpr(17): BREAK or CONTINUE outside of loop
2)[Error] Project2.dpr(18): 'END' expected but 'UNTIL' found
3)[Error] Project2.dpr(20): Missing operator or semicolon
4)[Error] Project2.dpr(20): Missing operator or semicolon
5)[Error] Project2.dpr(38): '.' expected but ';' found
\0

rapidsp

  • Гость
Ругается
Ну так begin хочет end. Текст ошибки недвусмысленно говорит об этом.
Я бы тоже ругался :)

Пользователь решил продолжить мысль 12 Февраля 2013, 23:32:23:
goto - муветон в паскале.
Ну break как бы тоже не верх этикета. :) Имхо любой цикл можно построить и без него.
« Последнее редактирование: 12 Февраля 2013, 23:32:23 от rapidsp »

Оффлайн Γιος Ιάφεθ

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
  • \0
    • Просмотр профиля
Так цикл же на всю программу быть должен
\0

Оффлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5746
  • Все по палатам!
    • Просмотр профиля
Εὐφροσύνη,
Ты с такой скоростью пишешь в двух темах, даже не задумываясь... может тормознешь и подумаешь?
Извините, я все еще учусь

rapidsp

  • Гость
Так цикл же на всю программу быть должен
У тебя два цикла. Который внешний не закрыт.

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12141
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Я бы так написал (не гарантирую точность синтаксиса - я на паскале уже лет 20 не писал....):

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;
var
  a:array[1..500000]of longword;
  i,j,k,n:integer;
  cont:boolean;
  ans:string;
begin
  cont:=true;
  while cont do
    begin
      repeat
        write('N: ');
        readln(n);
      until (n>1)and(n<=500000);
      repeat
        write('K: ');
        readln(k);
      until (k>0)and(k<=100000);
      for i:=1 to n do
        a:=i;
      i:=0;
      repeat
        i:=(i+k-1)mod n+1;
        for j:=i to n-1 do
          a[j]:=a[j+1];
        dec(n);
        dec(i);
      until n=1;
      writeln('You must be number ',a[1], ' to survive');
    readln('Do you want to repeat (y/n)',ans);
    if ans='n' then cont:=false;
  end;
end.


PS правильные отступы помогают следить соотвествеи открытия и закрытия секций. И пишите условия until и while сразу за ключевым словом - так нагляднее.
« Последнее редактирование: 12 Февраля 2013, 23:39:26 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн Γιος Ιάφεθ

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
  • \0
    • Просмотр профиля
Все, всем спасибо, заработало.


program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;
var
  a:array[1..500000]of longword;
  i,j,k,n:integer;
begin
  while 0=0 do
  begin
    repeat
      write('N: ');
      readln(n);
    until
      (n>=0)and(n<=500000);
    if n = 0 then break;
    repeat
      write('K: ');
      readln(k);
    until
    (k>0)and(k<=100000);
    for i:=1 to n do
        a[i]:=i;
    i:=0;
    repeat
      i:=(i+k-1)mod n+1;
      for j:=i to n-1 do
        a[j]:=a[j+1];
      dec(n);
      dec(i);
    until
      n=1;
    writeln('You must be number ',a[1], ' to survive');
readln
end;
end.
\0

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Проще так

n := 2;
while (n>1)and(n<=500000) do
begin
    write('N: ');
    readln(n);
    if n = 0 then break;
end;

« Последнее редактирование: 13 Февраля 2013, 00:02:12 от Señor_Gaga »

 

Страница сгенерирована за 0.029 секунд. Запросов: 25.