Как найти отрицательный максимум

Раздел:
Задачи /
Простейшие /

Найти максимальное отрицательное число

Основы программирования 2.0

Основы программирования
Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать.
Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь.
Подробнее…

Условие задачи 1.9

Задача 1.9
Даны три целых числа А, В, С. Вывести на экран максимальное отрицательное число.

Именно так звучит условие этой задачи. И, честно говоря, для меня оно не является однозначным.

Что такое максимальное отрицательное число? Это отрицательное число с наименьшим значением? Или всё-таки это отрицательное число, которое имеет наибольшее значение среди остальных?

Например,

-4, -3, -1

Какое число здесь является максимальным отрицательным? -4 или -1?

Вот ведь, загадили русский язык иностранными словами, а теперь сами не можем понять, о чём говорим)))

Если было сказано — “наибольшее отрицательное число”, то всё было бы понятно. В примере наибольшим является -1.

А максимальное — это с какого конца оси на множестве целых чисел? Вот ведь вопрос…

Если попытаться вспомнить строгие математические термины, то тут будет без бутылки не разобраться, потому что придётся вспоминать всё.

Ну да ладно, приняв во внимание, что на русский язык слово “максимальный” переводится как наибольший, а также вспомнив таки немного математику и учтя, что в случае линейно упорядоченного множества (коим и являются наши числа) максимальный элемент является наибольшим, а минимальный — наименьшим, будем считать, что в нашем примере максимальным отрицательным числом будет -1. Из этого и будем исходить при решении задачи.

Однако, надо обратить внимание также на то, что числа А, В, С могут быть положительными (причём как все, так и некоторые из них).

Вариантов решения, как всегда, немало. Можно, например, сохранить эти числа в
массив и отсортировать его по убыванию. А затем перебрать его элементы до тех пор, пока не попадётся первое отрицательное число. Оно и будет максимальным отрицательным. Если же такого не найдётся, значит отрицательных чисел среди А, В, С не было.

Можно попробовать решить задачу рекурсивно (правда, я не пробовал и даже не думал, может и нельзя)))).

Но мы пойдём другим путём…

Вообще, задачка не такая уж и простая. Начинающему программисту придётся поломать голову (но это и хорошо — только так из начинающих программистов получаются опытные — путём ломания голов))).

Возможно, я нашёл не самые лучшие решения. Но по крайней мере они работают. Вот решения на
Паскале и
С++.

Решение задачи 1.9 на Паскале

program maxneg;
 
//****************************************************************
// КОНСТАНТЫ
//****************************************************************
const
  MAX_VAL = 1000;
 
//****************************************************************
// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
//****************************************************************
var
  A, B, C : Integer;
  Nums    : byte;
 
//****************************************************************
// ФУНКЦИИ И ПРОЦЕДУРЫ
//****************************************************************
 
//****************************************************************
// Возвращает случайное значение
//****************************************************************
function GetRandomNum : Integer;
begin
  Result := Random(MAX_VAL) - ((MAX_VAL div 10) * 7);
end;
 
//****************************************************************
// Сравнивает два числа
// ВХОД: N1, N2 - числа для сравнения
// ВЫХОД: 0 - числа равны
//        1 - число 1 больше числа 2
//        2 - число 2 больше числа 1
//****************************************************************
function GetMax(N1, N2 : integer) : integer;
begin
  Result := 0;
  if (N1 > N2) then Result := 1
  else if (N1 < N2) then Result := 2;
end;
 
//****************************************************************
// Сравнивает три отрицательных числа
// ВХОД: N1, N2, N3 - числа для сравнения
// ВЫХОД: 'A' - наибольшее число N1
//        'B' - наибольшее число N2
//        'C' - наибольшее число N3
//****************************************************************
function GetMaxABC(N1, N2, N3 : integer) : char;
begin
  Result := 'C';
  if GetMax(N1, N2) < 2 then      //Если N1 >= N2
    begin
      if GetMax(N1, N3) < 2 then  //Если N1 >= N3
        Result := 'A';
    end
  else                            //Если N1 < N2
    begin
      if GetMax(N2, N3) < 2 then  //Если N2 >= N3
        Result := 'B';
    end;
