Пятница, 17.05.2024, 22:30
Приветствую Вас, Гость

БИЛЕТ 30.

1) Определение типа (typedef)

Описания, в которых "класс памяти"специфицирован как TYPEDEF, не вызывают выделения памяти. вместо этого они определяют идентификаторы ,которые позднее можно использовать так, словно они являются ключевыми словами, имеющими основные или производные типы. Определяющее-тип-имя  идентификатор

Спецификатор TYPEDEF не вводит каких-либо совершенно новых типов, а только определяет синонимы для типов, которые можно было бы специфицировать и другим способом.

 

2) Рекурсивные функции

В языке "C" функции могут использоваться рекурсивно; это означает, что функция может прямо или косвенно обращаться к себе самой. Традиционным примером является печать числа в виде строки символов. Цифры генерируются не в том порядке: цифры младших разрядов появляются раньше цифр из старших разрядов, но печататься они должны в обратном порядке.

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

  PRINTD(N)    /* PRINT N IN DECIMAL */

  INT N;

  { CHAR S[10];

    INT I;

 

    IF (N < 0) {

       PUTCHAR('-');

       N = -N;

    }

    I = 0;

    DO {

       S[I++] = N % 10 + '0'; /* GET NEXT CHAR */

    } WHILE ((N /= 10) > 0); /* DISCARD IT */

    WHILE (--I >= 0)

       PUTCHAR(S[I]);

  }

Альтернативой этому способу является рекурсивное решение, когда при каждом вызове функция PRINTD сначала снова обращается к себе, чтобы скопировать лидирующие цифры, а затем печатает последнюю цифру.

 PRINTD(N)   /* PRINT N IN DECIMAL (RECURSIVE)*/

 INT N;

  ( INT I;

    IF (N < 0) {

      PUTCHAR('-');

      N = -N;

   }

   IF ((I = N/10) != 0)

      PRINTD(I);

   PUTCHAR(N % 10 + '0');

  )

Когда функция вызывает себя рекурсивно, при каждом обращении образуется новый набор всех автоматических переменных, совершенно не зависящий от предыдущего набора. Таким образом, в PRINTD(123) первая функция PRINTD имеет N = 123. Она передает 12 второй PRINTD, а когда та возвращает управление ей, печатает 3. Точно так же вторая PRINTD передает 1 третьей (которая эту единицу печатает), а затем печатает 2.

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


*************************************30 - 3

Определить самое длинное слово в тексте. Разделители между словами- символы точка, запятая, точка с запятой, пробел. Между двумя словами может быть несколько разделительных символов.


#include<conio.h>

#include<stdio.h>

char text[]="In a year instead of the promised Morrowind the company Bethesda released Battlespiare, a primitive 3D-action based on Daggerfall engine.";

int i,kol,max=0,x=0,m;

int n=sizeof(text)/sizeof(char);

void main()

{

clrscr();

for (i=0,m=0;i<n;i++)

    {

     if (text[i] == ' ' || text[i] == ',' || text[i] == '.')

            {

             if (x >= max)

                {

                 if(x > max)

                   {

                        kol=1;

                        m=i-x;

                   }

                 else

                        kol++;

                 max=x;

                }

             x=0;

            }

     else

             x++;

    }

if (x > max)

   {

    max = x;

    kol++;

   }

printf("Lenth = %d; Kol = %d;\n",max,kol);

for (i=m;i<max+m;i++)

     printf ("%c",text[i]);

getch();

}

*************************************30 - 4

Для заданного натурального числа n найти такое наименьшее число k, что к!>=n.


#include<conio.h>

#include<stdio.h>

int n=90;

int k,k_rez=1;

void main()

{

 clrscr();

 for (k = 1; k_rez < n; k++)

      k_rez *= k;

 k--;

 printf("n = %d\nk = %d\nk_rez = %d\n",n,k,k_rez);

 getch();

}