Как найти наибольший по модулю элемент массива

Перейти к содержанию

Найти максимальный по модулю элемент в массиве с уникальными по модулю значениями

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

Абсолютное значение каждого нового числа перед помещением в массив надо сравнить с абсолютными значениями всех чисел, которые уже были добавлены в массив. Если хотя бы в одном сравнении числа совпадут, то новое число не следует добавлять в массив. Если же совпадений не было, то число добавляется массив по текущему индексу, после чего индекс увеличивается на 1.

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

Pascal


const N = 15;
var
arr: array[1..N] of integer;
i, j: byte;
m: integer;
flag: boolean;
begin
randomize;
arr[1] := random(40) - 20;
i := 2;
while i <= N do begin
m := random(40) - 20;
flag := true;
for j:=1 to i-1 do
if abs(arr[j]) = abs(m) then begin
flag := false;
break;
end;
if flag = true then begin
arr[i] := m;
i := i + 1;
end;
end;

j := 1;
for i:=1 to N do begin
write(arr[i]:4);
if abs(arr[i]) > abs(arr[j]) then
j := i;
end;
writeln;
writeln('Максимальный по модулю ', j, '-й элемент равен ', arr[j]);
end.



-1 6 -17 -2 5 -12 -16 -8 -18 9 7 -4 -13 -19 14
Максимальный по модулю 14-й элемент равен -19

Язык Си


#include
#define N 15
main() {
int arr[N], m;
char i,j,f;
srand(time(NULL));
arr[0] = rand()%40 - 20;
i = 1;
while (i < N) {
m = rand()%40 - 20;
f = 1;
for (j=0; j < i; j++)
if (abs(arr[j]) == abs(m)) {
f = 0;
break;
}
if (f == 1) {
arr[i] = m;
i += 1;
}
}
j = 0;
for (i=0; i < N; i++) {
printf("%d ", arr[i]);
if (abs(arr[i]) > abs(arr[j]))
j = i;
}
printf("n");
printf("Максимальный по модулю %d-й элемент равен %dn", j, arr[j]);
}



-2 17 -15 -11 -19 -5 -4 12 13 -3 0 7 -18 -20 8
Максимальный по модулю 13-й элемент равен -20

Python


from random import random
N = 15
m = int(random() * 40) - 20
arr = [m]
i = 1
while i < N:
m = int(random() * 40) - 20
f = 1
for j in arr:
if abs(j) == abs(m):
f = 0
break
if f == 1:
arr.append(m)
i += 1
print(arr)
j = 0
for i in range(1, 15):
if abs(arr[i]) > abs(arr[j]):
j = i
print('Максимальный по модулю %d-й элемент равен %d' % (j,arr[j]))



[-20, 5, 8, -1, -19, -2, -14, 16, 4, 10, -9, 13, -11, 7, -6]
Максимальный по модулю 0-й элемент равен -20

КуМир


алг максимальный уникальный
нач
цел N = 15
цел таб arr[1:N]
цел i,j,m,f
arr[1] := int(rand(0,40)) - 20
i := 2
нц пока i <= N
m := int(rand(0,40)) - 20
f := 1
нц для j от 1 до i-1
если abs(arr[j]) = abs(m) то
f := 0
выход
все
кц
если f = 1 то
arr[i] := m
i := i + 1
все
кц

j := 1;
нц для i от 1 до N
вывод arr[i], " "
если abs(arr[i]) > abs(arr[j]) то
j := i
все
кц
вывод нс, "Максимальные по модулю ", j, "-й элемент равен ", arr[j]
кон



17 14 -18 13 5 10 7 -9 -1 -6 -12 2 4 -3 0
Максимальные по модулю 3-й элемент равен -18

Basic-256


N = 15
dim arr(N)
arr[0] = int(rand*40) - 20
i = 1
while i < N
m = int(rand*40) - 20
f = 1
for j=0 to i-1
if abs(arr[j]) = abs(m) then
f = 0
endif
next j
if f = 1 then
arr[i] = m
i = i + 1
endif
endwhile
j = 0
for i=0 to N-1
print arr[i] + " ";
if abs(arr[i]) > abs(arr[j]) then
j = i
endif
next i
print
print "Максимальный по модулю " + j + "-й элемент равен " + arr[j]



