Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KL_PrJAVU230200.doc
Скачиваний:
23
Добавлен:
17.03.2015
Размер:
702.46 Кб
Скачать

Функции и одномерные числовые массивы

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

int *p – для передачи адреса.

int n – для передачи количества элементов массива.

Поскольку каждый элемент массива доступен нам по адресу, то исходный массив и массив-результат предаются одинаково.

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

При формировании массива-результата, память может выделяться внутри вызывающей функции в том же количестве, что и исходный массив. Внутри функции он заполняется данными и его размер может уменьшиться, поэтому вновь подсчитанный размер массива результата передается через оператор return, при этом тип функции - int.

Память под массив результат может быть выделена и внутри функции пользователя, но только -динамически. Его размер может быть предварительно подсчитан или устанавливается приблизительно. В процессе заполнения размер массива определяется. Вызывающая функция ничего не знает об этом массиве, поэтому его надо передать как результат, то есть: через оператор return передать адрес начала массива, при этом тип функции будет указатель на тип массива, например int * . Количество элементов в массиве передаем как второй результат, через параметр-ссылку (int & n). Не забыть освободить динамическую память (в main), как только массив нам станет не нужным.

Для написания оператора вызова функции необходимо уметь определить адрес начала массива:

---------------------------------------------------------

int mas[5]; | int * p = new int[5];

mas - адрес начала массива | p - адрес начала массива

Задача 1

Демонстрирует работу с массивом как с исходным данным

Даны два массива, сравнить их на равенство.

1. Функция заполнения массива случайными числами

2. Ф-я вывода массива на экран

3. Ф-я сравнения массива на равенство

Анализ характеристик функций

1/

1. InMasRnd

2. Исходные данные:

а) массив

int *p;

int n;

б) int min; - левая граница интервала

int max; - правая граница интервала

3. Результат: нет => void

2/

1. OutMas

2. Исходные данные

а) массив

int *p;

int n;

3. Результат: нет => void

3/

1. CmpMas

2. Исходные данные

а) 2 массива - int *p1;

int*p2;

int n;

3. Результат: да/нет => bool

файл: mas1.h

----------------

#ifndef MAS1_H

#define MAS1_H

void InMasRnd(int *p, int n, int min, int max);

void OutMas(int *p, int n);

bool CmpMas(int *p1, int *p2, int n);

#endif

----------------

файл: mas1.cpp

----------------

#include<iostream> //подключение системных средств для

using namespace std; //возможности использовать потоки ввода-вывода

#include <stdlib.h>

#include <time.h>

void InMasRnd(int *p, int n, int min, int max)

{

int i;

for (i=0; i<n; i++)

p[i]=rand()%(max-min+1)+min;

return;

}

void OutMas(int *p, int n)

{

int i;

cout << endl;

for (i=0; i<n; i++)

cout << p[i] << " | ";

return;

}

------------------------------------

первый вариант

------------------------------------

bool CmpMas(int *p1, int *p2, int n)

{

int i;

int kol=0;

for (i=0; i<n; i++) {

if (p1[i] == p2[i])

kol++;

}

if (kol != n)

return false;

else

return true;

}

------------------------------------

второй вариант

------------------------------------

bool CmpMas(int *p1, int *p2, int n)

{

int i;

for (i=0; i<n; i++) {

if (p1[i] != p2[i])

return false;

}

return true;

}

----------------

файл: main.cpp

----------------

#include<iostream> //подключение системных средств для

using namespace std; //возможности использовать потоки ввода-вывода

#include <stdlib.h>

#include <time.h>

#include "mas1.h"

int main(void)

{

const int N=5;

int mas1[N], mas2[N];

bool res;

srand((unsigned)time(NULL));

InMasRnd(mas1,N,-5,10);

InMasRnd(mas2,N,-5,10);

cout << "\nПервый массив:";

OutMas(mas1,N);

cout << "\nВторой массив:";

OutMas(mas2,N);

res = CmpMas(mas1,mas2,N);

if (res == true)

cout << "\nМассивы равны";

else

cout << "\nМассивы не равны";

return 0;

}

Замечание. Вряд ли вы получите равенство массивов при заполнении массивов случайными числами. Замените соответствующую функцию заполнением с клавиатуры.

Задача 2

Создать массив-результат из исходного путем перезаписи всех положительных чисел

Память под массив-результат выделить в вызывающей функции.

Выделяем функции проекта:

1. Функция заполнения случайными числами

2. Ф-я вывода массива на экран

3. Ф-я создания нового массива

3/

1. OtrOut

2. Исходные данные

а) исходный массив

int*p1;

int n;

массив результат

int*p2;

int n;

3. Результат (количество в массиве результате) => int

файл: mas1.h

#ifndef MAS1_H

#define MAS1_H

void InMasRnd(int *p, int n, int min, int max);

void OutMas(int *p, int n);

int OtrOut(int *p1, int *p2, int n);

#endif

файл: mas1.cpp

#include<iostream> //подключение системных средств для

using namespace std; //возможности использовать потоки ввода-вывода

#include <stdlib.h>

#include <time.h>

void InMasRnd(int *p, int n, int min, int max)

{

int i;

for (i=0; i<n; i++)

p[i]=rand()%(max-min+1)+min;

return;

}

void OutMas(int *p, int n)

{

int i;

cout << endl;

for (i=0; i<n; i++)

cout << p[i] << " | ";

return;

}

int OtrOut(int *p1, int *p2, int n)

{

int i, j=0;

for (i=0; i<n; i++) {

if (p1[i] > 0) {

p2[j]=p1[i];

j++;

}

}

return j;

}

файл: main.cpp

#include<iostream> //подключение системных средств для

using namespace std; //возможности использовать потоки ввода-вывода

#include <stdlib.h>

#include <time.h>

#include "mas1.h"

int main(void)

{

const int N=5;

int mas1[N], mas2[N], z;

srand((unsigned)time(NULL));

InMasRnd(mas1,N,-5,10);

cout << "\nПервый массив:";

OutMas(mas1,N);

z = OtrOut(mas1,mas2,N);

cout << "\nВторой массив:";

OutMas(mas2,z);

return 0;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]