Показаны сообщения с ярлыком указатели. Показать все сообщения
Показаны сообщения с ярлыком указатели. Показать все сообщения

22 сентября 2015 г.

Необходимо создать двумерный массив. Далее написать функцию, которая заполнит его случайными числами от 30 до 60. Создать еще две функции, которые находят максимальный и минимальный элементы этого двумерного массива

void init(int **a, int line, int column);
void out(int **a, int line, int column);
int max(int **a, int line, int column);
int min(int **a, int line, int column);

void main()
{
setlocale(LC_ALL, "rus");

int size_l, size_c;
do
{
cout << "Введите количество строк:";
cin >> size_l;
cout << "Введите количество столбцов:";
cin >> size_c;
//инициализация двумерного массива
int **mas = new int*[size_l];
for (int i = 0; i < size_l; i++)
mas[i] = new int[size_c];

init(mas, size_l, size_c);//вызов функции заполнения массива
out(mas, size_l, size_c);//вызов функции вывода массива на экран

cout << "Максимальное число в массиве: " << max(mas, size_l, size_c) << "\n";
cout << "Минимальное число в массиве: " << min(mas, size_l, size_c) << "\n";

//удаление двумерного массива
for (int i = 0; i < size_l; i++)
delete[]mas[i];
delete[] mas;
cout << "\nЕсли хотите продолжить, нажмите 1:";
cin >> size_l;
cout << "\n";
} while (size_l==1);
}

void init(int **a, int line, int column)
{
for (int i = 0; i < line; i++)
{
for (int j = 0; j < column; j++)
{
a[i][j] = rand() % 30 + 30;
}
}
}

void out(int **a, int line, int column)
{
cout << "\n";
for (int i = 0; i < line; i++)
{
for (int j = 0; j < column; j++)
{
cout<<a[i][j]<<" ";
}
cout << "\n";
}
cout << "\n";
}

int max(int **a, int line, int column)
{
int d = a[0][0];
for (int i = 0; i < line; i++)
{
for (int j = 0; j < column; j++)
{
if (d < a[i][j])
d = a[i][j];
}
}
return d;
}

int min(int **a, int line, int column)
{
int d = a[0][0];
for (int i = 0; i < line; i++)
{
for (int j = 0; j < column; j++)
{
if (d > a[i][j])
d = a[i][j];
}
}
return d;
}

Произвести, используя указатель на указатель проверку на нуль при делении.

void del(double *x, double *y, double *res);

void main()
{
setlocale(LC_ALL, "Russian");
cout << "Введите число, которое будем делить: ";
double a, b, res;
cin >> a;
cout << "\n";

cout << "Введите число, на которое будем делить: ";
cin >> b;
cout << "\n";

del(&a, &b, &res);

if (b == 0){
return;
}
cout << "Результат - " << res << "\n";
}

void del(double *x, double *y, double *res){
if (*y == 0)
cout << "Нельзя делить на нуль. Повторите попытку!" << "\n";
else
*res = *x / *y;
}

Найти заданную степень числа, пользуясь только указателями.

void st(long int *digit, int *stepen, long int *res)
{
for (int i = *stepen; i > 1; i--)
{
*res *= *digit;
}
}

void main()
{
setlocale(LC_ALL, "Russian");
long int a, res;
int stepen;
do{
cout << "Эта программа считает степень числа с помощью указателей\n";
cout << "Введите число:";
cin >> a;
cout << "Введите степень:";
cin >> stepen;
res = a;
st(&a, &stepen, &res);
cout << "\n" << stepen << " степень числа " << a << " равна " << res << "\n\n";
cout << "Если хотите продолжить, нажмите 1:";
cin >> a;
} while (a == 1);
}

Через указатели на указатели посчитать сумму двух чисел и записать в третье.

void summ(int *x, int *y, int *tmp);

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

void summ(int *x, int *y, int *tmp)
{
*tmp= *x + *y;
}

Написать примитивный калькулятор, пользуясь только указателями.

void summ(int *x, int *y, int *tmp);
void razn(int *x, int *y, int *tmp);
void proizv(int *x, int *y, int *tmp);
void delen(int *x, int *y, int *tmp);

void main()
{
setlocale(LC_ALL, "Russian");
int a, b, res;
char dei;
do{
cout << "Этот примитивный калькулятор использует только указатели\n";
cout << "\nВозможно использовать только + - * / \n";
cin >> a >> dei >> b;
cout << "=\n";
switch (dei){
case '+':
summ(&a, &b, &res);
cout << res << "\n";
break;
case '-':
razn(&a, &b, &res);
cout << res << "\n";
break;
case '*':
proizv(&a, &b, &res);
cout << res << "\n";
break;
case '/':
delen(&a, &b, &res);
cout << res << "\n";
break;
default:
cout << "Error!";
}
cout << "Если хотите продолжить, нажмите 1:";
cin >> a;
} while (a == 1);
}

void summ(int *x, int *y, int *tmp)
{
*tmp = *x + *y;
}

void razn(int *x, int *y, int *tmp)
{
*tmp = *x - *y;
}

void proizv(int *x, int *y, int *tmp)
{
*tmp = *x * *y;
}

void delen(int *x, int *y, int *tmp)
{
*tmp = *x / *y;
}

Найти факториал числа, пользуясь только указателями.

void fact(long int *digit, long int *res)
{
for (int i = 1; i <= *digit; i++)
{
*res *= i;
}
}

void main()
{
setlocale(LC_ALL, "Russian");
long int a, res=1;
do{
cout << "Эта программа считает факториал с помощью указателей\n";
cout << "\nВведите число:";
cin >> a;
fact(&a, &res);
cout << "Факториал " << a << " равен " << res << "\n";
cout << "Если хотите продолжить, нажмите 1:";
cin >> a;
} while (a == 1);
}

21 сентября 2015 г.

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



void init(int A[], int size);
void out(int A[], int size);
void sdvig(int A[], int size, int kol, int napr);

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

int size, kol, napr;

cout << "Введите размер массива: ";
cin >> size;
int* mass = new int [size];
init(mass, size);
out(mass, size);
cout << "Функция, которая циклически сдвигает одномерный массив вправо или влево на указанное число позиций";
cout << "\nВведите количество позиций: ";
cin >> kol;
do
{
cout << "\nВведите направление: 1 - влево, 2 - вправо\n";
cin >> napr;
} while (napr != 1 && napr != 2);
sdvig(mass, size, kol, napr);
out(mass, size);
delete[] mass;
}

void sdvig(int A[], int size, int kol, int napr)
{
if (napr == 1)
{
for (int i = 0; i <kol; i++)
{
int tmp = A[0];
for (int j = 1; j <size; j++)
{
A[j - 1] = A[j];
}
A[size - 1] = tmp;
}
}
if (napr == 2)
{
for (int i = 0; i < kol; i++)
{
int tmp = A[size-1];
for (int j = size-1; j > 0; j--)
{
A[j] = A[j-1];
}
A[0] = tmp;
}
}
}

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

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

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. Не существует операторов, непосредственно производящих действия над ссылками!

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