-17 15 -1 -4 16 12 -3 11 -9 -14 -6 0 -19 -8 10
Максимальный по модулю 12-й элемент равен -19

0 / 0 / 0

Регистрация: 07.11.2011

Сообщений: 8

1

Вычислить максимальный по модулю элемент массива

07.11.2011, 18:44. Показов 5516. Ответов 19


Студворк — интернет-сервис помощи студентам

Заполнить случайными числами от -5 до 5.
В одномерном массиве, состоящем из 10 целых элементов вычислить:
а)максимальный по модулю элемент массива;
б)сумму элементов массива расположенных между первым и вторым положительными элементами.

Преобразовать массив так чтобы все элементы равные 0 распологались после всех остальных

под буквой а, более или менее получилось сделать, но вот остальные два даже в голову не приходит, как должна выглядеть программа.



0



Эксперт С++

4726 / 2547 / 757

Регистрация: 18.08.2009

Сообщений: 4,568

07.11.2011, 19:44

2

Цитата
Сообщение от dlinniy_miron
Посмотреть сообщение

под буквой а, более или менее получилось сделать, но вот остальные два даже в голову не приходит, как должна выглядеть программа.

ну Вы покажите что получилось под буквой а, остальное Вам может быть помогут.



0



0 / 0 / 0

Регистрация: 07.11.2011

Сообщений: 8

07.11.2011, 19:49

 [ТС]

3

ну на экране появлялся массив и ниже строка «nomer elementa = (и тут было число максимального по модулю элемента массива)»



0



LostCoast

82 / 82 / 24

Регистрация: 30.09.2011

Сообщений: 404

Записей в блоге: 6

07.11.2011, 19:51

4

Цитата
Сообщение от dlinniy_miron
Посмотреть сообщение

б)сумму элементов массива расположенных между первым и вторым положительными элементами.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
 
int main()
{
    int mas[10], i, sum = 0, count = 0;
    for(i = 0; i < 10; i++) {
        cout << "mas[" << i << "] = ";
        cin >> mas[i];
    }
    for(i = 0; i < 10; i++) {
        if (mas[i] >= 0) 
            i++;
            while (mas[i] < 0) {
                sum += mas[i];
                i++;
            }
 
    }
        cout << "sum = " << sum << endl;
    return 0;
}

вроде работает.Не проверял все случаи, при каком-то не вычислилась сумма, хотя может глюк.



1



Эксперт С++

4726 / 2547 / 757

Регистрация: 18.08.2009

Сообщений: 4,568

07.11.2011, 19:51

5

dlinniy_miron, а код покажете?



0



DenCHS200

32 / 32 / 8

Регистрация: 07.10.2011

Сообщений: 117

07.11.2011, 20:09

6

Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Такая прога сойдёт?

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
#include <iostream>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    short int first=7,second=7,max,temp,i, array1[10];
    for(i=0;i<10;i++)//Заполняем массив элементами
        array1[i]=rand()%10-5;
    for(i=0;i<10;i++)
        cout<<endl<<array1[i];
 
//Ищем максимальный элемент по модулю
    if(array1[0]>0)
    max=array1[0];
    else max=-array1[0];
 
 
 
    for(i=1;i<10;i++)
    {
    if(array1[i]>=0)
        temp=array1[i];
    else
        temp=-array1[i];
    
    if(max<temp)
        max=temp;
 
    
    }
    cout<<endl<<"Maximum ABS element : "<<max;
    i=-1;   
    //Пункт Б : ищем 2 положительные числа
    //ищем первый положительный элемент
    do{i++;
    if(array1[i]>0)
    first=i;// Заносим номер первого положительного элемента
    }while((array1[i]<=0)&&(i<10));//проверяем, не все ли значения массива перебрали?
    
    do{
        i++;
    if(array1[i]>0)
    second=i;// Заносим номер второго положительного элемента
    }while((array1[i]<=0)&&(i<10));//проверяем, не все ли значения массива перебрали?
    
    if((second==7)||(first==7) )//Если исходные значения чисел first и second не изменились,
        // (а мы их проинициализировали вначале , как 7)то выводим сообщение, что нет двух положительных элементов
    cout<<"We not have two positive elements"<<endl;
    else{
        
    //в противном случае, считаем сумму между двумя этими числами и сохраняем её в переменную max
        max=0;
        for(i=first;i<=second;i++)
        max=max+array1[i];
    cout<<endl<<"SUMMA "<<max;
    
    }
    
    cin>>i;//Вводим любое число и жмём ENTER , чтобы закрыть прогу
    return 0;
}

