Главная » Статьи » Программирование » Pascal

Структурированные операторы. Turbo Pascal 7.0

Структурированные операторы (примерны можно найти на форуме)

Структурированными являются такие операторы, которые состоят из других операторов. К ним относятся:

  • Составной оператор;
  • Условный оператор If;
  • Условный оператор Case;
  • Оператор цикла For;
  • Оператор цикла While;
  • Оператор цикла Repeat.

Составной оператор

Составной оператор представляет собой группу из произвольного числа операторов, отделенных друг от друга «;» и ограниченную операторными скобками Begin и End

Формат:

Begin

    <оператор>;

    <оператор>;

          …….

    <оператор>;

End;

Например:

Begin

   A:=A*B+(N-D);

   Rez:=A+B*Pi;

   WriteLn(Rez:12:6);

End;

Условный оператор If

Оператор If  изменяет порядок выполнения операторов в зависимости от истинности или ложности некоторого условия. Существует два варианта оператора:

  1. If <условие> Then <оператор 1> Else <оператор 2>
  2. If <условие> Then <оператор>

Условие может быть простым или сложным. Сложные условия образуются с помощью логических операций AND, OR, NOT. При записи условий могут использоваться все возможные операции отношения. Результат выражения всегда имеет булевский тип (истина или ложь).

В первом варианте, если условие принимает значение "Истина", выполняется оператор 1, если условие  - "Ложь", выполняется оператор 2.

Например:

A:=2; B:=8;

If A>B Then WriteLn(‘A>B’) Else WriteLn(‘A<=B’);

Во втором варианте формата, если условие принимает значение "Истина", выполняется оператор, если условие  - "Ложь", выполняется оператор, следующий сразу за оператором If.

Например:

A:=2; B:=8: C:=0;

If A>B Then C:=A+B;

C:=C+12;

WriteLn(‘C=’,C);

(Результат выполнения программы – 12).

Один оператор If может входить в состав другого оператора If. В таком случае говорят о вложенности операторов.

Формат:

If <условие> Then

   If <условие> Then <оператор>

             Else <оператор>;

Например:

