Вычислить скалярное произведение двух одномерных массивов - C (СИ)
Формулировка задачи:
Задание: Вычислить скалярное произведение двух одномерных массивов.
Ввод: С консоли. Подается число элементов массивов n, затем элементы первого массива, затем элементы второго массива.
Ограничения: 1?n?10000, -1000?Array[n]?1000, время работы программы не более 1 с.
Вывод: Число равное скалярному произведению данных массивов.
Ввод 1 2 1 5 5 1 Вывод 1 10
Ввод 2 1 2 2 Вывод 2 4
Ввод 3 3 0 0 0 13 25 -15 Вывод 3 0
Решение задачи: «Вычислить скалярное произведение двух одномерных массивов»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int ScalProd(int n, int *a, int *b)
{
return (n==0)?0:a[0]*b[0]+ScalProd(n-1,a+1,b+1);
}
int main(int argc, char *argv[])
{
int i,n,*A,*a,*B,*b;
printf("n=");
scanf("%d",&n);
A=(int*) calloc(n,sizeof(int));
B=(int*) calloc(n,sizeof(int));
a=A;
b=B;
for(i=0; i<n; i++) scanf("%d",&a[i]);
for(i=0; i<n; i++) scanf("%d",&b[i]);
printf("%d\n",ScalProd(n,a,b));
free(A);
free(B);
system("PAUSE");
return 0;
}
Объяснение кода листинга программы
В этом коде реализован рекурсивный алгоритм вычисления скалярного произведения двух одномерных массивов.
- В функции
mainобъявлены следующие переменные:i- счётчик для цикла;n- размер массива;A,a- указатели на первый массив;B,b- указатели на второй массив.
- Сначала пользователю предлагается ввести размер массива.
- Затем выделяется память под массивы
AиBс помощью функцииcalloc. - Указатели
aиbустанавливаются на начало выделенной памяти. - В цикле с помощью функции
scanfпользователь заполняет элементами массивыaиb. - Вызывается функция
ScalProdдля вычисления скалярного произведения. - Результат вычисления выводится на экран.
- Выделенная память освобождается с помощью функции
free. - Команда
PAUSEприостанавливает выполнение программы до нажатия клавиши. - Функция
mainвозвращает 0, что означает успешный конец работы программы. В функцииScalProdреализован рекурсивный алгоритм вычисления скалярного произведения. - Если
nравно 0, то возвращается 0 (базовый случай). - Если
nбольше 0, то:a[0]умножается наb[0];- рекурсивно вызывается функция
ScalProdс аргументамиn-1,a+1иb+1.
- Результат вычисления возвращается в качестве результата.