Добавлено через 14 минут
Извени, забыл про последний пункт, кстати, rand()% всегда одни и те же числа выдаёт, если что, то введи свои

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
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    short int first=7,second=7,max,temp,i, array1[10];
    for(i=0;i<10;i++)//Заполняем массив элементами
        array1[i]=rand()%10-5;
    for(i=0;i<10;i++)
        cout<<endl<<array1[i];
 
//Ищем максимальный элемент по модулю
    if(array1[0]>0)
    max=array1[0];
    else max=-array1[0];
 
 
 
    for(i=1;i<10;i++)
    {
    if(array1[i]>=0)
        temp=array1[i];
    else
        temp=-array1[i];
    
    if(max<temp)
        max=temp;
 
    
    }
    cout<<endl<<"Maximum ABS element : "<<max;
    i=-1;   
    //Пункт Б : ищем 2 положительные числа
    //ищем первый положительный элемент
    do{i++;
    if(array1[i]>0)
    first=i;// Заносим номер первого положительного элемента
    }while((array1[i]<=0)&&(i<10));//проверяем, не все ли значения массива перебрали?
    
    do{
        i++;
    if(array1[i]>0)
    second=i;// Заносим номер второго положительного элемента
    }while((array1[i]<=0)&&(i<10));//проверяем, не все ли значения массива перебрали?
    
    if((second==7)||(first==7) )//Если исходные значения чисел first и second не изменились,
        // (а мы их проинициализировали вначале , как 7)то выводим сообщение, что нет двух положительных элементов
    cout<<"We not have two positive elements"<<endl;
    else{
        
    //в противном случае, считаем сумму между двумя этими числами и сохраняем её в переменную max
        max=0;
        for(i=first;i<=second;i++)
        max=max+array1[i];
    cout<<endl<<"SUMMA "<<max;
    
    }
 
    max=10;//если встретится 0 , то его выводить в массиве начинать с этого элемента
    //затем упорядочиваем так, чтобы нули были последними элементами
    for(i=0;i<10;i++){
    if(array1[i]==0)
    {// просто обмениваем с последними элементами элементами, 
    temp=array1[i];
    array1[i]=array1[max];
    array1[max]=temp;
    max--;// для следующего элемента, который будет иметь на -1 индекс массива ,если встретится ноль
    
    }
    
    }
    // и выводим получившийся массив
    for(i=0;i<10;i++)
        cout<<endl<<array1[i];
 
    
    cin>>i;//Вводим любое число и жмём ENTER , чтобы закрыть прогу
    return 0;
}



0



0 / 0 / 0

Регистрация: 07.11.2011

Сообщений: 8

07.11.2011, 20:11

 [ТС]

7

Цитата
Сообщение от DenCHS200
Посмотреть сообщение

Такая прога сойдёт?

парочка вопросов, если можно))
1. _TCHAR* — это просто переменную ввели я так понимаю?
2. first=7,second=7 — для чего мы устанавливаем эти константы?

Добавлено через 1 минуту

Цитата
Сообщение от valeriikozlov
Посмотреть сообщение

dlinniy_miron, а код покажете?

код к сожалению на другом компьютере



0



82 / 82 / 24

Регистрация: 30.09.2011

Сообщений: 404

Записей в блоге: 6

07.11.2011, 20:16

8

dlinniy_miron, тогда обрати на мой пример внимание, он попроще.
_TCHAR* это тип для переменной



0



DenCHS200

32 / 32 / 8

Регистрация: 07.10.2011

Сообщений: 117

07.11.2011, 20:20

9

