Вывести на печать все пары индексов массивов, для которых выполняется условие - C (СИ)
Формулировка задачи:
Здравствуйте.
Стрессия, выживаем как можем...
Задание:
Задать 2 динамические одномерные массива а и b, размерностью n. Вывести на печать все пары индексов, для которых (a[i]*b[i])>10. Подсчитать число пар и сумму этих произведений.#include <stdio.h>
#include <stdlib.h>
//прототипы функций
int *mem (int n);
void vvod (int *mas1, int n);
void pr (int *mas1, int *mas2, int n);
void show(int *mas1, int n);
void main()
{
int n, rez;
int*mas1, *mas2;
printf ("\n Vvod razmera massivov:");
scanf ("%d", &n);
mas1=mem (n);
mas2=mem (n);
printf ("\n Vvod elementov massiva 1");
vvod(mas1,n);
printf ("\n Vvod elementov massiva 2");
vvod(mas2,n);
printf("\n Isx massivy:");
show(mas1, n);
show(mas2, n);
free(mas1);
free(mas2);
//rez=pr(mas1,mas2, n);
}
int*mem (int n)
{
int *m;
m=(int*)calloc(n, sizeof (int));
return m;
}
void vvod (int*mas, int n)
{
for (int i=0; i<n; i++)
scanf ("%d", mas +i);
}
void pr (int*mas1, int*mas2, int n)
{
int a=0, par=0, sum=0;
for (int i=0; i<n; i++)
{
a=(*(mas1+i))*(*(mas2+i));
if (a>10)
{
printf("%5d", i);
par++;
sum+=a;
}
}
printf ("\nSumma proizvedenij=%5d", sum);
printf("\nKoli4estvo par=%5d", par);
}
void show (int mas, int n)
{
for (int i=0; i<=n; i++)
printf ("%5d", (mas+1));
}Решение задачи: «Вывести на печать все пары индексов массивов, для которых выполняется условие»
textual
Листинг программы
/* Задать 2 динамические одномерные массива а и b, размерностью n.
Вывести на печать все пары индексов, для которых (a[i]*b[i])>10.
Подсчитать число пар и сумму этих произведений. */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* инициализация массивов */
void init(int *arr, const int size);
/* вывод на экран */
void print(int *arr, const int size);
/* выводит на печать все пары индексов, для которых (a[i]*b[i])>10 */
/* индексы запоминаются в результирующий массив */
void calcAndPrintIndices(int *arr1, int *arr2, const int size, int *resultArr,
int *sizeResult);
/* подсчитывает сумму произведений пар, у которых индексы указаны в indeces */
int sumPairs(int *arr1, int *arr2, int *indeces, const int sizeIndeces);
int main(void)
{
int sizeA, sizeB; /* размеры динамиечских массивов */
int *a, *b, *indeces; /* динамические массивы a, b и массив индексов */
int minSize; /* меньший из размеров массивов */
int indecesNumber; /* количество индексов, для которых выполняется условие */
do
{
printf("Enter a size: ");
scanf("%d", &sizeA);
printf("Enter b size: ");
scanf("%d", &sizeB);
/* обработка неверных данных */
if (sizeA <= 0 || sizeB <= 0)
printf("Incorrect input. Size must be greater than 0\n");
} while (sizeA <= 0 || sizeB <= 0);
minSize = sizeA < sizeB ? sizeA : sizeB; /* вычисляем наименьший размер */
/* выделение памяти */
a = malloc(sizeA * sizeof(*a));
b = malloc(sizeB * sizeof(*b));
indeces = malloc(minSize * sizeof(*indeces));
/* инициализация массивов */
srand(time(NULL)); /* инициализируем ГПСЧ */
init(a, sizeA);
init(b, sizeB);
/* вывод массивов на экран */
printf("A(%2d): ", sizeA);
print(a, sizeA);
printf("B(%2d): ", sizeB);
print(b, sizeB);
/* запоминаем все пары и выводим их на экран */
printf("Pair of indeces for which (a[i]*b[i])>10: ");
calcAndPrintIndices(a, b, minSize, indeces, &indecesNumber);
printf("\nAmount: %d\n", indecesNumber);
/* подсчитываем сумму произведений пар */
printf("Multiply of this pairs: %d\n",
sumPairs(a, b, indeces, indecesNumber));
/* освобождение памяти */
free(a);
free(b);
free(indeces);
return 0;
}
void init(int *arr, const int size)
{
int i;
for (i=0; i < size; i++)
arr[i] = rand() % 10;
}
void print(int *arr, const int size)
{
int i;
for (i=0; i < size; i++)
printf("%d ", arr[i]);
printf("\n");
}
void calcAndPrintIndices(int *arr1, int *arr2, const int size, int *resultArr,
int *sizeResult)
{
int i, index = 0;
for (i=0; i < size; i++)
if (arr1[i] * arr2[i] > 10)
{
printf("%d ", i);
resultArr[index++] = i;
}
/* запоминаем количество индексов, которые подошли под условие задачи */
*sizeResult = index;
}
int sumPairs(int *arr1, int *arr2, int *indeces, const int sizeIndeces)
{
int i, result = 0;
for (i=0; i < sizeIndeces; i++)
result += (arr1[indeces[i]] * arr2[indeces[i]]);
return result;
}
Объяснение кода листинга программы
- Объявлены три функции:
init,printиcalcAndPrintIndices. - В функции
mainпользователь вводит размеры массивовaиb. - Выделяется память под массивы
a,bиindeces. - Массивы
aиbинициализируются случайными значениями от 0 до 9. - Выводятся массивы
aиbна экран. - В функции
calcAndPrintIndicesпроисходит поиск пар индексов, для которых (a[i]*b[i])>10. - Выводится на экран найденная пара индексов.
- В функции
sumPairsпроисходит подсчет суммы произведений найденных пар. - Выводится на экран количество найденных пар и их сумма.
- Выделяемая память освобождается.