end;
 
//****************************************************************
// Определяет знаки чисел и возвращает их в разрядах числа типа BYTE
// ВХОД: na, nb, nc - числа A, B, C
// ВЫХОД: знаки чисел - бит 2 - число na, бит 1 - число nb, бит 0 - число nc
// То есть всего возможны 8 комбинаций:
//   0 - все положительные
//   1 - С < 0
//   2 - B < 0
//   3 - B и С меньше нуля
//   4 - A < 0
//   5 - A и С меньше нуля
//   6 - A и B меньше нуля
//   7 - все отрицательные
//****************************************************************
function GetNumZnak(na, nb, nc : integer) : byte;
var ba, bb, bc  : byte;
begin
  ba := 0;
  bb := 0;
  bc := 0;
  if na < 0 then ba := 4;
  if nb < 0 then bb := 2;
  if nc < 0 then bc := 1;
  Result := ba + bb + bc;
end;
 
//****************************************************************
// Выводит результат на экран
// ВХОД: S - имя числа, N - значение числа
// ВЫХОД: Если N >= 0, то сообщение об отсутствии отрицательных чисел
//        Если N < 0, то имя числа и его значение (число N)
//****************************************************************
procedure NumberToScreen(S : char; N : integer);
begin
  if N < 0 then
    WriteLn('The smallest negative number is ', S, ' = ', N)
  else
    WriteLn('All the numbers are positive');
end;
 
//****************************************************************
// ОСНОВНАЯ ПРОГРАММА
// Алгоритм:
// получить только отрицательные числа
// сравнить эти числа
//****************************************************************
begin
  //Запустить генератор случайных чисел
  Randomize;
 
  //Получить случайные значения для чисел А, В, С
  A := GetRandomNum;
  B := GetRandomNum;
  C := GetRandomNum;
  WriteLn('A = ', A, ', B = ', B, ', C = ', C);
  Nums := GetNumZnak(A, B, C);
 
  case Nums of
  0 :           //Все числа положительные
    NumberToScreen('A', A);
  1 :           //Только С < 0;
    NumberToScreen('C', C);
  2 :           //Только B < 0;
    NumberToScreen('B', B);
  3 :           //B и С меньше нуля
    if GetMax(B, C) < 2 then  //Если B = С или B > C, то
      NumberToScreen('B', B)  //искомое число - это B
    else                      //иначе
      NumberToScreen('C', C); //искомое число - это С
  4 :           //Только A < 0;
    NumberToScreen('A', A);
  5 :           //A и С меньше нуля
    if GetMax(A, C) < 2 then  //Если A = С или A > C, то
      NumberToScreen('A', A)  //искомое число - это A
    else                      //иначе
      NumberToScreen('C', C); //искомое число - это С
  6 :           //A и B меньше нуля
    if GetMax(A, B) < 2 then  //Если A = B или A > B, то
      NumberToScreen('A', A)  //искомое число - это A
    else                      //иначе
      NumberToScreen('B', B); //искомое число - это B
  7 :           //Все числа отрицательные;
    case GetMaxABC(A, B, C) of
    'A' : NumberToScreen('A', A);
    'B' : NumberToScreen('B', B);
    'C' : NumberToScreen('C', C);
    end;
  end;
 
  WriteLn('The end. Press ENTER...');
  ReadLn;
end.

Решение задачи 1.9 на С++

#include 
#include 
 
using namespace std;
 
//****************************************************************
// КОНСТАНТЫ
//****************************************************************
const int MAX_VAL = 1000;  
 
//****************************************************************
// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
//****************************************************************
int A, B, C;
char Nums;
 
//****************************************************************
// ФУНКЦИИ И ПРОЦЕДУРЫ
//****************************************************************
 
//****************************************************************
// Возвращает случайное значение
//****************************************************************
int GetRandomNum()
{
  int n = (MAX_VAL / 10) * 7;
  return(rand()%MAX_VAL - (int)n);
}  
 