1) вместо int _tmain(int argc, _TCHAR* argv[]) можешь просто написать int main(), это С++ у меня по-умолчанию пишет, можно стереть 2)а first=7 и second=7 это я написал, чтобы когда мы проверяли , ввели ли мы другие номера массива в эти переменные, вот только 7 испрвавь на числа больше 9 или меньше 0, эот моя ошибка(Просто такие числа (меньше 0 или больше 9)не будут присвоены из цикла do{} while, так как у нас массив из 10 элементов от 0 до 9, а если число в диапазоне от 0 до 9 будет переменным first и second присвоено, то значит в цикле было найдено положительное число)

Добавлено через 4 минуты
Вот полностью рабочая прога, я в первой забыл про последний пункт, где нули вконце выводить в массиве

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
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    short int first=-1,second=-1,max,temp,i, array1[10];
    for(i=0;i<10;i++)//Заполняем массив элементами
        array1[i]=rand()%10-5;
    for(i=0;i<10;i++)
        cout<<endl<<array1[i];
 
//Ищем максимальный элемент по модулю
    if(array1[0]>0)
    max=array1[0];
    else max=-array1[0];
 
 
 
    for(i=1;i<10;i++)
    {
    if(array1[i]>=0)
        temp=array1[i];
    else
        temp=-array1[i];
    
    if(max<temp)
        max=temp;
 
    
    }
    cout<<endl<<"Maximum ABS element : "<<max;
    i=-1;   
    //Пункт Б : ищем 2 положительные числа
    //ищем первый положительный элемент
    do{i++;
    if(array1[i]>0)
    first=i;// Заносим номер первого положительного элемента
    }while((array1[i]<=0)&&(i<10));//проверяем, не все ли значения массива перебрали?
    
    do{
        i++;
    if(array1[i]>0)
    second=i;// Заносим номер второго положительного элемента
    }while((array1[i]<=0)&&(i<10));//проверяем, не все ли значения массива перебрали?
    
    if((second==7)||(first==7) )//Если исходные значения чисел first и second не изменились,
        // (а мы их проинициализировали вначале , как 7)то выводим сообщение, что нет двух положительных элементов
    cout<<"We not have two positive elements"<<endl;
    else{
        
    //в противном случае, считаем сумму между двумя этими числами и сохраняем её в переменную max
        max=0;
        for(i=first;i<=second;i++)
        max=max+array1[i];
    cout<<endl<<"SUMMA "<<max;
    
    }
 
    max=10;
    //затем упорядочиваем так, чтобы нули были последними элементами
    for(i=0;i<10;i++){
    if(array1[i]==0)
    {// просто обмениваем с последними элементами элементами, 
    temp=array1[i];
    array1[i]=array1[max];
    array1[max]=temp;
    max--;// для следующего элемента, который будет иметь на -1 индекс массива ,если встретится ноль
    
    }
    
    }
    // и выводим получившийся массив
    for(i=0;i<10;i++)
        cout<<endl<<array1[i];
 
    
    cin>>i;//Вводим любое число и жмём ENTER , чтобы закрыть прогу
    return 0;
}



1



0 / 0 / 0

Регистрация: 07.11.2011

Сообщений: 8

07.11.2011, 20:23

 [ТС]

10

Цитата
Сообщение от LostCoast
Посмотреть сообщение

dlinniy_miron, тогда обрати на мой пример внимание, он попроще.
_TCHAR* это тип для переменной

я заметил что попроще, но интересно count = 0; зачем? Ведь в дальнейшем ты не используешь вроде нигде.

Извиняюсь за свои вопросы, просто программируем в досовском си)



0



82 / 82 / 24

Регистрация: 30.09.2011

Сообщений: 404

Записей в блоге: 6

07.11.2011, 20:25

11

Цитата
Сообщение от dlinniy_miron
Посмотреть сообщение

но интересно count = 0; зачем?

сорри))) остался с прошлого варианта, можешь удалить)



0



0 / 0 / 0

Регистрация: 07.11.2011

Сообщений: 8

07.11.2011, 20:27

 [ТС]

12

Цитата
Сообщение от DenCHS200
Посмотреть сообщение

