Определить среднее геометрическое элементов массива - 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, чтобы указать, что программа успешно завершилась.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д