Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Оператор MOD


Автор: Demonix 17.11.2006, 23:00
Ребята, такая тема:

   y:=66 mod 10;  'Это пашет'
  
Но вот так:

   y:=a mod 10; 'Уже не пашет'

Поясните, как он работает или че надо дописать?! smile   smile 

Автор: Kuvaldis 17.11.2006, 23:09
Demonix, 
а тип какой у переменной а?
и вообще, "код в студию" smile  Мы ж тут не ясновидящие

Автор: Demonix 18.11.2006, 07:00
Код

program i6;
uses dos,crt;
var
a,x,y:real;
begin
a:=66;
x:=frac(a/10);
y:=a mod 10;
writeln(x:0:0);
writeln(y:0:0);
readln;
end.


Причем frac работает, а mod нет. Вообще-то это часть большей программы. Но вот в такой маленькой я пытался разобраться, почему не пашет mod (как и div, кстати). Но он не запускает программу, если y:=a mod 10; и просто пишет, что об ошибке.
А если ставишь число, все работает...


Автор: sorryuz 18.11.2006, 09:16
Код

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;
var
  x,y: real;
  a: integer; {Мод работает только с целочисленными данными}
begin
  a:=66;
  x:=frac(a/10);
  y:=a mod 10;
  writeln(x:0:0);
  writeln(y:0:0);
readln;
end.

Автор: Demonix 18.11.2006, 17:17
sorryuz, 
Постойте, это, допустим, будет работать, но у нас же есть еще и 
Код

begin
  a:=66;
  x:=frac(a/10); {здесь тоже деление, а если a - integer, то здесь будет ошибка!}
  y:=a mod 10;
  writeln(x:0:0);
  writeln(y:0:0);
readln;

Автор: Kuvaldis 18.11.2006, 17:33
Demonix, 
1. Используй кнопку код с выпадающим списком языков, где выбирай язык Delphi. В поле ответа появятся теги "код". Между ними и вставляешь свои программы
2. 
Цитата

 {здесь тоже деление, а если a - integer, то здесь будет ошибка!}

ТЫ проверял на компиляторе??? Все работает (идет неявное преобразование integer в real, и все отрабатывает "как в лучших домах Парижа и ЛондОна") smile 

Только для нормального отображения дробной части нужно написать было
Код

  writeln(x:0:1);
  writeln(y:0:1);

Автор: Demonix 18.11.2006, 19:04
Короче было вот это задание:

Игрок А объявляет двузначное число от 01 до 99. Игрок Bменяет местами его цифры и прибавляет полученное число к сумме его цифр. Полученный результат он объявляет игроку А. Игрок
А проделывает с этим числом ту же процедуру, и так они продолжают поступать поочередно, объявляя числа. От суммы чисел берется остаток от деления на 100, поэтому объявляются лишь двузначные числа. Какие числа может объявить игрок А на начальном шаге, чтобы игрок В в некоторый момент объявил число 00.

Наши мозги додумались лишь до этого:
{Паскаль}


Код
program i6;
var
c,a,x,y,z,b,d:integer;
begin
randomize;
     c:=random(99);
     if c=0 then c:=random(99);
     writeln('c=',c);
     a:=c;
     while (a<>0) do
          begin
          x:=a mod 10;
          y:=a div 10;
          b:=x+y;
          x:=x*10;
          z:=x+y;
          d:=z+b;
          writeln('perevernutoe=',z);
          readln;
          writeln('summa=',b);
          readln;
          writeln('konechnoe d=',d);
          readln;
          d:=d mod 100;
          writeln('nacahlnoe d=',d);
          readln;
          a:=d;
          if a=c then
          begin
          writeln('fatal error');
          a:=0;
          end;
          if a=z then
          begin
          writeln('fatal error');
          a:=0;
          end;
          end;
          readln;
         end.
   smile 

Но в итоге программа приходит или к её собственному "Фатал ерору" или начинает гонять по кругу некоторые числа... К примеру начали с 41 и затем пришли к 93, которое через несколько порядков вылазиет заново... мы решили, что лучше сделать так:  smile , а иначе никак...



Автор: volvo877 18.11.2006, 21:03
Demonix, я бы твою задачу решал так:
Код

var i, first, second, count: integer;
begin
  for i := 1 to 99 do begin
    first := i; { Первый получил число... }
    count := 0;
    repeat

      { Второй получил свое переворотом цифр и добавлением суммы цифр
         (по модулю 100 - только 2 последние цифры) }
      second := (10 * (first mod 10) + (first div 10) +
                (first div 10) + (first mod 10)) mod 100;

      { Если не получен 0, то первый точно так же пелучает свое число }
      if second <> 0 then begin
        first := (10 * (second mod 10) + (second div 10) +
                  (second div 10) + (second mod 10)) mod 100;

        { Эо - для контроля зацикленности }
        inc(count);
      end;

    { Повторять до тех пор, пока не зациклились (1000 проходов) или пока второй не получил 0 }
    until (second = 0) or (count > 1000);

    { Если ТОЛЬКО второй игрок получил 0 из числа, полученного от первого,
       а не случилось так, что первый УЖЕ передал 0 второму, и естественно, 0 и остался,
       насколько я понял, тебя этот вариант не интересует }
    if (first <> 0) and (second = 0) then begin
      { Напечатать само число, и проделать весь цикл заново, чтобы проследить решение }
      writeln; writeln('i = ', i);

      first := i;
      repeat

        write(' A: ', first div 10, first mod 10);
        second := (10 * (first mod 10) + (first div 10) +
                  (first div 10) + (first mod 10)) mod 100;
        write(' B: ', second div 10, second mod 10);
        first := (10 * (second mod 10) + (second div 10) +
                  (second div 10) + (second mod 10)) mod 100;

        { Здесь, как понятно, зацикленность не произошла, поэтому Count не увеличиваем }
      until (second = 0);
      writeln;
    end
      { иначе, если результат обработки нас не устроил, просто печатаем точку,
         чтобы показать, что программа считает, а не зависла }
    else write('.');

  end;
end.

Это имелось в виду? smile 

Автор: Demonix 19.11.2006, 15:33
volvo877, 

Именно это и было нужно! smile  В точку! Благодарю за помощь!!! smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)