21 мая 2015 г.

"Ханойские" башни.

/*
Легенда гласит, что где-то в Ханое находится храм, в котором размещена следующая конструкция:
на основании укреплены 3 алмазных стержня, на один из которых при сотворении мира Брахма
нанизал 64 золотых диска с отверстием посередине, причем внизу оказался самый большой диск,
на нем – чуть меньший и так далее, пока на верхушке пирамиды не оказался самый маленький диск.
Жрецы храма обязаны перекладывать диски по следующим правилам:

1. За один ход можно перенести только один диск.

2. Нельзя класть больший диск на меньший.

Руководствуясь этими нехитрыми правилами, жрецы должны перенести исходную пирамиду с 1-го стержня на 3-й.
Как только они справятся с этим заданием, наступит конец света.

Мы предлагаем Вам решить данную задачу с помощью рекурсии.
*/

//Решение взято с vk.com.

void hanoi_towers(int quantity, int from, int to, int buf_peg)
//quantity-число колец, from-начальное положение колец(1-3),to-конечное положение колец(1-3)
{
//buf_peg - промежуточный колышек(1-3)
if (quantity != 0)
{
hanoi_towers(quantity-1, from, buf_peg, to);

cout << from << " -> " << to << "\n";
hanoi_towers(quantity-1, buf_peg, to, from);
}
}

void main()
{
setlocale(LC_ALL, "Russian");
int start_peg, destination_peg, buffer_peg, plate_quantity;
cout << "\nНомер первого столбика:";
cin >> start_peg;
cout << "\nНомер конечного столбика:";
cin >> destination_peg;
cout << "\nНомер промежуточного столбика:";
cin >> buffer_peg;
cout << "\nКоличество дисков:";
cin >> plate_quantity;
cout<<"\n";

hanoi_towers(plate_quantity, start_peg, destination_peg, buffer_peg);
}

Написать функцию, которая находит максимальное значение в массиве, используя рекурсию

int max(int A[], int size)
{
if(size==1) return A[0];
else
{
int tmp=max(A,size-1);
return tmp>A[size-2]?tmp:A[size-2];
}
}

void init(int A[], int size)
{
srand(time(NULL));
for (int i = 0; i < size; i++)
A[i] = rand() % 20+1;
}

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

void main()
{
setlocale(LC_ALL, "Russian");
int digit;
const int size=15;
int A[size];

do
{
cout<<"Эта программа находит максимальное значение в массиве, используя рекурсию\n";
init(A,size);
out(A,size);
cout<<"\nМаксимальное значение - "<<max(A,size)<<"\n";
cout<<"Если хотите продолжить, нажмите 1:";
cin>>digit;
}while(digit==1);
}

Пример на рекурсию

long int Fact(long int N)
{
// если произведена попытка вычислить факториал нуля
// или единицы - вернуть 1,
// именно здесь произведется выход из рекурсии
if (N == 1 || N == 0) return 1;
// любое другое число вызывает функцию заново с формулой N-1
else return N * Fact(N-1);
}

void main()
{
long number=5;
//первый вызов рекурсивной функции
long result=Fact(number);
cout<<"Result "<<number<<"! is - "<<result<<"\n";
}

Двоичный поиск

int BinarySearch (int A[], int Lb, int Ub, int Key)
{
int M;
while(1)
{
M = (Lb + Ub)/2;
if (Key < A[M])
Ub = M - 1;
else
if (Key > A[M])
Lb = M + 1;
else
return M;

if (Lb > Ub)
return -1;
}
}

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

// до сортировки
for(int i=0;i<SIZE;i++)
{
ar[i]=rand()%100;
cout<<ar[i]<<"\t";
}
cout<<"\n\n";
cout<<"Enter any digit:";
cin>>key;
ind=BinarySearch(ar,0,SIZE,key);
cout<<"Index - "<<ind<<"\t";
cout<<"\n\n";
}

Написать функцию, которая упорядочит в массиве сначала чётные значения, а потом нечётные

void init(int A[], int size);
void out(int A[], int size);
void sort(int A[], int size);

void main()
{
setlocale(LC_ALL, "Russian");
const int s = 20;
int A[s];
int a;
do
{
cout << "Эта программа сортирует массив по возрастанию сначала чётные значения, а потом нечётные.\n";
init(A, s);
out(A, s);
sort(A, s);
cout << "\nРезультат:\n";
out(A, s);
cout << "\nЕсли хотите продолжить, нажмите 1\n";
cin >> a;
} while (a == 1);
}

void init(int A[], int size)
{
srand(time(NULL));
for (int i = 0; i < size; i++)
A[i] = rand() % 100;
}

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