//****************************************************************
// Сравнивает два числа
// ВХОД: N1, N2 - числа для сравнения
// ВЫХОД: 0 - числа равны
//        1 - число 1 больше числа 2
//        2 - число 2 больше числа 1
//****************************************************************
int GetMax(int N1, int N2)
{
  int Res = 0;
  if (N1 > N2) Res = 1;
  else if (N1 < N2) Res = 2;
  return(Res);
}
 
//****************************************************************
// Сравнивает три отрицательных числа
// ВХОД: N1, N2, N3 - числа для сравнения
// ВЫХОД: 'A' - наибольшее число N1
//        'B' - наибольшее число N2
//        'C' - наибольшее число N3
//****************************************************************
char GetMaxABC(int N1, int N2, int N3)
{
  char Res = 'C';
  if (GetMax(N1, N2) < 2)       //Если N1 >= N2
    {
      if (GetMax(N1, N3) < 2)   //Если N1 >= N3
        Res = 'A';
    }
  else                          //Если N1 < N2
    {
      if (GetMax(N2, N3) < 2)   //Если N2 >= N3
        Res = 'B';
    }
  return(Res);
}
 
//****************************************************************
// Определяет знаки чисел и возвращает их в разрядах числа типа BYTE
// ВХОД: na, nb, nc - числа A, B, C
// ВЫХОД: знаки чисел - бит 2 - число na, бит 1 - число nb, бит 0 - число nc
// То есть всего возможны 8 комбинаций:
//   0 - все положительные
//   1 - С < 0
//   2 - B < 0
//   3 - B и С меньше нуля
//   4 - A < 0
//   5 - A и С меньше нуля
//   6 - A и B меньше нуля
//   7 - все отрицательные
//****************************************************************
char GetNumZnak(int na, int nb, int nc)
{
  int ba = 0;
  int bb = 0;
  int bc = 0;
  if (na < 0) ba = 4;
  if (nb < 0) bb = 2;
  if (nc < 0) bc = 1;
  return(ba + bb + bc);
} 
 
//****************************************************************
// Выводит результат на экран
// ВХОД: S - имя числа, N - значение числа
// ВЫХОД: Если N >= 0, то сообщение об отсутствии отрицательных чисел
//        Если N < 0, то имя числа и его значение (число N)
//****************************************************************
void NumberToScreen(char S, int N)
{
  if (N < 0)
    cout << "The smallest negative number is " << S << " = " << N << endl;
  else
    cout << "All the numbers are positive" << endl;;
}         
 
//****************************************************************
// ОСНОВНАЯ ПРОГРАММА
//****************************************************************
int main(int argc, char *argv[])
{
  //Запустить генератор случайных чисел   
  srand(time(0));         
  
  //Получить случайные значения для чисел А, В, С
  A = GetRandomNum();
  B = GetRandomNum();
  C = GetRandomNum();
  cout << "A = " << A << ", B = " << B << ", C = " << C << endl;
  Nums = GetNumZnak(A, B, C);
 
  switch(Nums)
  {
  case 0 :                     //Все числа положительные
    NumberToScreen('A', A);
    break;
  case 1 :                     //Только С < 0;
    NumberToScreen('C', C);
    break;
  case 2 :                     //Только B < 0;
    NumberToScreen('B', B);
    break;
  case 3 :                     //B и С меньше нуля
    if (GetMax(B, C) < 2)      //Если B = С или B > C, то
      NumberToScreen('B', B);  //искомое число - это B
    else                       //иначе
      NumberToScreen('C', C);  //искомое число - это С
    break;
  case 4 :                     //Только A < 0;
    NumberToScreen('A', A);
    break;
  case 5 :                     //A и С меньше нуля
    if (GetMax(A, C) < 2)      //Если A = С или A > C, то
      NumberToScreen('A', A);  //искомое число - это A
    else                       //иначе
      NumberToScreen('C', C);  //искомое число - это С
    break;
  case 6 :                     //A и B меньше нуля
    if (GetMax(A, B) < 2)      //Если A = B или A > B, то
      NumberToScreen('A', A);  //искомое число - это A
    else                       //иначе
      NumberToScreen('B', B);  //искомое число - это B
    break;
  case 7 :                     //Все числа отрицательные;
    switch(GetMaxABC(A, B, C))
    {
      case 'A' : NumberToScreen('A', A); break;
      case 'B' : NumberToScreen('B', B); break;
      case 'C' : NumberToScreen('C', C); break;
    }
  }    
  
  system("PAUSE");
  return EXIT_SUCCESS;
}

