Консультация № 188860
27.02.2016, 07:00
0.00 руб.
27.02.2016, 13:02
0 3 1
Здравствуйте, уважаемые эксперты! Прошу помощи в следующем вопросе:

Дан массив 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().
Желательно вспомогательные массивы не использовать.

Обсуждение

давно
Посетитель
7438
7205
27.02.2016, 13:24
общий
Адресаты:
Преобразовать массив, поместив в правой его части все отрицательные элементы, а потом- все положительные
Как это? Может, в первой части все отрицательные, а потом - все положительные?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
27.02.2016, 14:28
общий
это ответ
Здравствуйте, fridge!
Комментарии смотрите в тексте. Если что непонятно или не так сделано, милости просим в мини-форум.
[code h=200]
/*
Дан массив 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
}
[/code]
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399277
11
28.02.2016, 20:41
общий
Огромное вам спасибо! Очень благодарен за помощь!
Форма ответа