void sort(int A[], int size)
{
int x, i, j;
for (i = 0; i < size; i++)
{
for (j = size - 1; j > i; j--)
{
if (A[j-1]%2 != 0 && A[j]%2==0)
{
x = A[j - 1];
A[j - 1] = A[j];
A[j] = x;
}
if (A[j - 1] > A[j] && A[j] % 2 == 0 && A[j - 1] % 2 == 0)
{
x = A[j - 1];
A[j - 1] = A[j];
A[j] = x;
}
if (A[j - 1] > A[j] && A[j] % 2 && A[j - 1] % 2)
{
x = A[j - 1];
A[j - 1] = A[j];
A[j] = x;
}
}
}
}

"Угадай число". Компьютер загадывает число от 0 до 10000. А пользователь должен его угадать, получая подсказки "больше" или "меньше"

void main()
{
srand(time(NULL));
setlocale(LC_ALL, "Russian");
int tmp;
do
{
int digit = rand() % 10000;
cout << "Игра ""Угадай число"". Компьютер загадал число от 0 до 10000 - отгадайте его!)\n";
int a=0;
for (;;)
{
cin >> tmp;
if (digit > tmp)
cout << "Моё число больше!)\n";
else if (digit < tmp)
cout << "Моё число меньше!)\n";
else if (digit == tmp)
{
cout << "Вы угадали!) Моё число - " << digit << "\n";
cout << "Вы использовали " << a << " попыток\n" ;
break;
}
a++;
}
cout << "\nЕсли хотите продолжить, нажмите 1\n";
cin >> tmp;
} while (tmp == 1);
}

Написать функцию, которая сортирует двумерный массив

void init(int A[][10], int weight, int length);
void out(int A[][10], int weight, int length);
void sort(int A[][10], int weight, int length);

void main()
{
setlocale(LC_ALL, "Russian");
const int length = 10;
const int weight = 15;
int A[weight][length];
int a;
do
{
cout << "Эта программа сортирует двумерный массив.\n";
init(A, weight, length);
out(A, weight, length);
sort(A, weight, length);
cout << "\nРезультат:\n";
out(A, weight, length);
cout << "\nЕсли хотите продолжить, нажмите 1\n";
cin >> a;
} while (a == 1);
}

void init(int A[][10], int weight, int length)
{
srand(time(NULL));
for (int i = 0; i < weight; i++)
{
for (int j = 0; j < length; j++)
{
A[i][j] = rand() % 100;
}
}
}

void out(int A[][10], int weight, int length)
{
cout << "\n";
for (int i = 0; i < weight; i++)
{
for (int j = 0; j < length; j++)
{
cout << A[i][j] << "\t";
}
cout << "\n";
}
cout << "\n";
}

void sort(int A[][10], int weight, int length)
{
int x, i, j, k;
for (k = 0; k < weight*length; k++)
{
for (i = 0; i < weight; i++)
{
for (j = 0; j < length; j++)
{
if (A[i][j-1] > A[i][j])
{
x = A[i][j-1];
A[i][j-1] = A[i][j];
A[i][j] = x;
}
}
}
}
}

Написать функцию, которая сортирует в двумерном массиве каждую строку по отдельности

void init(int A[][10], int weight, int length);
void out(int A[][10], int weight, int length);
void sort(int A[][10], int weight, int length);

void main()
{
setlocale(LC_ALL, "Russian");
const int length = 10;
const int weight = 15;
int A[weight][length];
int a;
do
{
cout << "Эта программа сортирует в двумерном массиве каждую строку по отдельности.\n";
init(A, weight, length);
out(A, weight, length);
sort(A, weight, length);
cout << "\nРезультат:\n";
out(A, weight, length);
cout << "\nЕсли хотите продолжить, нажмите 1\n";
cin >> a;
} while (a == 1);
}

void init(int A[][10], int weight, int length)
{
srand(time(NULL));
for (int i = 0; i < weight; i++)
{
for (int j = 0; j < length; j++)
{
A[i][j] = rand() % 100;
}
}
}

void out(int A[][10], int weight, int length)
{
cout << "\n";
for (int i = 0; i < weight; i++)
{
for (int j = 0; j < length; j++)
{
cout << A[i][j] << "\t";
}
cout << "\n";
}
cout << "\n";
}

void sort(int A[][10], int weight, int length)
{
int x, i, j, k;
for (k = 0; k < weight; k++)
{
for (i = 0; i < length; i++)
{
for (j = length - 1; j > i; j--)
{
if (A[k][j - 1] > A[k][j])
{
x = A[k][j - 1];
A[k][j - 1] = A[k][j];
A[k][j] = x;
}
}
}
}
}