Как стать программистом 2.0

Как стать программистом 2.0

Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки…
Подробнее…

Помощь в технических вопросах

Помощь в технических вопросах

Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение — ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации.
Подробнее…

Максимальный отрицательный элемент массива

Просмотров 7.5к. Обновлено 15 октября 2021

В массиве найти максимальный отрицательный элемент. Вывести на экран его значение и позицию в массиве.

Задача поиска максимального отрицательного элемента массива не такая простая, как может показаться на первый взгляд.

Введем переменную (условно назовем ее A) для хранения индекса максимального отрицательного элемента и присвоим ей значение, выходящее за пределы возможных индексов. Например, если индексация элементов начинается с нуля, то данной переменной можно присвоить значение -1 (можно присвоить 0, если индексация начинается с 1). Если в массиве вообще не будет найдено отрицательных элементов, то ее такое значение будет «сигнализировать» об этом.

Перебираем массив в цикле. Если очередной элемент меньше нуля и значение переменной A равно -1, то значит, это первый встретившийся отрицательный элемент. Запоминаем его индекс в переменной A. Если же очередной элемент отрицательный, но A уже не содержит -1, то сравниваем значение текущего элемента с тем, которое содержится по индексу, хранимому в A. Если текущий элемент больше, то записываем его индекс в A.

После завершения цикла проверяем, не равно ли значение A -1. Если не равно, то выводим индекс максимального отрицательного элемента массива и его значение.

Pascal

максимальное отрицательное число паскаль


const N = 15;
var
arr: array[1..N] of integer;
i: byte;
index: byte;
begin
randomize;
for i:=1 to N do begin
arr[i] := random(100) - 50;
write(arr[i],' ');
end;
writeln;

index := 0;
for i:=1 to N do begin
if (arr[i] < 0) and (index = 0) then
index := i
else
if (arr[i] < 0) and (arr[i] > arr[index]) then
index := i;
end;
if index <> 0 then
writeln(index,': ',arr[index]);
end.



-36 0 -35 -15 2 -43 -18 -4 -6 -24 -30 -28 47 18 41
8: -4

Язык Си


#include < stdio.h>
#define N 15

main() {
int arr[N],index, i;
srand(time(NULL));
for (i=0; i< N; i++) {
arr[i] = rand() % 100 - 50;
printf("%d ", arr[i]);
}
printf("n");

index = -1;
for (i=0; i< N; i++) {
if (arr[i] < 0 && index == -1)
index = i;
else
if (arr[i] < 0 && arr[i] > arr[index])
index = i;
}
printf("%d-й = %dn",index+1,arr[index]);
}



33 -21 24 -36 42 -11 -6 42 32 36 -1 43 -8 24 40
11-й = -1

Python

максимальное отрицательное число python (питон)


from random import random
N = 15
arr = []
for i in range(N):
arr.append(int(random() * 100) - 50)
print(arr)

i = 0
index = -1
while i < N:
if arr[i] < 0 and index == -1:
index = i
elif arr[i] < 0 and arr[i] > arr[index]:
index = i
i += 1

print(index+1,':', arr[index])



[-30, 42, -5, 31, -37, 25, -50, -44, 17, -34, -33, -21, 48, 45, 15]
3 : -5

КуМир


алг чет_нечет
нач
цел N = 15
целтаб arr[1:N]
цел i, index

нц для i от 1 до N
arr[i] := irnd(100) - 50
вывод arr[i], " "
кц
вывод нс