1) вместо int _tmain(int argc, _TCHAR* argv[]) можешь просто написать int main(), это С++ у меня по-умолчанию пишет, можно стереть 2)а first=7 и second=7 это я написал, чтобы когда мы проверяли , ввели ли мы другие номера массива в эти переменные, вот только 7 испрвавь на числа больше 9 или меньше 0, эот моя ошибка(Просто такие числа (меньше 0 или больше 9)не будут присвоены из цикла do{} while, так как у нас массив из 10 элементов от 0 до 9, а если число в диапазоне от 0 до 9 будет переменным first и second присвоено, то значит в цикле было найдено положительное число)

спасибо за помощь и за объяснение каждого пункта, под досовский я думаю легко отредактировать, так что сейчас попробую)

Добавлено через 1 минуту

Цитата
Сообщение от LostCoast
Посмотреть сообщение

сорри))) остался с прошлого варианта, можешь удалить)

хорошо=))



0



32 / 32 / 8

Регистрация: 07.10.2011

Сообщений: 117

07.11.2011, 20:31

13

Просто сохранить весь этот листинг в срр файл и в ДОсовском С++ запустить можно, чтоб не маяться



0



0 / 0 / 0

Регистрация: 07.11.2011

Сообщений: 8

07.11.2011, 20:32

 [ТС]

14

Цитата
Сообщение от DenCHS200
Посмотреть сообщение

Просто сохранить весь этот листинг в срр файл и в ДОсовском С++ запустить можно, чтоб не маяться

и что запустится? Мне кажется ошибку выдаст наверно



0



32 / 32 / 8

Регистрация: 07.10.2011

Сообщений: 117

07.11.2011, 20:43

15

Если синтаксис такой же, то не должен



0



0 / 0 / 0

Регистрация: 07.11.2011

Сообщений: 8

07.11.2011, 20:48

 [ТС]

16

Цитата
Сообщение от DenCHS200
Посмотреть сообщение

Если синтаксис такой же, то не должен

понятно)Спасибо)



0



Nursik77

В вечном поиске…

275 / 235 / 30

Регистрация: 05.04.2011

Сообщений: 645

07.11.2011, 21:16

17

Мой вариант:

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
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define N 10
 
int main() {
    int i, first, second, sum, max, num1, num2;
    int a[N];
    srand(time(NULL));
    printf("Array: ");
    for(i = 0; i < N; i++) {
    a[i] = rand()%11-5;
    printf("%i ",a[i]);
    }
    /*---Íàõîæäåíèå ïåðâîãî ïîëîæèòåëüíîãî ýëåìåíòà---*/
    first = 0;
    for(i = 0; i < N; i++) 
    if(a[i] >= 0) {
    first = i;
    num1 = a[i]; break; }
    printf("nIndex of 1-st positive element = %i", first+1);
    printf("nThe value of 1-st pos. element = %i", num1);
    /*------------------------------------------------*/
    
    /*---Íàõîæäåíèå âòîðîãî ïîëîæèòåëüíîãî ýëåìåíòà---*/
    second = 0;
    for(i = first+1; i < N; i++) 
    if(a[i] >= 0) {
    second = i;
    num2 = a[i]; break; }
    printf("nIndex of 2-nd positive element = %i", second+1);
    printf("nThe value of 2-nd pos. element = %i", num2);
    /*------------------------------------------------*/
    
    /*----Ñóììà ìåæäó 1-ûì è 2-ûì ïîë. ýëåìåíòàìè-----*/
    sum = 0;
    for( i = first; i <= second; i++)
    sum = sum + a[i];
    printf("nSum of array between 1-st and 2-nd positive el-ts = %i", sum);
    
    /*--------Íàõîæäåíèå ìàêñèìàëüíîãî ïî ìîäóëüþ-----*/
    
    max = abs(a[i]);
    for(i = 0; i < N; i++)
    if(abs(a[i]) > max)
    max = abs(a[i]);
    printf("n Max abs element = %i", max);
system("pause");
}

Ну и

другой вариант

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
#include <stdlib.h>
#include <stdio.h>
#define N 10
 
