Определить среднее геометрическое элементов массива - 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;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы для работы с стандартными функциями ввода-вывода, математикой и памятью.
  2. Задаем размер массива N = 10.
  3. Создаем переменную i для цикла, переменную n для подсчета количества отрицательных элементов, переменные first и last для определения индексов первого и последнего отрицательного элемента.
  4. Инициализируем массив a[10] = {4, 18, -12, 6, 22, 15, 36, 72, -90, 6} значениями элементов.
  5. Устанавливаем начальное значение переменной mult равным 1.0.
  6. В цикле проверяем каждый элемент массива на отрицательность, используя условие a[i] < 0. Если элемент отрицательный, то запоминаем его индекс в переменную first, выводим значение элемента и прерываем цикл.
  7. Если в цикле не было найдено отрицательных элементов, выводим сообщение об этом.
  8. Во втором цикле, начиная с N-1, проверяем каждый элемент массива на отрицательность, используя условие a[i] < 0. Если элемент отрицательный, то запоминаем его индекс в переменную last, выводим значение элемента и прерываем цикл.
  9. Если в цикле не было найдено отрицательных элементов, выводим сообщение об этом.
  10. Если индексы первого и последнего отрицательного элемента совпадают, выводим сообщение о том, что в массиве есть только один отрицательный элемент.
  11. В противном случае, в цикле, начиная с first и до last, умножаем значение переменной mult на абсолютное значение каждого элемента и увеличиваем счетчик n на единицу.
  12. Выводим сообщение о геометрическом среднем элементов между первым и последним отрицательным элементом, используя формулу pow(mult, 1.0/n).
  13. Возвращаем 0, чтобы указать, что программа успешно завершилась.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5
Похожие ответы