Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






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





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

Пример 1:

Удалить из массива все четные элементы

#include <iostream.h>

#include <stdlib.h>

int form(int a[100], int &n){/*количество элементов 100 может быть опущено, компилятор все равно его игнорирует; а вот n должно быть передано по ссылке, т.к. его значение формируется и должно быть передано в вызывающую функцию*/

int n;

cout<<"\nEnter n";

cin>>n;

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

a[i]=rand()%100;

return n;

}

void print(int a[],int n){

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

cout<<a[i]<<" ";

cout<<"\n";

}

 

void Dell(int a[],int&n){

int j=0,i,b[100];//используем вспомогательный массив b (тоже допустимо)

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

if(a[i]%2!=0)

{

b[j]=a[i];j++;

}

n=j;

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

a[i]=b[i];

}

 

void main()

{

int a[100];

int n;

form(a,n);

print(a,n);

Dell(a,n);

print(a,n);

}

Пример 2.

Удалить из массива все элементы, совпадающие с первым элементом, используя динамическое выделение памяти.

#include <iostream.h>

#include <stdlib.h>

int* form(int&n)

{

cout<<"\nEnter n";

cin>>n;

int*a=new int[n];//указатель на динамическую область памяти

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

a[i]=rand()%100;

return a;

}

void print(int*a,int n)

{

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

cout<<a[i]<<" ";

cout<<"\n";

}

int*Dell(int *a,int&n)

{

int k,j,i;

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

if(a[i]!=a[0])

k++;

int*b;

b=new int [k];

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

if(a[i]!=a[0]){

b[j]=a[i]; j++;

}

n=k;

return b;

}

void main()

{

int *a;

int n;

a=form(n);

print(a,n);

a=Dell(a,n);

print(a,n);

}

Предостережение: выделение динамической памяти в функции и возвращение адреса этой памяти в вызывающую функцию считается плохим стилем программирования. Т.к. вызывающая функция сама не запрашивала память, то с большой вероятностью ей и «не придет в голову» освободить эту память со временем. Конечно, при успешном завершении программы вся выделенная ей память освобождается автоматически, но, тем не менее, это может привести к значительным утечкам памяти. Во-первых, не всегда программы завершаются успешно. Во-вторых, вспомним, что современные приложения могут работать сутками или даже месяцами без перерыва (завершения). Приведенный выше пример следует переписать так:

#include <iostream.h>

#include <stdlib.h>

#include<time.h>

void form(int *a,int n){

srand((unsigned)time(NULL));

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

a[i]=rand()%100;

}

void print(int*a,int n)

{

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

cout<<a[i]<<" ";

cout<<"\n";

}

void dell(int *a,int&n)

{

int i=0;

int tmp=a[0];

while(i<n){

if(a[i]=tmp){ // удаляем из a i-элемент

for(int j=i+1;i<n;++i)

a[i-1]=a[i];

--n;

}

else i++;

}

}

int main(){

int n;

cout<<"\nEnter n";

cin>>n;

int*a=new int[n];//указатель на динамическую область памяти

form(a,n);

print(a,n);

Dell(a,n);

print(a,n);

delete []a;

return 0;

}

 

Date: 2016-11-17; view: 246; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.005 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию