21 июня 2015 г.

обновлённый пример с операторами new и delete

#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
void main(){
srand(time(NULL));
int size;
int * dar;
// запрос размера массива с клавиатуры
cout << "Enter size:\n";
cin >> size;
//выделение памяти под массив с количеством элементов size
dar = new int[size];
if (!dar){
cout << "Sorry, error!!!";
exit(0);// функция организует выход из программы
}
// заполнение массива и показ на экран
for (int i = 0; i<size; i++){
dar[i] = rand() % 100;
cout << dar[i] << "\t";
}
cout << "\n\n";
// освобождение памяти
delete[]dar;
}

Операция освобождения памяти delete

Операция delete освобождает для дальнейшего использования в программе участок памяти, ранее выделенной операцией new:

delete ip; // Удаляет динамический объект типа int,
// если было ip = new int;
delete [ ] mas; // удаляет динамический массив длиной 50, если было
// double *mas = new double[50];

Совершенно безопасно применять операцию к указателю NULL.
Результат же повторного применения операции delete к одному и тому же указателю не определен.
Обычно происходит ошибка, приводящая к зацикливанию.

Чтобы избежать подобных ошибок, можно применять следующую конструкцию:

int *ip=new int[500];
. . .
if (ip){
delete ip; ip=NULL;
}
else
{
cout <<" память уже освобождена \n";
}

Операция выделения памяти new

При выделении памяти объект можно инициализировать:
int *ip = new int(3);

Можно динамически распределить память и под массив:
double *mas = new double [50];

Далее с этой динамически выделенной памятью можно работать как с обычным массивом:


#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
void main(){
srand(time(NULL));
int size;
int * dar;
// запрос размера массива с клавиатуры
cout << "Enter size:\n";
cin >> size;
//выделение памяти под массив с количеством элементов size
dar = new int[size];
if (!dar){
cout << "Sorry, error!!!";
exit(0);// функция организует выход из программы
}
// заполнение массива и показ на экран
for (int i = 0; i<size; i++){
dar[i] = rand() % 100;
cout << dar[i] << "\t";
}
cout << "\n\n";
}

Нахождение максимального элемента в массиве и замена его на нуль

#include <iostream>
using namespace std;
Функция определяет ссылку на элемент
массива с максимальным значением.
int &rmax(int n, int d[])
{
int im = 0;
for (int i = 1; i<n; i++)
im = d[im]>d[i] ? im : i;
return d[im];
}

void main()
{
int x[] = { 10, 20, 30, 14 };
int n = 4;
cout << "\nrmax(n,x) = " << rmax(n, x) << "\n";
rmax(n, x) = 0;
for (int i = 0; i<n; i++)
cout << "x[" << i << "]=" << x[i] << " ";
cout << "\n";
}

Ссылки в качестве результатов функций. Заполнение двумерного массива одинаковыми числами.

#include <iostream>
using namespace std;
int a[10][2];
void main()
{
int & rf(int index); //Прототип функции.
int b;
cout << "Fill array.\n";
for (int i = 0; i<10; i++)
{
cout << i + 1 << " element: ";
cin >> b;
a[i][0] = b;
rf(i) = b;
}
cout << "Show array.\n";
cout << "1-st column 2-nd column" << "\n";
for (int i = 0; i<10; i++)
cout << a[i][0] << "\t\t" << rf(i) << "\n";
}

int &rf(int index)
{
return a[index][1]; //Возврат ссылки на элемент массива.
}

Здесь объявляется глобальный двумерный массив a, состоящий из целых чисел.
В начале функции main() содержится прототип ссылочной функции rf(),
которая возвращает ссылку на целое значение второго столбца массива a,
которое однозначно идентифицируется параметром-индексом index.
Так как функция rf() возвращает ссылку на целое значение, то имя функции
может оказаться слева от оператора присваивания, что продемонстрировано в строке: rf(i) = b;