int main() {
    int i, first, second, sum;
    int a[N]={-1,-2,-3,4,-5,-5,4,-3,-2,-1};
    printf("Array: ");
    for(i = 0; i < N; i++)
    printf("%i ",a[i]);
 
    /*---Íàõîæäåíèå ïåðâîãî ïîëîæèòåëüíîãî ýëåìåíòà---*/
    first = 0;
    for(i = 0; i < N; i++) 
    if(a[i] > 0) {
    first = i; break; }
    printf("n1-st positive element = %i", first);
    /*------------------------------------------------*/
    
    /*---Íàõîæäåíèå âòîðîãî ïîëîæèòåëüíîãî ýëåìåíòà---*/
    second = 0;
    for(i = first+1; i < N; i++) 
    if(a[i] > 0) {
    second = i; break; }
    printf("n2-nd positive element = %i", second);
    /*------------------------------------------------*/
    
    /*----Ñóììà ìåæäó 1-ûì è 2-ûì ïîë. ýëåìåíòàìè-----*/
    sum = 0;
    for( i = first; i <= second; i++)
    sum = sum + a[i];
    printf("nSum of array between 1-st and 2-nd positive el-ts = %i", sum);
system("pause");
}

в котором массив заполнен ручками, для ясности.



0



lemegeton

4431 / 2369 / 854

Регистрация: 29.11.2010

Сообщений: 5,243

07.11.2011, 21:25

18

Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

STL:

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
68
69
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <functional>
#include <numeric>
#include <cstdlib>
#include <ctime>
 
template <int min, int max>
struct RandomInteger {
  int operator()() {
    return rand() % (max - min + 1) + min;
  }
};
 
std::ostream &operator<<(std::ostream &stream,
  const std::vector<int> &array) {
  for (std::vector<int>::const_iterator i = array.begin();
    i != array.end(); ++i)
    stream << (*i) << (((i + 1) != array.end()) ? ", " : "");
  return stream;
}
 
struct CompareByAbs {
  template <class ValueType>
  bool operator()(ValueType a, ValueType b) {
    return (abs(a) < abs(b));
  }
};
 
int main(int argc, char *argv[]) {
  srand(time(NULL));
 
  size_t arraySize = 18 + rand() % 5;
  std::vector<int> array(arraySize);
 
  std::generate(array.begin(), array.end(), RandomInteger<-5, 5>());
 
  std::cout << array << std::endl;
 
  std::cout << "Maximum by abs value is " << *(std::max_element(array.begin(),
    array.end(), CompareByAbs())) << std::endl;
 
  std::vector<int>::iterator firstPositive = std::find_if(array.begin(),
    array.end(), std::bind2nd(std::greater<int>(), 0));
 
  if (firstPositive != array.end()) {
    std::vector<int>::iterator secondPositive = std::find_if(firstPositive + 1,
      array.end(), std::bind2nd(std::greater<int>(), 0));
    if (secondPositive != array.end()) {
      int sum = std::accumulate(firstPositive + 1, secondPositive, 0);
      std::cout << "Sum between two first positive elements [" <<
        *firstPositive << ":" << *secondPositive << "] is " <<
        sum << std::endl;
    } else {
      std::cout << "No second positive in array." << std::endl;
    }
  } else {
    std::cout << "No positives in array." << std::endl;
  }
 
  std::partition(array.begin(), array.end(), 
    std::not1(std::bind2nd(std::equal_to<int>(), 0)));
 
  std::cout << "Zeroes last: " << std::endl << array << std::endl;
 
  return 0;
}



1



0 / 0 / 0

Регистрация: 07.11.2011

Сообщений: 8

08.11.2011, 04:45

 [ТС]

19

если честно, то как то тяжело



0



lemegeton

4431 / 2369 / 854

Регистрация: 29.11.2010

Сообщений: 5,243

10.11.2011, 02:06

20

Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Так легче?

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
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <cstdlib>
#include <ctime>
 
void fillRandom(int *begin, int *end, int min, int max) {
  while (begin != end)
    *begin++ = rand() % (max - min + 1) + min;
}
 
void printArray(int *begin, int *end) {
  for (; begin != end; ++begin)
    std::cout << (*begin) << ((begin + 1 != end)? ", " : "");
  std::cout << std::endl;
}
 
int *getMaxAbs(int *begin, int *end) {
  int *max = begin;
  for (; begin != end; ++begin)
    if (abs(*begin) > abs(*max))
      max = begin;
  return max;
}
 
int *getFirstPositive(int *begin, int *end) {
  while (begin != end && *begin <= 0)
    ++begin;
  return begin;
}
 