index := 0
нц для i от 1 до N
если arr[i] < 0 и index = 0 то
index := i
иначе
если arr[i] < 0 и arr[i] > arr[index] то
index := i
все
все
кц
вывод index, ": ", arr[index], нс
кон



19 32 36 -15 -22 3 48 -42 3 -2 -6 -48 33 27 6
10: -2

Basic-256


N = 15
dim arr(N)
for i=0 to N-1
arr[i] = int(rand() * 100) - 50
print arr[i] + " ";
next i
print

index = -1
for i=0 to N-1
if arr[i] < 0 then
if index = -1 then
index = i
else
if arr[i] > arr[index] then
index = i
endif
endif
endif
next i

print index+1;
print ": ";
print arr[index]



17 31 -21 24 -8 29 7 42 13 -15 -30 30 33 32 -7
15: -7

Проверка отрицательности элемента вынесена в отдельную ветку if. Иначе возникает ошибка, когда первый элемент неотрицательный, т.к. в Basic-256 при логическом операторе and происходит проверка второго условия даже если первое ложное. И получается, что переменная index отрицательна, что вызывает ошибку выхода за границы массива.

Минимумом называют точку на функции, в которой значение функции меньше, чем в соседних точках.

Максимумом называют точку на функции, в которой значение функции больше, чем в соседних точках.

Также можно сказать, что в этих точках меняется направление движения функции: если функция перестает падать и начинает расти – это точка минимума, наоборот – максимума.

на графике функции отмечены локальные минимумы и максимумы

Минимумы и максимумы вместе именуют экстремумами функции.

Иными словами, все пять точек, выделенных на графике выше, являются экстремумами.

В точках экстремумов (т.е. максимумов и минимумов) производная
равна нулю.

Благодаря этому найти эти точки не составляет проблем, даже если у вас нет графика функции.

Внимание! Когда пишут экстремумы или максимумы/минимумы имеют в виду значение функции т.е. (y). Когда пишут точки экстремумов или точки максимумов/минимумов имеют в виду иксы в которых достигаются максимумы/минимумы. Например, на рисунке выше, (-5) точка минимума (или точка экстремума), а (1) – минимум (или экстремум).

Как найти точки экстремумов функции по графику производной (7 задание ЕГЭ)?

Давайте вместе найдем количество точек экстремума функции по графику производной на примере:

найдите количество точек экстремумов функции

У нас дан график производная — значит ищем в каких точках на графике производная равна нулю. Очевидно, это точки (-13), (-11), (-9),(-7) и (3). Количество точек экстремума функции – (5).

Внимание! Если дан график производной функции, а нужно найти точки экстремумов функции, мы не считаем максимумы и минимумы производной! Мы считаем точки, в которых производная функции обращается в ноль (т.е. пересекает ось (x)).

на графике функции отмечены локальные минимумы и максимумы         график производной и отмеченные на ней точки минимумов и максимумов функции

Как найти точки максимумов или минимумов функции по графику производной (7 задание ЕГЭ)?

Чтобы ответить на этот вопрос, нужно вспомнить еще два важных правил:

— Производная положительна там, где функция возрастает.
— Производная отрицательна там, где функция убывает.

С помощью этих правил давайте найдем на графике производной точки минимума и максимума функции.

найдите количество точек экстремумов функции

Понятно, что минимумы и максимумы надо искать среди точек экстремумов, т.е. среди (-13), (-11), (-9),(-7) и (3).

Чтобы проще было решать задачу расставим на рисунке сначала знаки плюс и минус, обозначающие знак производной. Потом стрелки – обозначающие возрастание, убывания функции.

по графику производной определить минимумы и максимумы функции

Начнем с (-13): до (-13) производная положительна т.е. функция растет, после — производная отрицательна т.е. функция падает. Если это представить, то становится ясно, что (-13) – точка максимума.

(-11): производная сначала положительна, а потом отрицательна, значит функция возрастает, а потом убывает. Опять попробуйте это мысленно нарисовать и вам станет очевидно, что (-11) – это минимум.