Ссылочные параметры. Передача аргументов по ссылке.

#include <iostream>
using namespace std;
//Обмен с использованием указателей.
void interchange_ptr(int *u, int *v)
{
int temp = *u;
*u = *v; *v = temp;
}
//Обмен с использованием ссылок.
void interchange_ref(int &u, int &v)
{
int temp = u;
u = v; v = temp;
}
void main()
{
int x = 5, y = 10;
cout << "Change whis pointers:\n";
cout << "x = " << x << " y = " << y << "\n";
interchange_ptr(&x, &y);
cout << "x = " << x << " y = " << y << "\n";
cout << "-----------------------------------------" << "\n";
cout << "Change whis references:\n";
cout << "x = " << x << " y = " << y << "\n";
interchange_ref(x, y);
cout << "x = " << x << " y = " << y << "\n";
}

Инициализация ссылок

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

#include <iostream>
using namespace std;
void main()
{
int ivar = 1234; //Переменной присвоено значение.
int *iptr = &ivar; //Указателю присвоен адрес ivar.
int &iref = ivar; //Ссылка ассоциирована с ivar.
int *p = &iref; //Указателю присвоен адрес iref.

cout << "ivar = " << ivar << "\n";
cout << "*iptr = " << *iptr << "\n";
cout << "iref = " << iref << "\n";
cout << "*p = " << *p << "\n";
}


Замечания.

1. В отличие от указателей, которые могут быть объявлены неинициализированными или установлены в нуль(NULL), ссылки всегда ссылаются на объект.Для ссылок ОБЯЗАТЕЛЬНА инициализация при создании и не существует аналога нулевого указателя.
2. Ссылки нельзя инициализировать в следующих случаях :
при использовании в качестве параметров функции.
при использовании в качестве типа возвращаемого значения функции.
в объявлениях классов.
3. Не существует операторов, непосредственно производящих действия над ссылками!

18 июня 2015 г.

По данному натуральному n вычислите сумму 1×2+2×3+...+(n-1)×n.

int sos(int digit);

void main()
{
setlocale(LC_ALL, "Russian");
int a, b;
do
{
cout<<"По данному натуральному n вычислите сумму произведений соседних чисел 1*2+2*3+...+(n-1)*n.\n";
cout<<"\nВведите число:";
cin>>a;
cout<<"Сумма кубов равна "<<sos(a)<<"\n";
cout<<"Если хотите продолжить, нажмите 1:";
cin>>a;
}
while(a==1);
}

int sos(int digit)
{
int res=0;
for(int i=2;i<=digit;i++)
res+=(i-1)*i;
return res;
}

Дано натуральное число n. Напечатайте все n-значные нечетные натуральные числа в порядке убывания.

int cub(int digit);

void main()
{
setlocale(LC_ALL, "Russian");
int a;
do
{
cout<<"По данному натуральном n вычислите сумму кубов 1*1*1+2*2*2+3*3*3+...+n*n*n. .\n";
cout<<"\nВведите число:";
cin>>a;
cout<<"Сумма кубов равна "<<cub(a)<<"\n";
cout<<"Если хотите продолжить, нажмите 1:";
cin>>a;
}
while(a==1);
}

int cub(int digit)
{
int res=0;
for(int i=0;i<=digit;i++)
res+=i*i*i;
return res;
}

Даны два целых числа A и В. Выведите все числа от A до B включительно, в порядке возрастания, если A < B, или в порядке убывания в противном случае.

void les(int a, int b);

void main()
{
setlocale(LC_ALL, "Russian");
int a, b;
do
{
cout<<"Даны два целых числа A и В. Выведите все числа от A до B включительно, \nв порядке возрастания, если A < B, или в порядке убывания в противном случае\n";
cout<<"\nВведите первое число:";
cin>>a;
cout<<"\nВведите второе число:";
cin>>b;
les(a,b);
cout<<"Если хотите продолжить, нажмите 1:";
cin>>a;
}
while(a==1);

}

