Хорошие задачки стали давать в универах. Составные =)
Вычислить среднее арифметическое элементов массива X=(x1,x2,…,xn),
расположенных между его минимальным и максимальным значениями.
Если минимальный элемент размещается в массиве раньше
максимального, то упорядочить массив на данном промежутке по
возрастанию его элементов, и наоборот, если минимальный элемент
размещается после максимального, то упорядочить по убыванию.
PS: Нельзя использовать динамическую память :(
Задача на самом деле не задача, а состоящая из трех подзадач:
- Найти минимальный и максимальный элементы и их индексы
- Вычислить среднее арифметическое для этого промежутка
- Отсортировать промежуток по возростанию или убыванию в зависимости от того, как расположены минимальный и максимальный элементы.
Не хочу читать! Хочу исходный код!
Нахождение минимального и максимального элементов массива.
Я это делал тут (и наверное тут), но можно лучше, поэтому решил переписать код по-правильному что ли.
Для того, чтобы найти минимальный и максимальный элементы и их индексы, значения этих элементов таскать с собой не надо. Можно оперировать только с индексами, так как при помощи индекса можно обратиться к значению ячейки массива. Код получился такой:
imin = 0;
imax = 0;
for (int i = 0; i < n; i++)
{
if (arr[i] <= arr[imin])
{
imin = i;
}
if (arr[i] > arr[imax])
{
imax = i;
}
}
Если разобрать его построчно, то будет так:
- Сначала присваиваем переменным, в которых будут индексы минимального и максимального элементов 0. Считаем, что все находится в 0-ой ячейке.
- Пробегаем по всему массиву, благо он маленький, и смотрим, если текущий элемент массива стал меньше чем элемент с индексом imin (для этого обращаемся по индексу к элементу), то переприсваиваем индекс. Тоже самое и с максимальным, только знак другой.
Примечание: int n — длина массива; int imin, imax — индексы минимального и максимального элементов соответственно. arr[] — массив
Вычислить среднее арифметическое для этого промежутка
Для второго шага будет круто использовать функцию. Так как нам нужно найти среднее значение между минимальным и максимальным элементам, то в функцию следует передать: ссылку на массив (массив), индекс минимального и индекс максимального элементов.
Дальше нужно пройтись по этим элементам и просчитать. Но фишка в том, что максимальный элемент может идти до минимального, и цикл выполняться не будет. Понадобится условие и 2 разных цикла.
double getAverage (int * arr, int imin, int imax)
{
int sum = 0,
_count = 0;
if (imin < imax)
{
for (int i = imin; i <= imax; i++)
{
sum += arr[i];
_count++;
}
}
else
{
for (int i = imax; i <= imin; i++)
{
sum += arr[i];
_count++;
}
}
return sum / _count * 1.0;
}
Мне кажется, что весьма очевидно, что делает эта функция.
Отсортировать промежуток по возростанию или убыванию в зависимости от того, как расположены минимальный и максимальный элементы.
Последнее, что нужно сделать — выполнить сортировку. Алгоритм не указан. Взял первый попавшийся и слегка его модифицировал. Сделал из него функцию (по-хорошеу конечно процедуру, но да ладно):
void sort(int * arr, int f, int t, bool order) {
for (int i=f; i<t-1; i++)
{
int min=i;
for (int j=i+1; j<t; j++)
{
if (order ^ arr[min] > arr[j])
{
min=j;
}
}
int temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
на вход подается массив (так же как и в функцию вычисления среднего арифметического) число f (first) — с какого индекса начинать сортировку и t (to) до какого индекса производить сортировку. Последний параметр order определяет порядок сортировки (по возрастанию или по убыванию).
На самом деле он самый интересный в этой функции. Порядок сортировки зависит от знака в условии. > или <. Order — логическая переменная и второе выражение тоже логическое выражение. Если применить к нему операцию XOR (логическое отрицание, значек ^, то знак развернется)
Собрав все воедино можно получить такой код:
#include "stdafx.h"
#include <time.h>
#include <stdlib.h>
#include <iostream>
#include <locale>
#define SIZE 200
using namespace std;
double getAverage (int * arr, int imin, int imax)
{
int sum = 0,
_count = 0;
if (imin < imax)
{
for (int i = imin; i <= imax; i++)
{
sum += arr[i];
_count++;
}
}
else
{
for (int i = imax; i <= imin; i++)
{
sum += arr[i];
_count++;
}
}
return sum / _count * 1.0;
}
void sort(int * arr, int f, int t, bool order) {
for (int i=f; i<t-1; i++)
{
int min=i;
for (int j=i+1; j<t; j++)
{
if (order ^ arr[min] > arr[j])
{
min=j;
}
}
int temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "Russian");
int arr [SIZE],
n = 0,
imax =0,
imin =0;
srand(time(NULL));
cout << "Введите n:";
cin >> n;
if (n > SIZE)
{
cout << "n ну очень большой!";
system("pause");
return -1;
}
// Заполнение и вывод
for (int i = 0; i < n; i++)
{
arr[i] = rand() % 10;
cout << arr[i] << " ";
}
// Нахождение минимального и максимального элементов массива
imin = 0;
imax = 0;
for (int i = 0; i < n; i++)
{
if (arr[i] <= arr[imin])
{
imin = i;
}
if (arr[i] > arr[imax])
{
imax = i;
}
}
cout << endl;
cout.precision(4);
cout << "Среднее арифметическое = " << getAverage(arr, imin,imax) << endl;
cout << "Индекс минимального = " << imin << "\nИндекс максимального = " << imax << endl;
if (imin < imax)
{
sort(arr, imin, imax, false);
}
else
{
sort(arr, imax, imin, true);
}
cout << "Массив после сортировки = " << endl;
for (int i = 0; i < n; i++)
{
cout << arr[i] << " ";
}
system("Pause");
return 0;
}
Пример работы программы:
Помогите пожайлуста.Что делать когда нужно подсчитать количество цифер между первим максимальним и последним минимальним (и наоборот-между первим мін і последним макс) если значения в масиве могут повторяться
Привет!
Первый максимальный — точное сравнение. A[i] > max
Последний минимальный это не точное сравнение a[i] <= min Ну а внутри считать. Или мне код накидать ?
Спасибо что откликнулся) Задание стоит следующее -Найти макс и мин значения в массиве, посчитать сколько цифр находится в промежутке между ними. Но возник вопрос так как массив задается рандомно, то что будет, если макс и мин значение будет повторятся несколько раз. Как указать что нужное нам именно первое макс и последнее мин значения.(Например випадают цифри 79,79,6,7,8,9,45,4,-8,-8 и нам нужно первое 79 и последнее — 8)У меня получился такой код.Что нужно добавить еще
#include
#include
using namespace std;
void main()
{
srand(time(0));
const int size=10;
int mas[size];
for(int i=0; i<size;i++)
{
mas[i]=rand()%201-100;
cout<<mas[i]<<endl;
}
int max=mas[0];
int min=mas[0];
for(int i=0;i<size;i++)
{
if(maxmas[i])min=mas[i];
}
int imax=0;
int imin=0;
for(int i=0;imas[imax]) imax=i;
if(mas[i]<=mas[imin])imin=i;
}
int count=0;
if(imin<imax)
{
for(int i=imin; i<imax;i++)count++;
}
else
{
for(int i=imax;i<imin;i++)count++;
}
cout<<endl<<"max "<<max<<endl;
cout<<"index max "<<imax<<endl;
cout<<endl<<"min "<<min<<endl;
cout<<"index min "<<imin<<endl;
cout<<endl<<"count mig min i max "<<count<<endl;
Такая идея:
// ConsoleApplication1.cpp: определяет точку входа для консольного приложения.
//
#include «stdafx.h»
#include
#include
#include
int _tmain(int argc, _TCHAR* argv[])
{
int a[250];
int n = 0, min=32768, max=-32767, maxi, mini;
printf_s(«Enter size of array (1..250):»);
scanf_s(«%d», &n);
srand(time(NULL));
for (int i = 0; i < n; i++) { a[i] = rand() % 10; printf_s("%d ", a[i]); if (a[i] <= min) // последний минимум { min = a[i]; mini = i; } if (a[i] > max) // первый максимум
{
max = a[i];
maxi = i;
}
}
printf_s(«\nlast min = %d in postion %d\nfirst max = %d in position %d\ndigits between %d\n»,min, mini,max, maxi, abs(maxi-mini));
system(«pause»);
return 0;
}
http://pyatnitsev.ru/wp-content/uploads/2014/01/ConsoleApplication1.zip — вот
как осуществить нахождение минимальных и максимальных элементов индекса при помощи ввода массива с клавиатуры, а не с помощью случайного набора?