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


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

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

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

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

  • Автор темы
  • Новичок
  • *
  • Сообщений: 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>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
end;
end.



В ней оформлен вечный цикл, и надо сделать выход по нулю в поле N (т.е., если N=0, выйти из программы). Не знаю, как оформит, ибо N уже находится в цикле рипит-антила. Помогите, пожалуйста.
« Последнее редактирование: 12 Февраля 2013, 21:56:05 от Εὐφροσύνη »
\0

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Используйте тег [сode]

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

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

Оффлайн ZwS

  • Старожил
  • *
  • Сообщений: 1674
    • Просмотр профиля
обьяви еще одну переменную булевого типа и присвой ей true. 0=0 замени на имя_переменной = true. при выполнении нужного тебе условия меняй значение переменной на false.
Dell Inspiron One 2330 | Intel+Radeon HD7650A | 8GB RAM | Ubuntu GNOME 17.10

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
обьяви еще одну переменную булевого типа и присвой ей true. 0=0 замени на имя_переменной = true. при выполнении нужного тебе условия меняй значение переменной на false.
Если пользователь введет 0, цикл всё равно выполнится до конца. Здесь надо использовать оператор break:
while 0=0 do
  begin
    repeat
      write('N: ');
      readln(n);
    until
      (n>1)and(n<=500000);
    if n = 0 then break;
Можно, конечно, использовать оператор безусловного перехода, но это заставляет дедушку Вирта плакать кровавыми слезами.

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

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
  • \0
    • Просмотр профиля
обьяви еще одну переменную булевого типа и присвой ей true. 0=0 замени на имя_переменной = true. при выполнении нужного тебе условия меняй значение переменной на false.
Если пользователь введет 0, цикл всё равно выполнится до конца. Здесь надо использовать оператор break:
while 0=0 do
  begin
    repeat
      write('N: ');
      readln(n);
    until
      (n>1)and(n<=500000);
    if n = 0 then break;
Можно, конечно, использовать оператор безусловного перехода, но это заставляет дедушку Вирта плакать кровавыми слезами.


По нулю не выходит, я так пробовал. Принимает этот ноль, просит ввести k
\0

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
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);
      if n = 0 then break;
    until
      (n>1)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:=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.
Так выходит. Можно сделать с метками, использовать goto для выхода из множественного цикла вполне распространенная практика.

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

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
  • \0
    • Просмотр профиля
  until
    (k>0)and(k<=100000);
    for i:=1 to n do
        a:=i;




Ругается на a:=i; Говорит, что [Error] Project2.dpr(26): Incompatible types: 'Array' and 'Integer'
\0

Оффлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5746
  • Все по палатам!
    • Просмотр профиля
Εὐφροσύνη,
Где вы такое взяли  while 0=0 do ?
Не проще   while true do

Извините, я все еще учусь

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

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
  • \0
    • Просмотр профиля
Εὐφροσύνη,
Где вы такое взяли  while 0=0 do ?
Не проще   while true do


Мне как-то проще...
\0

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
  until
    (k>0)and(k<=100000);
    for i:=1 to n do
        a:=i;




Ругается на a:=i; Говорит, что [Error] Project2.dpr(26): Incompatible types: 'Array' and 'Integer'
Ну это уже вы писали, не знаю, что вы этим хотели сказать, но тут массиву присваивается целое число, поэтому и ругается. Наверное, здесь предполагается a:=i

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Очень странный код
repeat
      write('N: ');
      readln(n);
    until
      (n>1)and(n<=500000);


Вводить с клавиатуры полмиллиона чисел??

Оффлайн SergeyIT

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

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12141
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
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 Никогда не выйдет
А то у вас
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

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

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
  • \0
    • Просмотр профиля
Так из вашего же кода взято, там, где
Цитировать
Так выходит. Можно сделать с метками, использовать goto для выхода из множественного цикла вполне распространенная практика.

Пользователь решил продолжить мысль 12 Февраля 2013, 23:19:37:
Очень странный код
repeat
      write('N: ');
      readln(n);
    until
      (n>1)and(n<=500000);


Вводить с клавиатуры полмиллиона чисел??
Число, меньшее или равное полмиллиона
\0

 

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