void les(int a, int b)
{
if (a<b)
for(;a<=b;a++)
cout<<a<<" ";
else
for(;a>=b;a--)
cout<<a<<" ";
cout<<"\n";
}

17 июня 2015 г.

Даны два массива : А[n] и B[m]. Необходимо создать третий массив, в котором нужно собрать: 1) Элементы обоих массивов; 2) Общие элементы двух массивов; 3) Элементы массива A, которые не включаются в B; 4) Элементы массива B, которые не включаются в A; 5) Элементы массивов A и B, которые не являются общими для них (то есть объединение результатов двух предыдущих вариантов).

void init(int *a, int size);
void out(int *a, int size);
void out_c(int *a, int size);

void main()
{
setlocale(LC_ALL, "Russian");
int digit;

const int size_a = 15;
int a[size_a];
int *pa;
pa = &a[0];
//^ первый массив с указателем
const int size_b = 15;
int b[size_b];
int *pb;
pb = &b[0];
//^ второй массив с указателем
const int size_c = size_a + size_b;
int c[size_c];
int *pc;
pc = &c[0];
//^ третий массив с указателем
int tmp = 0;
do
{
init(a, size_a);
out(a, size_a);
Sleep(1000);//необходимая пауза для инициализации второго массива (необходимо подключить библиотеку windows.h)
init(b, size_b);
out(b, size_b);

cout << "Эта программа создаёт третий массив, в котором собирает:\n";
cout << "1 - Элементы обоих массивов;\n";
cout << "2 - Общие элементы двух массивов;\n";
cout << "3 - Элементы массива A, которые не включаются в B;\n";
cout << "4 - Элементы массива B, которые не включаются в A;\n";
cout << "5 - Элементы массивов A и B, коотрые не являются общими для них(то есть объединение результатов двух предыдущих вариантов)\n\n";
cin >> digit;
switch (digit){
case 1:
for (pc = c, pa = a; pc < c + size_a + size_b; pc++, pa++)
*pc = *pa;
for (pc = c + size_a, pb = b; pc < c + size_a + size_b; pc++, pb++)
*pc = *pb;
cout << "\nРезультат:\n\n";
out(c, size_c);
break;
case 2:
pc = c;
for (pa = a; pa < a + size_a; pa++){
for (pb = b; pb <b + size_b; pb++){
if (*pa == *pb){
*pc = *pa;
pc++;
}
}
}
cout << "\nРезультат:\n\n";
out_c(c, size_c);
break;
case 3:
pc = c;
tmp = 0;
for (pa = a; pa < a + size_a; pa++){
for (pb = b; pb <b + size_b; pb++){
if (*pa == *pb)
tmp++;
}
if (tmp == 0){
*pc = *pa;
pc++;
}
tmp = 0;
}
cout << "\nРезультат:\n\n";
out_c(c, size_c);
break;
case 4:
pc = c;
tmp = 0;
for (pb = b; pb <b + size_b; pb++){
for (pa = a; pa < a + size_a; pa++){
if (*pb == *pa)
tmp++;
}
if (tmp == 0){
*pc = *pb;
pc++;
}
tmp = 0;
}
cout << "\nРезультат:\n\n";
out_c(c, size_c);
break;
case 5:
pc = c;
tmp = 0;
for (pa = a; pa < a + size_a; pa++){
for (pb = b; pb <b + size_b; pb++){
if (*pa == *pb)
tmp++;
}
if (tmp == 0){
*pc = *pa;
pc++;
}
tmp = 0;
}
for (pb = b; pb <b + size_b; pb++){
for (pa = a; pa < a + size_a; pa++){
if (*pb == *pa)
tmp++;
}
if (tmp == 0){
*pc = *pb;
pc++;
}
tmp = 0;
}
cout << "\nРезультат:\n\n";
out_c(c, size_c);
break;
}
cout << "\nЕсли хотите продолжить, нажмите 1:";
cin >> digit;
} while (digit == 1);
}

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

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

