БИЛЕТ 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();
}