(- 9): функция возрастает, а потом убывает – максимум.

(-7): минимум.

(3): максимум.

Все вышесказанное можно обобщить следующими выводами:

— Функция имеет максимум там, где производная равна нулю и меняет знак с плюса на минус.
— Функция имеет минимум там, где производная равна нулю и меняет знак с минуса на плюс.

Как найти точки максимумов и минимумов если известна формула функции (12 задание ЕГЭ)?

Чтобы ответить на этот вопрос, нужно делать все то же, что и в предыдущем пункте: находить где производная положительна, где отрицательна и где равна нулю. Чтобы было понятнее напишу алгоритм с примером решения:

  1. Найдите производную функции (f'(x)). 
  2. Найдите корни уравнения (f'(x)=0). 
  3. Нарисуйте ось (x) и отметьте на ней точки полученные в пункте 2, изобразите дугами промежутки, на которые разбивается ось. Подпишите над осью (f'(x)), а под осью (f(x)).
  4. Определите знак производной в каждом промежутке (методом интервалов). 
  5. Поставьте знак производной в каждом промежутке (над осью), а стрелкой укажите возрастание (↗) или убывание (↘) функции (под осью). 
  6. Определите, как изменился знак производной при переходе через точки, полученные в пункте 2:
    — если (f’(x)) изменила знак с «(+)» на «(-)», то (x_1) – точка максимума;
    — если (f’(x)) изменила знак с «(-)» на «(+)», то (x_3) – точка минимума;
    — если (f’(x)) не изменила знак, то (x_2) – может быть точкой перегиба.

нахождение минимума и максимума

Всё! Точки максимумов и минимумов найдены.

Изображая на оси точки в которых производная равна нулю – масштаб можно не учитывать. Поведение функции можно показать так, как это сделано на рисунке ниже. Так будет очевиднее где максимум, а где минимум.

схематичное изображение функции

Пример(ЕГЭ). Найдите точку максимума функции (y=3x^5-20x^3-54).
Решение:
1. Найдем производную функции: (y’=15x^4-60x^2).
2. Приравняем её к нулю и решим уравнение:

(15x^4-60x^2=0)      (|:15)
(x^4-4x^2=0)
(x^2 (x^2-4)=0)
(x=0)       (x^2-4=0)
               (x=±2)

3. – 6. Нанесем точки на числовую ось и определим, как меняется знак производной и как движется функция:

поиск минимумов и максимумов

Теперь очевидно, что точкой максимума является (-2).

Ответ. (-2).

Смотрите также:
Связь функции и её производной | 7 задача ЕГЭ
Разбор задач на поиск экстремумов, минимумов и максимумов

Скачать статью

I have a column of type number. It has both positive and negative values. I need to get 4 values : Positive Maximum,Positive Minimum, Negative Maximum,Negative Minimum:

a)To get Positive Maximum : I can use Check out the Fiddle

select max(cola) from test;

b)To get Negative Minimum: I can use Check out the Fiddle

select min(cola) from test;

I have two question here:

1)Now i’m not sure how to get the other two values. Guide me to get that

2)Meanwhile while trying this i got another doubt. When i have some column of type varchar2 and it has numbers as value. I’m performing the above operation in this column. Positive maximum is same as above. But Negative minimum is quiet weird. Check Fiddle Here .Why there is no proper implicit conversion is taking place here. Somebody pls explain the reason behind this?

Lalit Kumar B's user avatar

Lalit Kumar B

47.3k13 gold badges96 silver badges123 bronze badges

asked Aug 5, 2015 at 11:03

Arun Palanisamy's user avatar

Arun PalanisamyArun Palanisamy

5,2056 gold badges28 silver badges52 bronze badges

1

For question 1, you can easily use case to determine which values you do the min/max on. E.g.:

select max(case when cola >= 0 then cola end) max_positive,
       min(case when cola >= 0 then cola end) min_positive,
       max(case when cola < 0 then cola end) max_negative,
       min(case when cola < 0 then cola end) min_negative