void out_c(int *a, int size)
{
cout << "\n";
for (int i = 0; i < size; a++, i++)
if (*a>0) cout << *a << " ";
cout << "\n";
}

Даны два массива, упорядоченных по возрастанию: А[n] и B[m]. Сформируйте массив C[n+m], состоящий из элементов массивов А и В, упорядоченный по возрастанию

void sort(int *a, int size);
void init(int *a, int size);
void out(int *a, int size);


void main()
{
setlocale(LC_ALL, "Russian");
int digit;
const int size_a = 15;
int a[size_a];
int *pa;
pa = &a[0];
//^ первый массив с указателем
const int size_b = 15;
int b[size_b];
int *pb;
pb = &b[0];
//^ второй массив с указателем
const int size_c = size_a + size_b;
int c[size_c];
int *pc;
pc = &c[0];
//^ третий массив с указателем
do
{
cout << "Эта программа формирует упорядоченный массив из двух массивов\n";
cout << "\nИнициализация первого массива:";
init(a, size_a);
out(a, size_a);
Sleep(1000);//необходимая пауза для инициализации второго массива (необходимо подключить библиотеку windows.h)
cout << "\nИнициализация второго массива:";
init(b, size_b);
out(b, size_b);
sort(a, size_a);
sort(b, size_b);
cout << "\nРезультат:\n\n";
cout << "Отсортированный первый массив:";
out(a, size_a);
cout << "\nОтсортированный второй массив:";
out(b, size_b);
//заполнение третьего массива значениями первого и второго массивов
for (pc=c, pa=a; pc < c+size_a+size_b; pc++, pa++)
{
*pc = *pa;
}
for (pc = c+size_a, pb = b; pc < c + size_a + size_b; pc++, pb++)
{
*pc = *pb;
}
sort(c, size_c);
cout << "\nОтсортированный объединённый массив:";
out(c, size_c);
cout << "\nЕсли хотите продолжить, нажмите 1:";
cin >> digit;
} while (digit == 1);
}


void init(int *a, int size)
{
srand(time(NULL));
for (int i = 0; i < size; a++, i++)
*a = rand() % 100 + 1;
}


void out(int *a, int size)
{
cout << "\n";
for (int i = 0; i < size; a++, i++)
cout << *a << " ";
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) > *(a+j))
{
x = *(a + j - 1);
*(a + j - 1) = *(a + j);
*(a + j) = x;
}
}
}
}

Дан массив целых чисел. Воспользовавшись указателями, поменяйте местами элементы массива с четными и нечетными индексами(т.е.те элементы массива, которые стоят на четных местах, поменяйте с элементами, которые стоят на нечетных местах)

void zamena(int *a, int size);
void init(int *a, int size);
void out(int *a, int size);


void main()
{
setlocale(LC_ALL, "Russian");
int digit;
const int size = 15;
int b[size];
int *A;//инициализация указателя
A = &b[0];//присваивание приводит к тому, что A указывает на нулевой элемент массива b. Это означает, что A содержит адрес элемента b[0].
do
{
cout << "Эта программа меняет местами элементы массива с четными и нечетными индексами\n";
init(A, size);
out(A, size);
zamena(A, size);
out(A, size);
cout << "Если хотите продолжить, нажмите 1:";
cin >> digit;
} while (digit == 1);
}


void zamena(int *a, int size)
{
for (int i = 0; i < size; a++, i++)
{
if (i % 2 != 0)
{
int tmp = *a;
*a = *(a - 1);
*(a - 1) = tmp;
}
}
}


void init(int *a, int size)
{
srand(time(NULL));
for (int i = 0; i < size; a++, i++)
*a = rand() % 100 + 1;
}


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