Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по лабораторным работам Программирование СИ.DOC
Скачиваний:
44
Добавлен:
20.05.2014
Размер:
439.81 Кб
Скачать
    1. Примеры решения задач

Задача 6.1. Подсчитать число размещений A(k, r) по формуле

A(k, r) = k! / (k - r)! при k r, где n! = 1 при n = 0, n! = (n-1)! n при n 1.

#include <stdio.h>

int fakt(int n)

{if (n==0) return 1;

return fakt(n-1)*n;

}

void main()

{int k,r;

do printf("введите k,r (k>=r)\n");

while ((scanf("%d%d",&k,&r))!=2||k<r);

//scanf возвращает число успешно прочитанных аргументов

printf("a=%d",(int)fakt(k)/fakt(k-r));//результат приведен к типу int

}

Задача 6.2. Найти в бинарном дереве число, наиболее удаленное от среднего арифметического минимума и максимума.

#include <stdio.h>

#include <alloc.h>

#include <conio.h>

#include <ctype.h>

#include<math.h>

#define NODE struct node

NODE

{int info;

NODE *left,*right;};

NODE *newn(int x) //создание нового узла, с числом x в поле данных

{NODE *uk;

uk=(NODE*) malloc(sizeof(NODE));//выделение памяти

uk->info=x;//запись числа в поле данных

uk->left=uk->right=NULL;//указатели на левого и правого сына = NULL

return(uk);

}

Void setleft(node*p, int X)//присоединение числа X к узлу p слева

{p->left=newn(x);}

Void setright(node*p, int X) //присоединение числа X к узлу p справа

{p->right=newn(x);}

NODE *form()//формирование дерева

{ int n;

NODE *der=NULL,*next,*tek;//указ. на корень, текущий и следующий

puts("введите данные//конец ввода - буква");

if(scanf("%d",&n)==1)//если данные успешно считаны

{ der=newn(n);//формирование корня

while(scanf("%d",&n)==1)//пока есть данные

{ next=tek=der;

while (next!=NULL)//поиск узла, к которому подключаем n

{ tek=next;

if (n<tek->info) next=tek->left;

else next=tek->right;

}

if(n<tek->info) setleft(tek,n);//присоединение слева или справа

else setright(tek,n);

}

}return der;

}

//вывод дерева на экран в виде дерева при прямом обходе

void printder(NODE *der,int x, int y, int d)

{ if (! der ) return;

gotoxy(x,y);//курсор помещается на знакоместо с коорд. (x,y)

printf("%d",der->info);//печать числа

if (der->left)//обход левого поддерева (если оно не пустое)

printder(der->left,x-d,y+2,d/2);

if (der->right)//обход правого поддерева (если оно не пустое)

printder(der->right,x+d,y+2,d/2);

}

//глобальные переменные

Int max,min;//максимальное и минимальное число в дереве

float srar,rmax=-1e38;//среднее арифметическое чисел дерева

// и максимальное расстояние от числа до среднего

Int numb;//искомое число

//поиск max для прямого обхода дерева

void searchmax(NODE *der)

{if(der==NULL)

return;

if(der->info>max)

max=der->info;

searchmax(der->left);//можно опустить

searchmax(der->right);

}

//поиск числа, наиболее удаленного от среднего арифметического

//min и max при прямом обходе дерева

void search(NODE *der)

{if(der==NULL) return;//тривиальный случай

if(fabs((der->info)-srar)>rmax)

rmax=fabs((der->info)-srar),

numb=der->info;

search(der->left);

search(der->right);

}

void main()

{ NODE *der,*tek;

clrscr();

puts("Создание дерева\n");

der=form();

If (!der) puts("дерево пустое");

else

{printder(der,40,4,20);

max=-32768; searchmax(der);//поиск max с использованием рекурсии

printf("\nmax %d",max);

min=der->info;//поиск min без использования рекурсии при условии //того, что дерево сформировано так, что числа, меньшие корня,

//размещаютя в левом поддереве, а остальные – в правом

while (tek->left) tek=tek->left,

min=der->info;

printf("\nmin %d",min);

srar=(min+max)/2;

search(der);

printf("\nnumb %d",numb);

}getch();

}