Написать функцию, которая сортирует в двумерном массиве каждый столбец по отдельности

void init(int A[][10], int weight, int length);
void out(int A[][10], int weight, int length);
void sort(int A[][10], int weight, int length);

void main()
{
setlocale(LC_ALL, "Russian");
const int length = 10;
const int weight = 15;
int A[weight][length];
int a;
do
{
cout << "Эта программа сортирует в двумерном массиве каждый столбец по отдельности.\n";
init(A, weight, length);
out(A, weight, length);
sort(A, weight, length);
cout << "\nРезультат:\n";
out(A, weight, length);
cout << "\nЕсли хотите продолжить, нажмите 1\n";
cin >> a;
} while (a == 1);
}

void init(int A[][10], int weight, int length)
{
srand(time(NULL));
for (int i = 0; i < weight; i++)
{
for (int j = 0; j < length; j++)
{
A[i][j] = rand() % 100;
}
}
}

void out(int A[][10], int weight, int length)
{
cout << "\n";
for (int i = 0; i < weight; i++)
{
for (int j = 0; j < length; j++)
{
cout << A[i][j] << "\t";
}
cout << "\n";
}
cout << "\n";
}

void sort(int A[][10], int weight, int length)
{
int x, i, j, k;
for (k = 0; k < length; k++)
{
for (i = 0; i < weight; i++)
{
for (j = weight - 1; j > i; j--)
{
if (A[j - 1][k] > A[j][k])
{
x = A[j - 1][k];
A[j - 1][k] = A[j][k];
A[j][k] = x;
}
}
}
}
}

Быстрая сортировка

template <typename T>
void quickSortR(T a[], int B, int E)
{
long i = B, j = E;
T temp, p;
p = a[(B+E)/2];
do
{
while ( a[i] < p ) i++;
while ( a[j] > p ) j--;
if (i <= j)
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
i++;
j--;
}
}while ( i<=j );
if(B<j)quickSortR(a, B, j);
if(i<E)quickSortR(a, i, E);
}

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";
quickSortR(ar,0,SIZE-1);
// после сортировки
for(int i=0;i<SIZE;i++){
cout<<ar[i]<<"\t";
}
cout<<"\n\n";
}

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

int summ(int a, int b)
{
return (a==b)?b:a + summ(a+1,b);
}

void main()
{
setlocale(LC_ALL, "Russian");
int begin, end;
do
{
cout<<"Эта программа считает сумму чисел в заданном диапазоне\n";
cout<<"\nВведите начало диапазона:";
cin>>begin;
cout<<"\nВведите конец диапазона:";
cin>>end;
cout<<"Сумма от "<<begin<<" до "<<end<<" равна "<<summ(begin,end)<<"\n";
cout<<"Если хотите продолжить, нажмите 1:";
cin>>begin;
}while(begin==1);
}

12 мая 2015 г.

Дан массив из 20 целых чисел со значениями от 1 до 20. Необходимо: - написать функцию, разбрасывающую элементы массива произвольным образом; - создать случайное число из того же диапазона и найти позицию этого случайного числа в массиве; - отсортировать элементы массива, находящиеся слева от найденной позиции по убыванию, а элементы массива, находящиеся справа от найденной позиции по возрастанию.

void init(int A[], int size);
void out(int A[], int size);
void random(int A[], int size);
int search(int A[], int size, int digit);
void sort(int A[], int size, int key);

void main()
{
setlocale(LC_ALL, "Russian");
const int s = 20;
int A[s];
int a, digit,tmp;

do
{
init(A, s);
out(A, s);
cout << "\nЭта программа принимает массив из 20 целых чисел со значениями от 1 до 20:\n";
cout << "1 - разбрасывает элементы массива произвольным образом.\n";
cout << "2 - Пользователь вводит случайное число из того же диапазона, программа находит позицию этого числа в массиве\n";
cout << " и сортирует элементы массива, находящиеся слева от найденной позиции по убыванию, а элементы массива,\n";
cout << " находящиеся справа от найденной позиции по возрастанию\n";
cout << "Введите ваш выбор: ";
cin >> a;
switch (a)
{
case 1:
random(A, s);
out(A, s);
case 2:
cout << "Введите число из диапазона от 1 до 20:";
cin>>digit;
tmp = search(A, s, digit);
if (tmp != -1)
{
cout << "Число " << digit << " есть в массиве под номером " << tmp << "\n";
sort(A, s, tmp);
out(A, s);
}
else
cout << "Число " << digit << " отсутствует в массиве\n";
}
cout << "\nЕсли хотите продолжить, нажмите 1\n";
cin >> a;
} while (a == 1);
}

