Определить среднее геометрическое элементов массива - C (СИ)
Формулировка задачи:
Здравствуйте, дано задание:
Определить значения и позиции первого и последнего отрицательного элементов массива. Рассмотреть случаи, когда отрицательных элементов нет, имеется только один отрицательный элемент, имеются два и более отрицательных элементов. Для последнего случая определить среднее геометрическое элементов, которые расположены между первым и последним отрицательными элементами массива.
Если с первым я разобрался, то последние не могу понять как сделать. может кто то объяснит?
Вот исходник:
#include "stdafx.h"
#include"stdio.h"
#include"math.h"
#include"conio.h"
#include"windows.h"
#include"cmath"
#include<iostream>
int _tmain(int argc, _TCHAR* argv[])
{
int i, n,
//позиции первого и последнего отрицательных элементов, одновременно флаги
ifirst, ilast;
const int massiv = 20;
double x[massiv] = { 2, 6, 13.6, -36.6, 16.3, -34.5, 18.6, 7.4, 12.2, -56.1,
13, 18, 34, -102, 66, -38, -71, 23, 25.4, 15 }, fminus, lminus;
//set Russian
setlocale(0, "rus");
//Ввод и контроль размерности массива
printf("Введите размер массива <=20!\n");
printf("Ваше значение массива = ");
scanf_s("%d", &n);
//условие на проверку превышения значения массива
if (n <= 0 || n>massiv)
{
printf("\nОШИБКА!!!!!!!\n", n);
printf("Размер вашего массива равный %d элементам, не соответствует размеру массива от 1 до 20 элементов\n", n);
printf("\nДля завершения программы нажмите любую клавишу\n");
_getch(); exit(0);
}
printf("\n-----------------------------------------------\n");
//Вывод исходного массива
printf("Исходный массив х размером %d\n", n);
for (i = 0; i<n; i++)
printf("%8.2lf", x[i]);
ifirst = -1; //Это признак того, что первый отрицательный элемент пока не найден.
//Индексы элементов массива 0,1,2,...,19
ilast = -1; //Это признак того, что последний отрицательный элемент пока не найден.
for (i = 0; i<n && x[i] >= 0; i++);
if (i<n)
{
ifirst = i; fminus = x[i];
for (i = n - 1; i>ifirst && x[i] >= 0; i--);
if (i>ifirst)
{
ilast = i; lminus = x[i];
}
}
//Проверка: сколько найдено отрицательных элементов
if (ifirst == -1)
{
printf("\n-----------------------------------------------\n");
printf("\nОтрицательных элементов нет\n");
}
else
if (ilast == -1){
printf("\n-----------------------------------------------\n");
printf("\nОдин отрицательный элемент = %8.2lf, его позиция = %d\n", x[ifirst], ifirst);
}
else
{
printf("\n-----------------------------------------------\n");
printf("\nПервый отрицательный элемент = %8.2lf, его позиция = %d\n", x[ifirst], ifirst);
printf("\nПоследний отрицательный элемент = %8.2lf, его позиция = %d\n", x[ilast], ilast);
printf("\n-----------------------------------------------\n");
}
//определяю среднее геометрическое элементов, которые расположены между первым и последним отрицательными элементами массива.
//the end
printf("\nДля завершения программы нажмите любую клавишу\n");
_getch();
return 0;
}Решение задачи: «Определить среднее геометрическое элементов массива»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
const int N = 10;
int main()
{
int i, n = 0, first, last, a[10] = {4, 18, -12, 6, 22, 15, 36, 72, -90, 6};
double mult = 1.0;
for(i = 0; i < N; ++i){
if(a[i] < 0){
first = i;
printf("The first negative elment is a[%d] = %d\n", first, a[i]);
break;
}
if(i == N -1)
printf("The array haven't any negativ elements\n");
}
for(i = N -1; i >= 0; --i)
if(a[i] < 0){
last = i;
printf("The Last negative elment is a[%d] = %d\n", last, a[i]);
break;
}
if(first == last)
printf("The array have only one negative element\n");
else {
for(i = first; i <= last; ++i){
mult = mult * abs(a[i]);
++n;}
printf("The geometric mean of elements between first and last negative is \n%e\n",
pow(mult, 1.0/n));
}
return 0;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы с стандартными функциями ввода-вывода, математикой и памятью.
- Задаем размер массива N = 10.
- Создаем переменную
iдля цикла, переменнуюnдля подсчета количества отрицательных элементов, переменныеfirstиlastдля определения индексов первого и последнего отрицательного элемента. - Инициализируем массив a[10] = {4, 18, -12, 6, 22, 15, 36, 72, -90, 6} значениями элементов.
- Устанавливаем начальное значение переменной
multравным 1.0. - В цикле проверяем каждый элемент массива на отрицательность, используя условие a[i] < 0. Если элемент отрицательный, то запоминаем его индекс в переменную
first, выводим значение элемента и прерываем цикл. - Если в цикле не было найдено отрицательных элементов, выводим сообщение об этом.
- Во втором цикле, начиная с N-1, проверяем каждый элемент массива на отрицательность, используя условие a[i] < 0. Если элемент отрицательный, то запоминаем его индекс в переменную
last, выводим значение элемента и прерываем цикл. - Если в цикле не было найдено отрицательных элементов, выводим сообщение об этом.
- Если индексы первого и последнего отрицательного элемента совпадают, выводим сообщение о том, что в массиве есть только один отрицательный элемент.
- В противном случае, в цикле, начиная с
firstи доlast, умножаем значение переменнойmultна абсолютное значение каждого элемента и увеличиваем счетчикnна единицу. - Выводим сообщение о геометрическом среднем элементов между первым и последним отрицательным элементом, используя формулу pow(mult, 1.0/n).
- Возвращаем 0, чтобы указать, что программа успешно завершилась.