Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 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; }
|