Консультация # 188860: Здравствуйте, уважаемые эксперты! Прошу помощи в следующем вопросе: Дан массив arr из n целых элементов и целое число c. 1) Вычислить количество элементов массива, больших c(morec). 2)Вычислить произведение prod элементов массива, расположенных после максимального по модулю элемента. 3) Преобразовать массив, поместив в правой его ча...
Здравствуйте, уважаемые эксперты! Прошу помощи в следующем вопросе:
Дан массив arr из n целых элементов и целое число c. 1) Вычислить количество элементов массива, больших c(morec). 2)Вычислить произведение prod элементов массива, расположенных после максимального по модулю элемента. 3) Преобразовать массив, поместив в правой его части все отрицательные элементы, а потом- все положительные. Написать функцию, решающую эти задачи. Прототип функции : int arr_proc(int *arr, int n,
int c, int *pprod); Функция возвращает значение morec. Значение prod передается вызывающей функции через pprod. Написать функцию main() для тестирования arr_proc(). Желательно вспомогательные массивы не использовать.
/*
Дан массив arr из n целых элементов и целое число c.
1) Вычислить количество элементов массива, больших c(morec).
2) Вычислить произведение prod элементов массива, расположенных после максимального по модулю элемента.
3) Преобразовать массив, поместив в правой его части все отрицательные элементы, а потом- все положительные.
Написать функцию, решающую эти задачи. Прототип функции :
int arr_proc(int *arr, int n, int c, int *pprod);
Функция возвращает значение morec. Значение prod передается вызывающей функции через pprod.
Написать функцию main() для тестирования arr_proc().
Желательно вспомогательные массивы не использовать.
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int arr_proc(int*, int, int, int*);
int main()
{
int i, n, c, morec, prod;
int *a;
srand(time(NULL));
printf("Input array size, n = ");
scanf("%d", &n); //вводим n
a = (int*)malloc(n * sizeof(int)); //выделяем память в куче
for(i = 0; i < n; i++) //заполним случайными числами
{
a[i] = (rand() % 20) - 10; //в интервале [-10;9]. Большие числа брать не стоит,
// иначе произведение может не поместиться в int
printf("%d ", a[i]); //выведем массив
}
printf("\nInput integer number, c = "); //вводим число с
scanf("%d", &c);
morec = arr_proc(a, n, c, &prod); //считаем
//выводим результат
printf("\nResult:\nmorec = %d\nprod = %d\nNew array:\n",morec,prod);
for(i = 0; i < n; i++)
printf("%d ", a[i]);
printf("\n"); //перевод строки
free(a); //освободим память
system("pause");
return 0;
}
//наша функция.
//возвращает количество элементов, больших с
//в *pprod произведение элементов за максимальным по модулю, если = 0, значит максимальный -
// последний элемент массива (или все элементы = 0!)
//сортируем массив так, что все отрицательные элементы будут в начале массива.
// Порядок отрицательных и неотрицательных элементов внутри групп не меняется!
int arr_proc(int *arr, int n, int c, int *pprod)
{
int morec, i, j, max, imax, temp;
//считаем количество элементов, больших с, одновременно ищем максимальный по модулю элемент и его индекс
for(imax=max=morec=i=0; i<n; i++)
{
morec += (arr[i] > c); //прибавится 1, если больше, и 0, если меньше или равно
if (abs(arr[i]) > max)
{
max = abs(arr[i]); //новый максимальный по модулю элемент
imax = i; // его индекс
}
}
//решаем задачу №2: находим произведение элементов за максимальным
for(imax++,*pprod=0; imax<n; imax++)//вначале присвоим 0, на случай, если максимальный окажется последним!
{
if (*pprod == 0)
*pprod = arr[imax];
else
*pprod *= arr[imax];
}
//задача №3: сортируем массив
for(i=0; i<n-1; i++) //от первого до предпоследнего
{
if (arr[i]>=0) //неотрицательный?
{ //ищем, куда его переместить
for(j=i+1; j<n; j++) //от последующего до конца
{
if (arr[j]<0) //ищем отрицательный
{ //нашли
temp = arr[j]; //сохраним найденный отрицательный
for(; j>i; j--) //переместим ряд неотрицательных элементов на один вперед
arr[j] = arr[j-1];
arr[i] = temp; //а отрицательный вставим на место бывшего неотрицательного
break; //переместили, выходим на продолжение поиска неотрицательных
}
}
}
}
return morec; //вернем morec
}
Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 27.02.2016, 14:28
5
нет комментария ----- Дата оценки: 28.02.2016, 20:41
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались.
Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора -
для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение.
Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал,
который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом.
Заходите - у нас интересно!