Форум программистов, компьютерный форум CyberForum.ru

Определите максимум (М1) и минимум (М2) в массиве - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
VGM
0 / 0 / 0
Регистрация: 25.06.2014
Сообщений: 6
26.06.2014, 10:20     Определите максимум (М1) и минимум (М2) в массиве #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include<iostream>
#include<conio.h>
#include<string>
#include<stdio.h>
#include<fstream>
#include<stdlib.h>
#include<math.h>
using namespace std;
string s; double *mas; int razm;
void udalenie()
{
    int min = 0;
    for (int i = 0; i < razm; i++)
    {
        if (s[i] != ' ')
            min++;
    }
    razm = razm - min + 1;
}
int proverka()
{
    int t = 0;
    for (int i = 0; i < razm; i++)
    if (s[i] == ' ' || (s[i] <= 57 && s[i] >= 48) || s[i] == '-'); else t++;
    return t;
}
void preobr()
{
    int t = 0, j = 0;
    for (int i = 0; i < razm; i++)
    {
        mas[j] = atof(&s[t]);
        if (s[i] == ' ' && ((s[i + 1] >= 48 && s[i + 1] <= 57) || s[i + 1] == '-')){ t = i; j++; };
    }
    udalenie();
}
double sr_geom()
{
    double m1 = mas[0], m2 = mas[0]; int im1 = 0, im2 = 0;
    for (int i = 1; i < razm; i++){ if (mas[i] >= m1){ m1 = mas[i]; im1 = i; }; if (mas[i] <= m2){ m2 = mas[i]; im2 = i; } }
    double sr = 1;
    if (im1>im2)for (int i = im2 + 1; i < im1; i++)sr = sr*(mas[i]); else for (int i = im1 + 1; i < im2; i++)sr = sr*(mas[i]);
    return sqrt(sr);
}
 
void main()
{
    setlocale(0, "");
    string name;
    cout << "Введите имя файла,из которого прочитать массив" << endl;
    cin >> name;
    ifstream fcin(name);
    while (fcin){ getline(fcin, s); }
    razm = s.size(); mas = new double[razm];
    for (int i = 0; i < razm; i++) mas[i] = 1;
    if (proverka() == 0)cout << "Файл из целых чисел" << endl;
    else cout << "Файл не из целых чисел" << endl;
    preobr();
    double y = sr_geom();
    string nameout;
    cout << "Введите имя файла,в который записать результат" << endl;
    cin >> nameout;
    ofstream fout(nameout);
    fout << "Среднее геометрическое: " << endl;
    fout << y;
    _getch();
}
Ребят, помогите пожалуйста с программой.
Условие:Определите максимум (М1) и минимум (М2) в массиве. Выведите в файл среднее геометрическое положительных четных чисел, расположенных в массиве между М1 и М2.
Помогите изменить программу так, чтоб выводило "среднее геометрическое положительных четных чисел" в массиве между М1 и М2,а не просто всех чисел от М1 к М2(как сейчас).
Заранее спасибо!!!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,075
Записей в блоге: 15
26.06.2014, 12:37     Определите максимум (М1) и минимум (М2) в массиве #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int maxPos(double* arr, int sz)
{
max = arr[0]; // В качестве начального значения берем первый элемент массива
pos = 0;
for (int i = 1; i < sz; ++i) // Цикл по всем элементам, кроме первого, про который нам и так все известно
 if (arr[i] > max)
  {
  max = arr[i];
  pos = i;
  }
return pos;
}
// Аналогично minPos
double geomMid(double* arr, int sz)
{
int M1Pos = maxPos(arr, sz); // Позиция максимального элемента
int M2Pos = minPos(arr, sz); // Позиция минимального элемента
int start = std::min(M1Pos, M2Pos); // Начало - минимум из этих значений (можно также посчитать с помощью if/else или тернарного оператора "?:" )
int finish = std::max(M1Pos, M2Pos); // Конец - максимум
double prod = 1; // Произведение всех нужных чисел
for (int i = start + 1; i < finish; ++i) // Цикл по всем элементам, лежащими между start и finish (не включительно)
 if (arr[i] > 0 && arr[i] % 2 == 0) // Если элемент положительный и остаток от деления на 2 равен 0 (четный)
  prod *= arr[i]; // Умножаем произведение на него
double power = 1.0 / (finish - start - 1); // Корень n-й степени - это число в степени 1/n
return pow(prod, power); // Корень степени "число элементов между стартом и финишем не включительно"
}
VGM
0 / 0 / 0
Регистрация: 25.06.2014
Сообщений: 6
26.06.2014, 15:04  [ТС]     Определите максимум (М1) и минимум (М2) в массиве #3
Гром, можете подсказать, что делать в таком случае, когда в
Цитата Сообщение от Гром Посмотреть сообщение
if (arr[i] > 0 && arr[i] % 2 == 0)
выскакивает ошибка:Выражение должно относиться к целочисленному типу или типу перечисления без области видимости?
Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,075
Записей в блоге: 15
26.06.2014, 15:52     Определите максимум (М1) и минимум (М2) в массиве #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
VGM, ах да, там же берется остаток от деления, значит это должно быть целое число. Для вещественных чисел вообще нельзя сказать, четные ли они. Тип элементов массива нужно поменять на int, а с типом double оставить только prod.
VGM
0 / 0 / 0
Регистрация: 25.06.2014
Сообщений: 6
26.06.2014, 17:12  [ТС]     Определите максимум (М1) и минимум (М2) в массиве #5
Гром,большое спасибо, а еще вопрос: что засылать в ф-ю geomMid фактическими параметрами в main?
Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,075
Записей в блоге: 15
26.06.2014, 18:59     Определите максимум (М1) и минимум (М2) в массиве #6
VGM, в ваших обозначениях - mas и razm. Я бы вообще сделал их локальными переменными в функции main и передавал бы в качестве аргументов всем функциями, в которых они используются.

Кстати, не проще ли читать из файла данные так:
C++
1
2
3
4
fcin >> razm;
mas = new int[razm];
for (int i = 0; i < razm; ++i)
 fcin >> mas[i];
предполагая, что файл имеет структуру такого типа:
Код
5
1 2 3 4 5
Т.е. вначале (для читабельности - первой строкой, хотя программе это не важно) идет количество элементов, потом они по порядку.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2014, 21:06     Определите максимум (М1) и минимум (М2) в массиве
Еще ссылки по теме:

Найти максимум и минимум в двумерном массиве C++
C++ Найти максимум и минимум в массиве, отсортировать массив
C++ В одномерном массиве найти максимум/минимум, среднее арифметическое

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
VGM
0 / 0 / 0
Регистрация: 25.06.2014
Сообщений: 6
26.06.2014, 21:06  [ТС]     Определите максимум (М1) и минимум (М2) в массиве #7
Гром, Извиняюсь, название заголовка было изменено модератором, В условии еще сказано, что массив считывается с файла и его размер заранее неизвестен, так что
Цитата Сообщение от Гром Посмотреть сообщение
fcin >> razm;
mas = new int[razm];
for (int i = 0; i < razm; ++i)
*fcin >> mas[i];
использовать нельзя.
Yandex
Объявления
26.06.2014, 21:06     Определите максимум (М1) и минимум (М2) в массиве
Ответ Создать тему
Опции темы

Текущее время: 03:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru