Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные занятия_С++.doc
Скачиваний:
4
Добавлен:
23.04.2019
Размер:
462.85 Кб
Скачать

Задание 6. Одномерный массив–параметр функции

Цель задания

Изучение основных приемов программирования задач обработки динамических одномерных массивов, передачи одномерных массивов в функции.

Основные понятия

Указатель - переменная, содержащая адрес другой переменной некоторого типа. Объявление переменной типа указатель:

Тип * ИмяУказателя;

При определении указателя можно выполнять его инициализацию.

Тип * ИмяУказателя = ИнициализирующееВыражение;

double a, *b;

b = &a; //Указатель b инициализируется адресом переменной a

или int a;

int *b = &a;

Операция разыменования *

Записи a=5; и *b = 5; равнозначны.

Основными арифметическими операциями, применимыми к указателям, являются операции увеличения и уменьшения указателя:

ИмяУказателя + i ИмяУказателя - i

При работе с указателями можно использовать операцию вычитания двух указателей: ИмяУказателя1 -ИмяУказателя2

Имя статического массива является константным указателем и содержит адрес первого элемента массива.

Доступ к i-ому элементу одномерного массива, объявленного

float A[10];

адрес начала которого хранится в указателе p,

float* p = A;

возможен тремя способами:

A[i] *(A + i) *(p + i)

Массивы динамической памяти

Для динамического выделения памяти используют операцию new.

ТипМассива* ИмяМассива = new ТипМассива[РазмерМассива];

Для освобождения динамической памяти, занимаемой массивом, служит операция delete [] ИмяМассива;

Передача массивов в функции

В списке формальных параметров для массива-параметра используют []. Например:

void DisplayArrayFixed ( int Array[], int ArraySize ) {

for(int i = 0; i < 10; i++)

cout << Array[i] << ' ';

}

Array - массив, ArraySize-переменная,.задающая размер массива.

Учитывая то, что имя массива является указателем, заголовок функции может иметь вид: void DisplayArrayFixed ( int *Array, int ArraySize )

Все сказанное относится к статичаским и к динамическим массивам.

Примеры выполнения задания

//Пример 6.1. Определить динамический одномерный массив A.

//Разбить массив на два динамических массива:

//B- массив положительных, C-массив отрицательных чисел.

#include <iostream.h>

#include <conio.h>

#include <stdlib.h>

int main() {

cout<<"\nЗадайте количество чисел в массиве:";

int n;

cin>>n;

int *A=new int [n]; //Выделение динамической памяти для массива А

int KolPlus=0, KolMinus=0;

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

A[i]=random(n)-random(n);

if(A[i]>0) KolPlus++;

if(A[i]<0) KolMinus++;

}

int *B=new int [KolPlus]; //Выдел. динамич. памяти для массива B

int *C=new int [KolMinus]; //Выдел. динам. памяти для массива C

int indB = 0, indC = 0;

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

if (A[i]>0) {

B[indB] = A[i];

indB++;

};

if(A[i]<0) {

C[indC] = A[i];

indC++;

}

}

cout<<"Исходный массив A:\n";

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

cout << A[i] << ' ';

cout<<endl;

cout<<"Массив положительных чисел В:\n";

if(! indB) cout<<"Положительных чисел в массиве нет\n";

for(int i = 0; i < indB; i++)

cout << B[i] << ' ';

cout<<endl;

cout<<"Массив отрицательных чисел С:\n";

if(! indC) cout<<"Отрицательных чисел в массиве нет\n";

for(int i = 0; i < indC; i++)

cout << C[i] << ' ';

cout<<endl;

//Освобождение динамической памяти, занимаемой массивами A, B, C

delete []A;

delete []B;

delete []C;

getch();

return 0;

}

//Пример 6.2.Выполнить Пример 6.1, оформив в виде функций

//ввод, вывод и обработку массивов.

#include <iostream.h>

#include <conio.h>

#include <stdlib.h>

void Vvod(int *, int ,int&, int&);

void Vyvod(int *, int);

void PlusMinus(int* , int, int*, int*);

int main() {

cout<<"\nЗадайте количество чисел в массиве:";

int n;

cin>>n;

int *A=new int [n]; //Выделение динамической памяти для массива А

int KolPlus, KolMinus;

Vvod(A, n, KolPlus, KolMinus); //Вызов функции Vvod для масива A

int *B=new int [KolPlus]; //Выдел. динам.памяти для массива B

int *C=new int [KolMinus]; //Выдел. динам. памяти для массива C

PlusMinus(A, n, B, C); //Вызов функции PlusMinus

cout<<"Исходный массив A:\n";

Vyvod(A, n); //Вызов функции Vyvod для массива A

cout<<"Массив положительных чисел В:\n";

if(! KolPlus) cout<<"Положительных чисел в массиве нет\n";

Vyvod(B, KolPlus); //Вызов функции Vyvod для массива B

cout<<"Массив отрицательных чисел С:\n";

if(! KolMinus) cout<<"Отрицательных чисел в массиве нет\n";

Vyvod(C, KolMinus); //Вызов функции Vyvod для массива C

//Освобождение динам. памяти, занимаемой массивами A, B, C

delete []A;

delete []B;

delete []C;

getch();

return 0;

}

void Vvod(int * A, int n, int &KolPlus, int &KolMinus) {//Функция Vvod

KolPlus=0, KolMinus=0;

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

A[i]=random(n)-random(n);

if(A[i]>0) KolPlus++;

if(A[i]<0) KolMinus++;

}

}

void PlusMinus(int* A, int n, int* B, int* C) { //Функция PlusMinus

int indB = 0, indC = 0;

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

if (A[i]>0) {

B[indB] = A[i];

indB++;

};

if(A[i]<0) {

C[indC] = A[i];

indC++;

}

}

}

void Vyvod(int *A , int n) { //Функция Vyvod

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

cout << A[i] << ' ';

cout<<endl;

}

Постановка задания

Разработать алгоритм решения задачи. Написать программу, которая реализует данный алгоритм. Создать динамический(ие) массив(ы). Ввод, вывод элементов одномерного массива и его обработку оформить в виде функций.

Варианты контрольных заданий

Смотри варианты контрольных заданий задания 3.