If A<20 Then

    If A>=15 Then WriteLn(‘А в диапазоне 15 - 20’)

                     Else (WriteLn(‘А в диапазоне 1 - 14’);  

Конструкцию со степенью вложенности более 2 – 3 лучше избегать из-за сложности их анализа.

Примеры:

  1. с простым оператором:

If A>B Then D:=A+B Else D:=A-B;

  1. с составным оператором:

If A<B Then Begin

                        WriteLn(‘A<B’);

                         D:=A*B;

                       End

       Else Begin

                  WriteLn(‘A>=B’);

                   D:=A/B;

                End;

  1. с использованием сложного условия:

If (A=B) And (C=D) Then Begin

                                              WriteLn(‘Норма’);

                                              F:=0;

                                            End

                                    Else Begin

                                              WriteLn(‘Превышение нормы’);

                                              F:=100;

                                            End;

 

Примеры решения задач

  1. Заданы числа X,Y, Z. Найти минимальное из трех чисел.

Var

   Mi, X,Y,Z:Integer;

BEGIN

  WriteLn(‘Введите три числа’); 

  ReadLn(X,Y,Z);

  Mi:=X;

  If Y<Mi Then Mi:=Y;

  If Z<Mi Them Mi:=Z;

  WriteLn(‘ Минимальное число=’,Mi);

END.

  1. Поменять местами значения переменных A,B,C т.о., чтобы оказалось A>B>C.

Var

  PP,A,B,C:Real;

BEGIN

  WriteLn(‘Введите три числа’); 

  ReadLn(A,B,C);

  If A<B Then Begin PP:=A; A:=B; B:=PP; End;

  If A<C Then Begin PP:=A; A:=C; C:=PP; End;

  If B<C Then Begin PP:=B; B:=C; C:=PP; End;

  WriteLn(‘A>B>C’,A,B,C);

END.

  1. Определить, верно ли, что при делении натурального числа A на натуральное число B получится остаток, равный числу C.

Var

  A,B,S:Integer;

BEGIN

  Repeat

     WriteLn(‘Введите два натуральных значения’); 

     ReadLn(A,B);

  Until (A>B) AND (B>C);

  WriteLn(‘Введите остаток’);

  ReadLn(S);

  If A MOD B = S Then

                                 WriteLn(‘остаток от деления А на В=’,S) 

                               Else

                                 WriteLn(‘остаток от деления А на В не =’,S);

END.

   

4. Даны положительные целые числа A, B, C. Выяснить существует ли треугольник с длинами сторон A, B, C.

USES Crt;

VAR

  A, B, C: INTEGER;

     BEGIN

      ClrScr;

     WriteLn('Введите три числа');

     ReadLn(A,B,C);

     IF (A+B>C) AND (A+C>B) AND (B+C>A) Then

                                                                                 WriteLn('Треугольник построить можно')

                                                                               Else

                                                                                 WriteLn('Треугольник построить нельзя');

END.

5.  Верно ли, что в числе N первая и последняя цифры одинаковы (100<=N<1000).

USES Crt;

LABEL M1;

VAR

  N,S,D,E: Integer;

BEGIN

   M1:   ClrScr;

   Write(‘Введите целое трехзначное число ’);

   ReadLn(N);

   If (N <100) OR (N>=1000) Then GoTo M1;

   {Выделение цифры в числе}

   S:=N Div100;  {сотни}

   D:=((N-S*100) Div 10;  {десятки}

   E:=N mod 10;  {единицы}

   If S=E Then

                 WriteLn(‘Первая и последняя цифры одинаковы’)

              Else

                WriteLn(‘Первая и последняя цифры не одинаковы’);

END.

Примеры для самостоятельного решения:

  1. Определить является ли данное целое число R четным. Дать словесный ответ.
  2. Дано целое положительное число N (10<=N<=99). Выяснить, верно ли, что N равно кубу суммы цифр числа N.
  3. Заданы три числа X, Y, Z. Найти min(XYZ, X+Y+Z).
  4. Даны три целых числа. Выбрать из них те, которые принадлежат интервалу [1,3]
  5. Дано целое положительное число N (N<=1000). Определить сколько цифр в этом числе.
  6. Вычислить max(min(a,b),max(c,d)).

Условный оператор Case

Оператор  Case является  обобщением оператора  If  и позволяет сделать выбор из произвольного числа имеющихся вариантов.

Формат:

Case <выражение> Of

  <список 1>:<оператор 1;>

  <список 2>:<оператор 2;>       

  ……..

  <список n>:<оператор n;>

 [ Else <оператор>]

End;

В этой структуре:

Выражение – выражение любого простого типа, кроме вещественного типа, значение которого вычисляется.

список 1, список 2,…, список n – константы, с которыми сравнивается значение выражения.

оператор 1, оператор 2,…, оператор n – операторы, из которых выполняется тот, с константой которого совпадает значение выражения.

оператор – оператор, который выполняется, если значение выражения не совпадает ни с одной из констант.

Ветвь оператора Else является необязательной. Если она отсутствует и значение выражения не совпадает ни с одной из перечисленных констант, весь оператор рассматривается как пустой. В отличие от оператора If перед словом Else точку с запятой можно ставить, хотя это и необязательно.

Примеры решения задач

  1. Выражение целочисленного типа.

Ввести номер месяца и определить месяц, соответствующий этому номеру.

Var

   X: Byte;

BEGIN

   Write(‘Введите номер месяца:’);

   ReadLn(X);

   Case X Of

      1: Write(‘Январь’);     

      2: Write(‘Февраль’);     

      3: Write(‘Март’);     

      4: Write(‘Апрель’);     

      5: Write(‘Май’);     

      6: Write(‘Июнь’);     

      7: Write(‘Июль’);     

      8: Write(‘Август’);     

      9: Write(‘Сентябрь’);     

      10: Write(‘Октябрь’);     

      11: Write(‘Ноябрь’);     

      12: Write(‘Декабрь’);     

   Else

      WriteLn(‘Такого месяца нет’);

   End;

END.

  1. Выражение интервального типа.

Ввести номер месяца и определить время года, к которому относится этот месяц.

Var

   X: Byte;

BEGIN

   Write(‘Введите номер месяца:’);

   ReadLn(X);

   Case X Of

     1..2,12: WriteLn(‘Зима’);

     3..5: WriteLn(‘Весна’);

     6..8: WriteLn(‘Лето’);

     9..11: WriteLn(‘Осень’);

   End;

END.

  1. Выражение символьного типа.

Составить программу, которая по введенному значению выводит оценки по математике, физике, химии.

USES Crt;

VAR  M:Char;

BEGIN

        ClrScr;

        WriteLn(' По какому предмету Вы хотите увидеть оценки');

        WriteLn(' М - математика');

        WriteLn(' Ф - физика');

        WriteLn(' Х - химия');

        ReadLn(M);

        CASE M OF

            'М','м':WriteLn('5 5 4 4 5 5 3 5 5 ');

            'Ф','ф':WriteLn('5 4 5 3 5 4 5 5 5 ');

            'Х','х':WriteLn('4 3 5 3 4 4 4 5 ');

        End;    

END.

Примеры для самостоятельного решения:

  1. Составить программу, которая по введенному значению 1, 2, 3 вычисляет:
  1. Площадь параллелограмма
  2. Периметр параллелограмма
  3. Выход
  1. Составить программу «Календарь XX столетия», которая определяет день недели любого дня XX-го столетия. По введенному значению 1, 2, 3 вычисляет
  1. Номер дня недели по формуле, где D- день, М-месяц, G-год:
  • S=[(12-M)/10]
  • K=[(G-1900-S)*365,25]+[(M+12*S-2)*30,59]+D+29
  • N=K-7[K/7] (N-вычисляется от 0-воскресенье до 6-суббота, []-целая часть)
  1. День недели по его номеру
  2. Выход

Оператор цикла For

Циклы позволяют многократно выполнять отдельный оператор или последовательность операторов, причем при этом нет необходимости записывать в тексте программы одинаковые операторы несколько раз.

Оператор цикла For организует выполнение одного оператора (или несколько операторов)  заранее известное число раз.  Оператор For может быть представлен в двух форматах:

  1. For <параметр цикла>:=<S1>  To <S2> Do

            <тело цикла>;

  1. For <параметр цикла>:=<S1> DownTo <S2> Do

            <тело цикла>;

<параметр цикла> - переменная цикла, которая может  быть целочисленного или символьного типа. Параметр цикла изменяется, увеличиваясь до конечного значения (1 формат). Параметр цикла может изменяться в противоположном направлении  - убывать (2 формат);

S1 – начальное значение параметра цикла, которое она получает при первом выполнении цикла;

S2 - конечное значение параметра цикла, достигнув которое повторение цикла прекращается;

For…Do – заголовок цикла;

< тело цикла > - оно может быть простым, состоящим из одного оператора или составным оператором.

Например:

For I:=1 To 20 Do Write(‘*’);

20 раз выведется на экран в одной строке «*»

Особенности выполнения оператора For

  1. Начальное и конечное значения параметра цикла должны принадлежать к одному и тому же типу данных.
  2. В операторе For  не допускается изменения параметра цикла на величину, отличную от единицы.

Например:

For I:=10 To 14 Do Write(I:3);  {Результат выполнения - V10V11V12V13V14}

For I:=14 DownTo 10 Do Write(I:3);  {Результат выполнения - V14V13V12V11V10}

  1. В операторе For после Do может находиться составной оператор, в теле которого запрещены операторы, меняющие значение параметра цикла.

Например:

For I:= 1 To 10 Do Begin

   Rez:=A/Pi;

   I:=I+1;   {ошибка, попытка изменить параметр цикла}

End;

  1. После нормального завершения оператора For значение параметра цикла равно конечному значению. Если оператор For не выполнялся, значение параметра цикла не определено.
  2. Чтобы прервать выполнение оператора For досрочно, необходимо использовать процедуру Break, которая прерывает выполнение циклов. Процедура Continue начинает новую итерацию цикла, даже если предыдущая не была завершена.

Примеры решения задач

1. Найти произведение положительных, сумму и количество отрицательных  из 10 введенных целых значений.

USES Crt;

VAR

  X: INTEGER;  S, K, P: INTEGER;    I: BYTE;

Begin

   Clrscr;   {чистка экрана}

   P:=1; S:=0; K:=0;

   FOR I:=1 TO 10 DO Begin

       WriteLn(‘Введите  ‘,I,’ -е значение’);       ReadLn(x);

       IF X>0 Then P:=P*X;    { произведение положительных }

       IF X<0 Then Begin

                               S:=S+X;  { сумма отрицательных }

                               K:=K+1; { количество отрицательных }

                             End;

   End;

   WriteLn(‘ Произведение положительных значений = ‘,p);

   WriteLn(‘ Сумма отрицательных значений = ‘,s);

   WriteLn(‘ Количество отрицательных значений = ‘,k);

END.

2. Из N целых чисел найти минимальное значение.

USES Crt;

VAR  MI, X: INTEGER;  I,N: BYTE;

BEGIN

  WriteLn('Введите количество значений');  ReadLn(n);

  WriteLn('Введите первое значение');  ReadLn(mi);

  FOR I:=2 TO N DO Begin

     WriteLn(‘Введите ‘,I,’ -е значение’);   ReadLn(x);

     IF X<MI Then MI:=X;

  End;

 WriteLn(‘Минимальное значение = ‘,MI);

END.

3. Из N целых чисел найти минимальное среди положительных и максимальное среди отрицательных значений.

USES Crt;

VAR

  MI, MA, N, I, X: INTEGER; FL, FL1: BYTE;

BEGIN

 Clrscr;

 WriteLn('Введите количество значений');  ReadLn(N);

  FL:=0; FL1:=0;

 FOR I:=1 TO N DO Begin

   WriteLn('Введите ',I,' значение');  ReadLn(X);

   IF (FL=0) AND (X<0) Then Begin

                                                    MA:=X;  FL:=1;

                                                  End;

   IF (FL1=0) AND (X>0) Then Begin

                                                       MI:=X;  FL1:=1;

                                                    End;

   IF (X<0) AND (X>MA) Then MA:=X;

   IF (X>0) AND (X<MI) Then MI:=X;

 End; 

 IF FL=1 Then WriteLn('максимальное среди отрицательных = ',ma)

               Else WriteLn('отрицательных нет');

 IF  FL1=1 Then WriteLn('минимальное среди положительных = ',mi)

                  Else WriteLn('положительных нет');

END.

Примеры для самостоятельного решения:

  1. Найти среднее арифметическое минимального и максимального элементов из 10 введенных.
  2. Найти сумму 2/3+3/4+…+n/(n+1).
  3. Из n введенных чисел найти максимальное значение среди положительных элементов.
  4. Вычислить сумму первых n слагаемых 12+22-32+42+52-62+…(каждое третье слагаемое берется со знаком «минус»).

Оператор цикла Repeat…Until

Этот оператор называется циклом с постусловием, т.к. проверка условия осуществляется после каждого выполнения тела цикла.

Формат:

Repeat

   <тело цикла>;

Until <условие>;

Условие – выражение булевского типа. При написании условия допустимы булевские операции (And, Or, Not) и операции отношения. Операторы, заключенные между словом Repeat и Until, являются телом цикла. Вначале выполняется тело цикла, затем проверяется условие выхода из цикла. Если результат выражения –False, тело цикла выполняется еще раз, если результат – True, то происходит выход из цикла.

Особенности выполнения оператора Repeat

  1. Тело цикла выполняется по крайней мере один раз, так как условие проверяется после выполнения тела цикла.
  2. Тело цикла выполняется пока условие False.
  3. В теле цикла может находиться произвольное число операторов без операторных скобок Begin …End.
  4. По крайней мере один из операторов тела цикла должен влиять на значение условия, иначе цикл буде выполняться бесконечно.

Например:

D;=1;   S:=0;

Repeat

   S:=S+D;

Until (D>100);

{бесконечный цикл}

D;=1;   S:=0;

Repeat

   S:=S+D;

   D:=D+1; {изменение переменной, влияющей на условие}

Until (D>100);

{цикл имеет завершение}

  1. Чтобы прервать выполнение оператора Repeat досрочно, необходимо использовать процедуру Break, которая прерывает выполнение циклов. Процедура Continue начинает новую итерацию цикла, даже если предыдущая не была завершена.

Примеры решения задач

  1. Составить программу ввода отрицательного числа.

Var  X:Integer;

Begin

  Repeat

    Write(‘Введите отрицательное число’);

    ReadLn(X);

    If X>=0 Then WriteLn(‘Введено неправильное число’);

  Until X<0;

End.

  1. Просуммировать натуральные числа от 1 до 50 и вывести результат вычислений на экран.

Var I,Sum:Integer;

Begin

  Sum:=0;

  I:=0;

  Repeat

    I:=I+1;

    Sum:=Sum+I;

  Until I=50;

  WriteLn(‘Сумма чисел от 1 до 50 = ’),Sum;

End.

  1. В подъезде N ступенек. Сколько шагов будет сделано, если шагать через 3 ступеньки (один шаг – три ступеньки).

Var  S, KS, N: Byte;

{S-подсчет количества ступенек, KS-количество шагов}

Begin

  S:=0; KS:=0;

  Repeat

    S:=S+3;

    KS:=KS+1;

  Until I>N;

WriteLn(‘Количество шагов= ’,KS);

End.

Примеры для самостоятельного решения:

  1. Составить программу ввода натурального числа в интервале от N до M.
  2. начав тренировки, спортсмен в первый день пробежал 10 км. Каждый следующий день он увеличивал дневную норму на 10% от нормы предыдущего дня. Какой суммарный путь пробежит спортсмен за 7 дней.

Оператор повтора While

Этот оператор называется циклом с предусловием, т.к. проверка условия осуществляется до начала очередной итерации.

Формат:

While <условие> Do

    <тело цикла>;

Цикл выполняется, пока условие истинно. Как только условие нарушается, выполнение цикла завершается

Особенности выполнения оператора While

  1. Так как условие проверяется до начала выполнения тела цикла,  цикл может ни разу не выполнится.
  2. Тело цикла выполняется пока условие True.
  3. По крайней мере один из операторов тела цикла должен влиять на значение условия, иначе цикл буде выполняться бесконечно.

В ряде случаев возникает необходимость в бесконечном цикле. Тогда в условии записывается константа True или условие, которое имеет значение True.

Например:

While True Do Write(‘Бесконечный цикл’);

While 1=1 Do Write(‘Бесконечный цикл’);

Примеры решения задач

1.  Дано  целое  число а и натуральное (целое неотрицательное) число n. Вычислить а в степени n. {Введем целую переменную k, которая меняется от  0 до  n,  причем  поддерживается такое свойство: b = (a в степени k).}

USES Crt;

VAR

   A, N, B, K : INTEGER;

BEGIN

  ClrScr;

  Write(‘ Введите два значения   ‘);  ReadLn(A,N);

  K := 0; B := 1;

  While K <> N DO Begin

      K := K + 1;   B := B * A;

  End;

  Write(‘ A в степени N = ’,B);

END.

2.  Даны натуральные числа а, b. Вычислить произведение а*b, используя в программе лишь операции +, -, =, <>.

USES Crt;

VAR

   A, B, C, K : INTEGER;

BEGIN

  Write(‘ Введите два значения ‘);   ReadLn(A,B);

   K := 0; C := 0;

   While K <> B DO Begin

      K := K + 1;   C := C + A;

   End;

   {C = A * K и K = B, следовательно, C = A * B}

   Write(‘ A*B= ‘,C);

END.

3. Вычислить значение переменной Y=2K+N при всех значениях переменных N=1,2,3 и K=2,4,6,8. обратите внимание на то, что если перебирать N и K  получим 12 значений переменной Y.

Var N,K,Y: Integer;

Begin

  For N:=1 To 3 Do Begin

    K:=2;

    While K<=8 Do Begin

       Y:=2*K+N;

       WriteLn(‘При N= ’,N:4,’ и K= ’,K:4,’  Y= ’Y:4);

       K:=K+2;

    End;

  End;

End.

4.  Составить программу перевода числа из 10 системы счисления в 2 систему счисления.

Для этой задачи представлено два решения.

USES Crt;

VAR

   DES, OST, I, DW:INTEGER;

BEGIN

  ClrScr;

  Write('Введите десятичное число  '); ReadLn(DES);

  I:=1;

  While (DES>=2) DO Begin

      OST:=DES mod 2;

      DES:=DES div 2;

      DW:=DW+OST*I;

      I:=I*10;

  End;

  DW:=DW+DES*I;

  Write('Двоичная запись числа  ',DW);

END.

Примеры для самостоятельного решения:

1.К старушке на обед ходят кошки. Каждую неделю две кошки приводят свою подружку. В доме у старушки 100 мисок. Через какое время появятся лишние кошки, и сколько кошек при этом останется голодными.

2.Известна сумма номеров страниц, определить номер страницы.

3.Лягушка каждый последующий прыжок делает в два раза короче предыдущего. Достигнет ли она болота и за сколько прыжков. Длину первого прыжка задайте самостоятельно.

Вложенные циклы

Для решения задачи достаточно часто требуется использовать две и более циклические конструкции, одна из которых расположена внутри другой (других). Такие конструкции называются вложенными циклами. Какие именно циклы при этом используются, роли не играет, они могут быть организованы посредством любых рассмотренных ранее операторов (For, While, Repeat … Until).

Примеры решения задач

1. Даны натуральные числа n и k. Составить программу вычисления выражения

1k + 2k + … + nk

Для вычисления указанной суммы целесообразно использовать оператор For с управляющей переменной I, изменяющейся от 1 до n. В теле цикла вычисляется очередное значение y=Ik и накапливается искомая сумма s=s+y.

Var   n, k, y, I, s, j:    Integer;

Begin

     WriteLn (‘Введите n и k ‘);

      ReadLn (n, k);

      s: = 0;

      For i: = 1 To n Do Begin

         y: = 1;

         For j: = 1  To k Do y: = y*i;

          s: = s + y

       End;

       WriteLn (‘Сумма: ‘ , s)

End.

 

2. Сложим все цифры какого-либо числа. Получим новое число, равное сумме всех цифр исходного числа. Продолжим этот процесс до тех пор, пока не получим однозначное число (цифру). Оно называется цифровым корнем исходного числа. Например, цифровой корень числа 34697 равен 2(3+4+6+9+7=29; 2+9=11; 1+1=2). Составьте программу нахождения цифрового корня натурального числа.

Var   n, k, s: LongInt;

Begin

     WriteLn (‘Введите число‘); ReadLn (n);

      s: = n;

     While s>9 Do Begin

         k : = s ; s : = 0;

         Repeat

            s : = s + k mod 10;

            k : = k div 10

         Until k = 0

      End;

      WriteLn (‘Цифровой корень числа ‘,n,’ равен ‘,s)

End.

3. Старинная задача. Сколько можно купить быков, коров и телят, если бык стоит 10 рублей, корова – 5 рублей, теленок – полтинник (0,5 рубля), при условии, что на 10 рублей надо купить 100 голов скота.

 Решение: обозначим через b – количество быков, k – количество коров, t – количество телят. После  этого можно записать два уравнения:

10b + 5 k + 0,5t = 100       и       b + k + t = 100

Преобразуем их:

20b + 10k + t = 200        и        b + k + t = 100

 

На 100 рублей можно купить:

  • не более 10 быков, т.е. 0 ≤ b ≤ 10,
  • не более 20 коров, т.е.  0 ≤ k ≤ 20,
  • не более 200 телят, т.е. 0 ≤ t ≤ 200.

Таким образом, получаем:

 

Var   b, k, t:  Integer;

Begin

    For b: = 0 To 100 Do

      For k: = 0 To   20 Do

        For t: = 0 To   200 Do

          If   (20*b+10*k+t=200) and (b+k+t=100) Then

           WriteLn ( ‘быков ‘ ,b, ‘ коров ‘ ,k, ‘ телят ‘ ,t)

End.

Сколько раз будет проверяться условие в данной программе (сколько раз будет выполняться оператор If)? Переменная b принимает 11 различных значений (от 0 до 10), для каждого значения переменной b переменная k изменяется от 0 до 20, а для каждого значения переменной k переменная t изменяется от 0 до 200.

Таким образом, условие будет проверяться 11 · 21 · 201 = 46431 раз. Но если известно количество быков и коров, то количество телят можно вычислить по формуле

t = 100 – (b + k)

и цикл по переменной t можно исключить.

 Program My 9_3;

  Var   b, k, t:  Integer;

  Begin

    For b: = 0 To 100 Do

      For k: = 0 To   20 Do   Begin

        t: = 100 – (b + k) ;

        If   (20*b+10*k+t=200) Then WriteLn ( ‘быков ‘ ,b, ‘ коров ‘ ,k, ‘ телят ‘ ,t)

    End     

End.

В этой программе условие повторяется 11 · 21 = 231 раз. Попробуйте еще уменьшить количество проверок.

4. Написать программу, которая находит все четырехзначные числа abcd (a, b, c, d – цифры числа, причем все они различны), для которых выполняется условие:

ab – cd = a + b + c + d

Другими словами, разность чисел, составленных из старших цифр числа и из младших, должна быть равна сумме цифр числа.

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

10 · a + b – (10 · c + d) = a + b + c + d

получаем

9 · (a – c ) = 2 · (c + d)

или                                                    (a – c) / (c + d) = 2 / 9,

a = c + 2, d = 9 – c  и  0 ≤ c ≤ 7.

 

Var   a, b, c, d:  Integer;

Begin

    For c: = 0 To 7 Do Begin

      a: = c + 2; d: = 9 - c;

      For b: = 0 To 9 Do

        If   (b<>c) and (b<>a) and (b<>d)   Then   WriteLn (a, b, c, d)

   End     

End.

5. Дано натуральное число, кратное 3. Найдем сумму кубов цифр данного числа. Получим новое число. Применим к нему такое же преобразование и т.д. Оказывается, что любая последовательность чисел сходится к числу 153.

Program My 9_5;

  Var   n, m, t, s, q:   LongInt;

  Begin

    WriteLn (‘Введите число, оно умножается на 3, далее для полученного

                  числа строится последовательность ‘);

      ReadLn (n);

      m: = 3 * m; Write (m, ‘  ‘ );

      Repeat

         s : = 0; t : = m;

         While m > 0 Do Begin

            q: = m mod 10;

            s: = s + q * q * q;

            m: = m div 10

          End;

          m: = s;

          Write (m, ‘  ‘ )

      Until m = t;

      ReadLn

End.

Категория: Pascal | Добавил: Алексей (18.10.2014) | Автор: Фролов Алексей E
Просмотров: 1797 | Теги: pascal, программирование, turbo | Рейтинг: 0.0/0
Всего комментариев: 0
avatar