from   test;

For question 2, when you do the min/max on something that’s a varchar, you’re going to be doing string comparisons, NOT number comparisons. You have to explicitly convert the values to numbers, since Oracle doesn’t know that you expected an implicit conversion to take place. And you shouldn’t really rely on implicit conversions anyway. E.g.:

select max(case when to_number(cola) >= 0 then to_number(cola) end) max_positive,
       min(case when to_number(cola) >= 0 then to_number(cola) end) min_positive,
       max(case when to_number(cola) < 0 then to_number(cola) end) max_negative,
       min(case when to_number(cola) < 0 then to_number(cola) end) min_negative
from   test1;

Here’s the SQLFiddle for both cases.

N.B. I’ve explicitly split out both negative and positive values (I stuck 0 in with the positive numbers; you’ll have to decide how you want to treat rows with a value of 0!), just in case there were no negative numbers or no positive numbers.

answered Aug 5, 2015 at 11:14

Boneist's user avatar

3

use case expressions within the aggregation functions.

e.g.

max(when cola < 0 then cola end) max_neg

min(cola) min_neg — no need for case expression here

SQL Fiddle

Oracle 11g R2 Schema Setup:

Create table test(COLA number);

Insert into test values(1);
Insert into test values(50);
Insert into test values(-65);
Insert into test values(25);
Insert into test values(-2);
Insert into test values(-8);
Insert into test values(5);
Insert into test values(-11);

Create table test1(COLA varchar2(10));

Insert into test1 values('1');
Insert into test1 values('50');
Insert into test1 values('-65');
Insert into test1 values('25');
Insert into test1 values('-2');
Insert into test1 values('-8');
Insert into test1 values('5');
Insert into test1 values('-11');

Query 1:

select
      max(case when cola < 0 then cola end) max_neg_cola
    , min(cola) 
    , min(case when cola > 0 then cola end) min_pos_cola
    , max(cola) 
from test

Results:

| MAX_NEG_COLA | MIN(COLA) | MIN_POS_COLA | MAX(COLA) |
|--------------|-----------|--------------|-----------|
|           -2 |       -65 |            1 |        50 |

answered Aug 5, 2015 at 11:07

Paul Maxwell's user avatar

Paul MaxwellPaul Maxwell

31.4k3 gold badges32 silver badges51 bronze badges

1

1)Now i’m not sure how to get the other two values.

Use CASE expression.

SQL> SELECT MAX(
  2    CASE
  3      WHEN cola >= 0
  4      THEN cola
  5    END) max_positive,
  6    MIN(
  7    CASE
  8      WHEN cola >= 0
  9      THEN cola
 10    END) min_positive,
 11    MAX(
 12    CASE
 13      WHEN cola < 0
 14      THEN cola
 15    END) max_negative,
 16    MIN(
 17    CASE
 18      WHEN cola < 0
 19      THEN cola
 20    END) min_negative
 21  FROM test;

MAX_POSITIVE MIN_POSITIVE MAX_NEGATIVE MIN_NEGATIVE
------------ ------------ ------------ ------------
          50            1           -2          -65

SQL>

2)Meanwhile while trying this i got another doubt. When i have some column of type varchar2 and it has numbers as value. I’m performing the above operation in this column. Positive maximum is same as above. But Negative minimum is quiet weird.

You need to first convert the STRING into NUMBER and then use the same query. For less typing of to_number every time, you could use WITH clause.

NOTE You must only have numbers in this column, and no alphanumeric. Else, be sure to get ORA-01722: invalid number error.

SQL> WITH t AS
  2    ( SELECT to_number(cola) cola FROM test1
  3    )
  4  SELECT MAX(
  5    CASE
  6      WHEN cola >= 0
  7      THEN cola
  8    END) max_positive,
  9    MIN(
 10    CASE
 11      WHEN cola >= 0
 12      THEN cola
 13    END) min_positive,
 14    MAX(
 15    CASE
 16      WHEN cola < 0
 17      THEN cola
 18    END) max_negative,
 19    MIN(
 20    CASE
 21      WHEN cola < 0
 22      THEN cola
 23    END) min_negative
 24  FROM t;

