9 мая 2015 г.

Сортировка вставками

template <class T>
void insertSort(T a[], long size)
{
T x;
long i, j;

for(i=0;i<size;i++)
{
x=a[i];
for (j=i-1;j>=0&&a[j]>x;j--)
a[j+1]=a[j];
a[j+1] = x;
}
}

void main()
{
srand(time(NULL));
const long size=10;
int ar[size];
for(int i=0;i<size;i++)
{
ar[i]=rand()%100;
cout<<ar[i]<<"\t";
}
cout<<"\n\n";
insertSort(ar,size);

for(int i=0;i<size;i++)
{
cout<<ar[i]<<"\t";
}
cout<<"\n\n";
}

Оптимизированная сортировка вставками

template <class T>
void setMin(T a[],long size)
{
T min=a[0];
for(int i=1;i<size;i++)
if(a[i]<min)
min=a[i];
a[0]=min;
}

template <class T>
void insertSortGuarded(T a[], long size)
{
T x;
long i, j;
T backup = a[0];
setMin(a,size); 

for(i=1;i<size;i++){
x = a[i];
for (j=i-1;a[j]>x;j--)
a[j+1]=a[j];
a[j+1] = x;
}

for(j=1;j<size&&a[j]<backup;j++)
a[j-1]=a[j];
a[j-1] = backup;
}

void main()
{
srand(time(NULL));
const long SIZE=10;
int ar[SIZE];
for(int i=0;i<SIZE;i++)
{
ar[i]=rand()%100;
cout<<ar[i]<<"\t";
}
cout<<"\n\n";
insertSortGuarded(ar,SIZE);

for(int i=0;i<SIZE;i++)
{
cout<<ar[i]<<"\t";
}
cout<<"\n\n";
}

Оптимизированная "Пузырьковая" cортировка или "шейкер-сортировка"

template <class T>
void shakerSort(T a[], long size)
{
long j, k=size-1;
long lb=1, ub=size-1;
T x;

do
{
for(j=ub;j>0;j--)
{
if(a[j-1]>a[j])
{
x=a[j-1];
a[j-1]=a[j];
a[j]=x;
k=j;
}
}
lb = k+1;
for(j=1;j<=ub;j++)
{
if(a[j-1]>a[j])
{
x=a[j-1];
a[j-1]=a[j];
a[j]=x;
k=j;
}
}
ub=k-1;
}while (lb<ub);
}

void main()
{
srand(time(NULL));
const long SIZE=10;
int ar[SIZE];

for(int i=0;i<SIZE;i++)
{
ar[i]=rand()%100;
cout<<ar[i]<<"\t";
}
cout<<"\n\n";
shakerSort(ar,SIZE);

for(int i=0;i<SIZE;i++)
{
cout<<ar[i]<<"\t";
}
cout<<"\n\n";
}

Сортировка выбором

template <class T>
void selectSort(T a[], long size)
{
long i, j, k;
T x;
for(i=0;i<size;i++) {
k=i;
x=a[i];
for(j=i+1;j<size;j++) {
if(a[j]<x){
k=j;
x=a[j];
}
}
a[k]=a[i];
a[i]=x;
}
}

void main()
{
srand(time(NULL));
const long SIZE=10;
int ar[SIZE];
// до сортировки
for(int i=0;i<SIZE;i++)
{
ar[i]=rand()%100;
cout<<ar[i]<<"\t";
}
cout<<"\n\n";
selectSort(ar,SIZE);
// после сортировки
for(int i=0;i<SIZE;i++)
{
cout<<ar[i]<<"\t";
}
cout<<"\n\n";
}

6 мая 2015 г.

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

double des(double digit, int znak);