int getSum(int *begin, int *end) {
  int result = 0;
  while (begin != end)
    result += *begin++;
  return result;
}
 
void moveZeroesToEnd(int *begin, int *end) {
  while (true) {
    while (begin != end && *begin != 0) ++begin;
    if (begin == end--) break;
    while (begin != end && *end == 0) --end;
    if (begin == end) break;
    std::swap(*begin++, *end);
  }
}
 
int main(int argc, char *argv[]) {
  srand(time(NULL));
  size_t arraySize = 10;
  int *array = new int[arraySize];
  fillRandom(array, array + arraySize, -5, 5);
  printArray(array, array + arraySize);
  
  int *maximum = getMaxAbs(array, array + arraySize);
  std::cout << "First max by abs: " << *maximum << " at index " <<
    maximum - array << "." << std::endl;
 
  int *firstPositive = getFirstPositive(array, array + arraySize);
  if (firstPositive != array + arraySize) {
    int *secondPositive = getFirstPositive(firstPositive + 1, array + arraySize);
    if (secondPositive != array + arraySize) {
      std::cout << "Fist positive: " << *firstPositive << std::endl <<
        "Second positive: " << *secondPositive << std::endl <<
        "Sum between " << getSum(firstPositive + 1, secondPositive) <<
        std::endl;
    } else {
      std::cout << "No second positive value in array." << std::endl;
    }
  } else {
    std::cout << "No positive values in array." << std::endl;
  }
 
  std::cout << "Zeroes last:" << std::endl;
  moveZeroesToEnd(array, array + arraySize);
  printArray(array, array + arraySize);
  return 0;
}



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

10.11.2011, 02:06

20

Для решения вашей задачи могут подойти два стандартных алгоритма, оба которых объявлены в заголовочном файле <algorithm>. Это алгоритм std::max, который в качестве аргумента принимает объект типа std::initializer_list. Он имеет следующее объявление

template<class T, class Compare> 
constexpr T max(initializer_list<T> t, Compare comp);

Этот алгоритм возвращает максимальное значение.

И второй алгоритм — это алгоритм std::max_element, который в качестве аргументов принимает итераторы и возвращает итератор, указывающий на элемент с максимальным значением согласно заданному условию сравнения элементов.
Этот алгоритм имеет следующее объявление.

template<class ForwardIterator, class Compare> 
ForwardIterator max_element(ForwardIterator first, ForwardIterator last, Compare comp); 

Когда вы хотите найти максимальный элемент или максимальное значение элементов по абсолютной величине, то возникает одна проблема, о которой многие программисты забывают. Дело в том, что для чисел которые имеют представление дополнение до 2, как это имеет место у большинства компиляторов, если применить функцию, например, к объекту типа int, который имеет минимальное отрицательное значение, то функция std::abs вернет отрицательное значение! И естественно это отрицательное значение будет меньше любого положительного значения или нуля, хотя с математической точки зрения абсолютное значение этого минимального отрицательного значения должны быть по крайней мере больше 0.

Рассмотрите следующий простой пример.

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <limits>

int main()
{
    int min = std::numeric_limits<int>::min();
    int max = std::numeric_limits<int>::max();

    std::cout << "min = " << min << std::endl;
    std::cout << "max = " << max << std::endl;
    std::cout << "std::abs( min ) < 0 is "
              << std::boolalpha
              << (std::abs(min) < 0)
              << std::endl;
}

Вывод программы на консоль будет следующим

min = -2147483648
max = 2147483647
std::abs( min ) < 0 is true

Как видите, оказалось, что std::abs( min ) меньше нуля, хотя с математической точки зрения очевидно, что значение -2147483648 по абсолютной величине не только больше 0, но даже и больше максимального значения 2147483647, которое может храниться в объектах типа int. Поэтому для последовательностей с целочисленными значениями применение стандартной функции std::abs может привести к неверном результату.

Как выйти из этого положения? Для целочисленных значений лучше сравнивать два значения, как отрицательные значения. Например, рассмотрим использование алгоритма std::max

#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cstdlib>
#include <limits>

