
- •Министерство образования и науки российской федерации
- •Содержание
- •Лабораторная работа 1. "Одномерные массивы"
- •Пример решения задачи
- •Лабораторная работа 2. "Двумерные массивы (с использованием указателей)"
- •Пример решения задачи
- •Лабораторная работа 3. "Символьные строки. Подпрограммы"
- •Выбор варианта
- •Пример решения задачи
- •If(*s)//как только обнаружена русская буква,
- •Лабораторная работа 4. "Структуры. Файлы "
- •Примеры решения задач
- •Void input (tv *tv, int *k) //ввод массива телевизоров
- •Input(tv, &k);//ввод массива телевизоров
- •Void input (tv *tv, int *k)//чтение данных из файла
- •Input(tv, &k);//ввод массива структур из файла
- •Лабораторная работа 5. "Списки. Динамические переменные"
- •Выбор варианта
- •Пример решения задачи
- •Void vivod(stul* stack, char name[])//вывод списка в файл
- •Vivod(first,name2);//вывод результата в файл
- •Лабораторная работа 6. "Рекурсия"
- •Примеры решения задач
- •Void setleft(node*p, int X)//присоединение числа X к узлу p слева
- •Void setright(node*p, int X) //присоединение числа X к узлу p справа
- •Int max,min;//максимальное и минимальное число в дереве
- •Int numb;//искомое число
- •If (!der) puts("дерево пустое");
- •Пример использования рекурсии для проверки правильности записи арифметического выражения
- •If (fae () || *pf ) /* то есть в выражении есть ошибка,
- •109028 Москва, б. Трехсвятительский пер., 3/12.
- •113054 Москва, ул. М. Пионерская, 12.
Примеры решения задач
Задача 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();
}