void init(int A[], int size)
{
srand(time(NULL));
for (int i = 0; i < size; i++)
A[i] = rand() % 20+1;
}

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

void random(int A[], int size)
{
int x, i, j;

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

int search(int A[], int size, int digit)
{
for (int i = 0; i<size; i++)
if (A[i] == digit)
return i;
return -1;
}

void sort(int A[], int size, int key)
{
int x, i, j;
for (i = 0; i<key; i++)
{
x = A[i];
for (j = i - 1; j >= 0 && A[j]<x; j--)
A[j + 1] = A[j];
A[j + 1] = x;
}
for (i = key+1; i<size; i++)
{
x = A[i];
for (j = i - 1; j >= key+1 && A[j]>x; j--)
A[j + 1] = A[j];
A[j + 1] = x;
}
}

Дан массив чисел размерностью 10 элементов. Написать функцию, которая сортирует массив по возрастанию или по убыванию, в зависимости от третьего параметра функции. Если он равен 1, сортировка идет по убыванию, если 0, то по возрастанию. Первые 2 параметра функции - это массив и его размер, третий параметр по умолчанию равен 1.

void init(int A[], int size);
void out(int A[], int size);
void sort(int A[],int size,int uk);

void main()
{
setlocale(LC_ALL, "Russian");
const int s=10;
int A[s];
int a;
do
{
cout << "Эта программа сортирует массив по возрастанию или по убыванию.\n";
init(A, s);
out(A, s);
cout<<"1 - по убыванию\n0 - по возрастанию\n";
cin>>a;
if(a!=0)
sort(A,s,1);
else
sort(A,s,a);
cout<<"\nРезультат:\n";
out(A, s);
cout << "\nЕсли хотите продолжить, нажмите 1\n";
cin >> a;
} while (a == 1);
}

void init(int A[], int size)
{
srand(time(NULL));
for (int i = 0; i < size; i++)
A[i] = rand() % 100;
}

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

void sort(int A[],int size,int uk=1)
{
int x, i, j;
if(uk==0)
{
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;
}
}
else if(uk==1)
{
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;
}
}
}

Дан массив случайных чисел в диапазоне от -20 до +20. Необходимо найти позиции крайних отрицательных элементов (самого левого отрицательного элемента и самого правого отрицательного элемента) и отсортировать элементы, находящиеся между ними.

void init(int A[], int size);
void out(int A[], int size);
void sort(int A[],int size);

void main()
{
setlocale(LC_ALL, "Russian");
const int s=20;
int A[s];
int a;
do
{
cout << "Эта программа сортирует массив между позициями крайних отрицательных элементов.\n";
init(A, s);
out(A, s);
sort(A, s);
out(A, s);
cout << "\nЕсли хотите продолжить, нажмите 1\n";
cin >> a;
} while (a == 1);
}

void init(int A[], int size)
{
srand(time(NULL));
for (int i = 0; i < size; i++)
A[i] = rand() % 40-20;
}

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

void sort(int A[],int size)
{
int x, i, j, tmp_i, tmp_j;
for(int a=0;a<size;a++)//находим индекс первого отрицательного элемента
{
if(A[a]<0)
{
tmp_i=a;
break;
}
}
for(int a=size-1;a>tmp_i;a--)//находим последнего отрицательного элемента
{
if(A[a]<0)
{
tmp_j=a;
break;
}
}
for(i=tmp_i;i<=tmp_j;i++)//сама сортировка
{
x=A[i];
for (j=i-1;j>=tmp_i&&A[j]>x;j--)
A[j+1]=A[j];
A[j+1] = x;
}
}

9 мая 2015 г.

"Пузырьковая" cортировка

template <class T>
void bubbleSort(T a[], long size)
{
long i, j;
T x;
for(i=0;i<size;i++)
{
for(j=size-1;j>i;j--)
{
if(a[j-1]>a[j]){
x=a[j-1];
a[j-1]=a[j];
a[j]=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";
bubbleSort(ar,SIZE);

// после сортировки
for(int i=0;i<SIZE;i++)
{
cout<<ar[i]<<"\t";
}
cout<<"\n\n";
}

Линейный поиск

int ls (int array[], int size, int key){
for(int i=0;i<size;i++)
if(array[i] == key)
return i;
return -1;
}

void main()
{
setlocale(LC_ALL, "Russian");
const int arraySize=100;
int a[arraySize], searchKey, element;
for(int x=0;x<arraySize;x++)
a[x]=2*x;
cout<<"Введите число: ";
cin>>searchKey;
element=ls(a, arraySize, searchKey);
if(element!=-1)
cout<<"\nВведённое число находится в ячейке"<<element<<'\n';
else
cout<<"\nНе найдено";
}

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

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;
}