int main()
{
    auto max_abs1 = [](int x, int y)
    {
        return std::abs(x) < std::abs(y);
    };

    int maximum = std::max({ std::numeric_limits<int>::min(),
                             std::numeric_limits<int>::max() },
                             max_abs1);

    std::cout << "maximum = " << maximum << std::endl;

    auto max_abs2 = [](int x, int y)
    {
        return (y < 0 ? y : -y) < (x < 0 ? x : -x);
    };

    maximum = std::max({ std::numeric_limits<int>::min(),
        std::numeric_limits<int>::max() },
        max_abs2);

    std::cout << "maximum = " << maximum << std::endl;
}

Вывод этой программы следующий

maximum = 2147483647
maximum = -2147483648

Как видно из вывода, если применять стандартную функцию std::abs, то в качестве максимального значения по абсолютной величине будет значение 2147483647. А если сравнивать числа как отрицательные числа, то максимальным по абсолютной величине будет значение -2147483648

Для наглядности просто замените в программе объявление типа переменной maximum с int на unsigned int

unsigned int maximum = std::max({ std::numeric_limits<int>::min(),
                                 std::numeric_limits<int>::max() },
                                 max_abs1);

И вы для программы получите следующий результат

maximum = 2147483647
maximum = 2147483648

Из вывода видно, что первое значение, полученное после применения стандартной функции std::abs дает неверный результат.

Для чисел с плавающей запятой достаточно применять стандартную функцию std::abs.

Когда последовательность чисел задается не с помощью объекта std::initializer_list, то можно применить алгоритм std::max_element. Например,

#include <iostream>
#include <iomanip>
#include <algorithm>
#include <iterator>
#include <cstdlib>
#include <limits>

int main()
{
    int a[] =
    {
        std::numeric_limits<int>::min(),
        std::numeric_limits<int>::max()
    };

    auto max_abs = [](int x, int y)
    {
        return (y < 0 ? y : -y) < (x < 0 ? x : -x);
    };

    int *maximum = std::max_element(std::begin( a ), std::end( a ), max_abs);

    std::cout << "maximum = " << ( unsigned int )*maximum << std::endl;
}

Вывод программы на консоль будет, как и предполагалось, следующим

maximum = 2147483648

Формулировка задачи:

Ввести одномерный массив

А

, вывести его. Найти максимальный и минимальный по модулю элементы массива. Если модуль максимального элемента превышает значение модуля минимального более чем на 10, то увеличить положительные элементы всего массива на значение модуля максимума, иначе уменьшить их на это значение.

#include <iostream.h>
int main()
{
    int n,i;
    // Ввод массива
    cout<<"nVvod n";
    cin>>n;
    int a[n];
    for (i=0; i<n; i++)
    {
        cout<<"na["<<i<<"]=";
        cin>>a[i];
    }
    // Вывод массива
    cout<<"nMassiv a:";
    for (i=0; i<n; i++)
        cout<<"t"<<a[i];

Код к задаче: «Найти максимальный и минимальный по модулю элементы массива»

textual

max=min=abs(a[0]);
for (i=1; i<n; i++)
{
   if(max<abs(a[i]))
      max=abs(a[i]);
   if(min>abs(a[i]))
      min=abs(a[i]);
}

Полезно ли:

11   голосов , оценка 3.909 из 5

uses crt;

const
  nmax = 100;

type
  mas = array [1 .. nmax] of real;

function Max(m: mas; n: byte): real;
var
  i: byte;
  mx: real;
begin
  mx := m[1];
  for i := 1 to n do
    if abs(m[i]) > abs(mx) then
      mx := m[i];
  Max := mx;
end;

var
  a: mas;
  n, i: byte;

begin
  clrscr;
  randomize;
  repeat
    write('Размер массива до ', nmax, ' n=');
    readln(n);
  until n in [1 .. nmax];
  writeln('Исходный массив:');
  for i := 1 to n do
  begin
    a[i] := 20 * random - 10;
    write(a[i]:0:2, ' ');
  end;
  writeln;
  writeln;
  write('Максимальный по модулю элемент=', Max(a, n):0:2);
  readln

end.

Понравилась статья? Поделить с друзьями:
  • Неземная как ты меня нашла текст
  • Как составить жизненный цикл услуги
  • Как исправить потенцию у мужчин
  • Как письменно составить схему предложения
  • Как исправить display none