void main()
{
setlocale(LC_ALL, "Russian");
double digit;
do
{
cout << "Эта программа округляет указанное вещественное число с заданной точностью.\n";
cout << "Пожалуйста, введите число: ";
cin >> digit;
cout << "\nВведите количество знаков после десятичной точки, которые должны остаться: ";
int znak;
cin >> znak;
cout << "Ваше новое число - " << des(digit, znak) << "\n\n";
cout << "Если хотите продолжить, нажмите 1:";
cin >> digit;
} while (digit == 1);
}

double des(double digit, int znak)
{
int tmp = digit;//отделяем целую часть
digit -= tmp;//отделяем дробную часть
int tmp_znak = znak;
while (tmp_znak!=0)
{
digit *= 10;
tmp_znak--;
}
double drob = (int)digit;
while (znak!=0)
{
drob /= 10;
znak--;
}
return (double)tmp + drob;
}

Написать перегруженные шаблоны функций для нахождения корней линейного (a*x + b = 0) и квадратного (a*x2+b*x + c = 0) уравнений. Замечание: в функции передаются коэффициенты уравнений.

int lin(int a, int b);
double lin(double a, double b);
void kv(double a, double b, double c);

void main()
{
setlocale(LC_ALL, "Russian");
int tmp;
do
{
double a, b, c;
//int a, b, c;
cout << "Эта программа находит корни линейного (a*x + b = 0)\nи квадратного (a*x2 + b*x + c = 0) уравнений.\n";
cout << "Какое уравнение решаем:\n1 - линейное\n2-квадратное\n";
cin>>tmp;
switch (tmp)
{
case 1:
cout << "Введите коэффициент a - ";
cin >> a;
cout << "Введите коэффициент b - ";
cin >> b;
cout << "Ответ: x=" << lin(a, b)<<"\n";
break;
case 2:
cout << "Введите коэффициент a - ";
cin >> a;
cout << "Введите коэффициент b - ";
cin >> b;
cout << "Введите коэффициент c - ";
cin >> c;
kv(a, b, c);
break;
}
cout << "Если хотите продолжить, нажмите 1:";
cin >> tmp;
} while (tmp == 1);
}

int lin(int a, int b)
{
double res;
res = (-b) / a;
return res;
}

double lin(double a, double b)
{
double res;
res = (-b) / a;
return res;
}

void kv(double a, double b, double c)
{
double x1, x2, d;
d = (b*b) - (4 * a * c);
if (d > 0)
{
x1 = ((-b) + sqrt(d)) / (2 * a);
x2 = ((-b) - sqrt(d)) / (2 * a);
cout << "Ответ: x1=" << x1 << "\n";
cout << "Ответ: x2=" << x2 << "\n";
}
else if (d < 0)
{
cout << "Нет корней\n";
}
else if (d == 0)
{
x1 = ((-b) + sqrt(d)) / (2 * a);
cout << "Ответ: x1=" << x1 << "\n";
}
}

Написать шаблон функции для поиска среднего арифметического значений массива.

template <typename tip> void init(tip A[], int size);
template <typename tip> void out(tip A[], int size);
template <typename tip> double sr(tip A[], int size);

void main()
{
setlocale(LC_ALL, "Russian");
int a;
do
{
cout << "Эта программа находит среднее арифметическое в массиве.\n";
const int size = 10;
int arr[size];
init(arr, size);
out(arr, size);
cout << "Среднее арифметическое массива равно " << sr(arr, size) << "\n";
cout << "Если хотите продолжить, нажмите 1:";
cin >> a;
} while (a == 1);
}

template <typename tip> void init(tip A[], int size)
{
srand(time(NULL));
for (int i = 0; i < size; i++)
{
A[i] = rand() % 10000 / (100 * 1.0);
}
}

template <typename tip> void out(tip A[], int size)
{
cout << "\n";
for (int i = 0; i < size; i++)
{
cout << A[i] << " ";
}
cout << "\n";
}

template <typename tip> double sr(tip A[], int size)
{
double res = 0;
for (int i = 0; i < size; i++)
{
res += A[i];
}
res /= size;
return res;
}