MAX_POSITIVE MIN_POSITIVE MAX_NEGATIVE MIN_NEGATIVE
------------ ------------ ------------ ------------
          50            1           -2          -65

SQL>

answered Aug 5, 2015 at 11:21

Lalit Kumar B's user avatar

Lalit Kumar BLalit Kumar B

47.3k13 gold badges96 silver badges123 bronze badges

0

To get positive minimum value try this..

select min(cola) from test where cola>0;

To get negative maximum value try this..

select max(cola) from test where cola<0;

obourgain's user avatar

obourgain

8,7366 gold badges42 silver badges56 bronze badges

answered Aug 5, 2015 at 11:15

nitish mishra's user avatar

Часто случается, что в одном диапазоне ячеек находятся вместе положительные и отрицательные числа. Необходимо определить экстремальные значения, но с определенными условиями. Следует получить наименьшее значение для положительных чисел и отдельно для отрицательных. Для решения данной задачи не достаточно просто использовать функции =МИН(), =МАКС() или =НАИМЕНЬШИЙ(), =НАИБОЛЬШИЙ(). Иначе при обращении функций к диапазону с перемешанными положительными и отрицательными числами, будет возвращено только отрицательное наименьшее значение. Поэтому следует использовать специальную формулу с функциями.

Наименьшее положительное число

Допустим у нас есть статистика доходов и расходов сети магазинов за месяц. А нам нужно узнать какие из торговых точек наименее затратные по расходам и наименее прибыльны по доходам. Для презентации решения будем использовать пример таблицы с доходами и расходами магазинов как показано на рисунке:

Доходы и расходы.

В первую очередь следует найти наименьший доход. Для этого формула должна сначала рассмотреть группу, состоящую только из положительных. После чего найдите наименьшее положительное значение функции. Для этого:

  1. В ячейке D2 введем следующую формулу:
  2. После ввода формулы для подтверждения необходимо нажать комбинацию горячих клавиш: CTRL+SHIFT+Enter, так как она должна выполняться в массиве. Если все сделано правильно тогда в строке формул будут видны фигурные скобки.

Минимальный доход.

Разбор принципа действия формулы для поиска наименьшего положительного числа:

Логическая функция =ЕСЛИ(), которая выполняется в массиве формул, проверяет каждую ячейку диапазона C2:C13 какая из них содержит число меньше чем 0 или равно нулю (<=0). Таким образом создается условная таблица в памяти с логическими значениями:

  • ЛОЖЬ – для положительных чисел (в данном случаи и для нуля);
  • ИСТИНА – для отрицательных чисел.

После чего в условной таблице функция ЕСЛИ заменяет все значения ИСТИНА на пустые (””). А вместо значения ЛОЖЬ подставляются те числа положительные, которые и были раньше в диапазоне C2:C13. И завершает вычисления формулы функция =МИН(), которая из условной таблицы (уже отфильтрованной от отрицательных значений и нулей) возвращает нам наименьшее положительное число.



Наибольшее отрицательное число в диапазоне ячеек

Чтобы найти наименьшие расходы среди отрицательных значений укажите наибольшее. Для этого следует выполнить следующие действия:

  1. В ячейке E2 введите формулу:
  2. Так же, как и предыдущей формуле после ввода необходимо нажать комбинацию клавиш: CTRL+SHIFT+Enter, так как она должна выполняться в массиве. Если все сделано правильно в строке формул появятся фигурные скобки.

Минимальный расход.

Скачать формулы для поиска наименьшего положительного и наибольшего отрицательного числа

В результате мы быстро и легко переделили самый слабый магазин по доходам – это №4. А наименее затратная торговая точка по расходам – это магазин №2.

Понравилась статья? Поделить с друзьями:
  • Как найти путь до файла питон
  • Как исправить текст для печати
  • Как найти точки вектора на графике
  • Как в дампе биоса найти серийный номер
  • Как найти обхват пальца