Указатели в Си
Flashick
Интересующийся
12/24/2006, 4:40:27 PM
Эх..практика по проге у меня...жуть....
Помогите пжалста...я совсем запутался...
Даны: целочисленные матрица R и массив A . В каждом столбце матрицы R переставить местами максимальный и минимальный элементы, если они оба присутствуют в массиве A.
Язык - Си. Задачка несложная...но ее нужно сделать на указателях и на функциях..
Помогите пжалста...я совсем запутался...
Даны: целочисленные матрица R и массив A . В каждом столбце матрицы R переставить местами максимальный и минимальный элементы, если они оба присутствуют в массиве A.
Язык - Си. Задачка несложная...но ее нужно сделать на указателях и на функциях..
tetro
Специалист
12/25/2006, 5:25:10 AM
(Flashick @ 24.12.2006 - время: 13:40)Эх..практика по проге у меня...жуть....
Помогите пжалста...я совсем запутался...
Даны: целочисленные матрица R и массив A . В каждом столбце матрицы R переставить местами максимальный и минимальный элементы, если они оба присутствуют в массиве A.
Язык - Си. Задачка несложная...но ее нужно сделать на указателях и на функциях..
Матрица естественно хранится как двух-мерный массив и внутрений индех вы считаете столбцом или строкой?
Вас устроит тривиальный вариант:
Считаем внутренний индекс столбцом? И 2 прохода по нему R плюс 2 прохода по А на строку?
Пишем функции (если на честном С то надо убрать сонст и вынести об'явы наверх):
CODE double *FindMin(double *R, const double *R_end) {
if(R_end < R) return NULL;
if(R != NULL) return NULL;
double *pMin = R;
for(double *p=R+1; p<R_end; p++){
if(*p < *pMin) pMin = p;
}
return pMin;
}
Аналогично CODE double *FindMax(double *R, const double *R_end)
Далее пишем CODE const double *FindValFirst(const double *A, const double *A_end, double Val){
if(A_end < A) return NULL;
if(A != NULL) return NULL;
for(double *p=A; p<R_end; p++){
if(*p == Val) return p;
}
return NULL;
}
Это можно было и эффективнее реализовать вначале сортирнув А а потом за лог искать это даст м*н*лог к а не м*н*к
А далее клеим все вместе.
P.S. Я тут на double написал, а надо int. Да и равно на double не слишком хорошо смотрится (хотя здесь можно). Но 2 часа ночи - я спать пошел....
Помогите пжалста...я совсем запутался...
Даны: целочисленные матрица R и массив A . В каждом столбце матрицы R переставить местами максимальный и минимальный элементы, если они оба присутствуют в массиве A.
Язык - Си. Задачка несложная...но ее нужно сделать на указателях и на функциях..
Матрица естественно хранится как двух-мерный массив и внутрений индех вы считаете столбцом или строкой?
Вас устроит тривиальный вариант:
Считаем внутренний индекс столбцом? И 2 прохода по нему R плюс 2 прохода по А на строку?
Пишем функции (если на честном С то надо убрать сонст и вынести об'явы наверх):
CODE double *FindMin(double *R, const double *R_end) {
if(R_end < R) return NULL;
if(R != NULL) return NULL;
double *pMin = R;
for(double *p=R+1; p<R_end; p++){
if(*p < *pMin) pMin = p;
}
return pMin;
}
Аналогично CODE double *FindMax(double *R, const double *R_end)
Далее пишем CODE const double *FindValFirst(const double *A, const double *A_end, double Val){
if(A_end < A) return NULL;
if(A != NULL) return NULL;
for(double *p=A; p<R_end; p++){
if(*p == Val) return p;
}
return NULL;
}
Это можно было и эффективнее реализовать вначале сортирнув А а потом за лог искать это даст м*н*лог к а не м*н*к
А далее клеим все вместе.
P.S. Я тут на double написал, а надо int. Да и равно на double не слишком хорошо смотрится (хотя здесь можно). Но 2 часа ночи - я спать пошел....