Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
kirill2536
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 15
1

Найти индекс максимального отрицательного элемента массива (используя указатели)

10.04.2017, 01:19. Просмотров 1148. Ответов 18
Метки нет (Все метки)

Дан массив целых чисел состоящий из N элементов (N = 20). Найти индекс максимального отрицательного элемента.
Примечания: Данные вводятся с клавиатуры. В программе при обращении к элементу массива нельзя использовать дополнительную переменную для вычисления его адреса.

Примерно понимаю алгоритм, но не могу понять как тут применить указатель, тк плохо понимаю тему.
Заранее благодарю за помощь!
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2017, 01:19
Ответы с готовыми решениями:

Найти индекс максимального элемента массива
Не находит правильно индекс максимального элемента, в чём ошибка?...

Найти индекс максимального по модулю элемента массива
Помогите пожалуйста, в Си вообще не разбираюсь В одномерном массиве, состоящем...

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

Вычислить индекс максимального по модулю элемента массива
Uslovie: В одномерном динамическом массиве, состоящем из n вещественных...

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

18
_SayHello
616 / 363 / 114
Регистрация: 30.07.2015
Сообщений: 1,282
10.04.2017, 10:42 2
kirill2536, заполняете свой массив, скажем интами.
C++
1
int* ptr = &N; // Присваиваем указателю адрес первого значения массива
ptr++ - адрес следующего элемента массива
*(ptr++) - значение следующего элемента массива
0
LFC
730 / 535 / 416
Регистрация: 17.09.2015
Сообщений: 1,598
10.04.2017, 11:31 3
Лучший ответ Сообщение было отмечено kirill2536 как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int arr[N], *start, *end, *max = NULL;
for(start = arr, end = arr + N; start < end; start++){
    if(*start < 0){
        if(!max)
             max = start;
        else{
            if(*max < *start)
                max = start;
        }
}
if(!max)
    puts("not found");
else
    printf("\nindex = %d\n", max - arr);
1
_SayHello
616 / 363 / 114
Регистрация: 30.07.2015
Сообщений: 1,282
10.04.2017, 12:13 4
LFC, Можно вопрос, проверить программу не имею возможности. Разве max-arr не выдаст разницу адресов, может надо так сделать (max-arr)/sizeof(int) - чтобы индекс получить
0
shvyrevvg
725 / 541 / 270
Регистрация: 12.05.2016
Сообщений: 1,572
10.04.2017, 12:28 5
_SayHelli, так указатели int значит разница и будет индексом))

Добавлено через 3 минуты
(arr + i) - arr = i
1
_SayHello
616 / 363 / 114
Регистрация: 30.07.2015
Сообщений: 1,282
10.04.2017, 12:34 6
shvyrevvg, понял. Думал что работает так: предположим начальный элемент лежит в ячейке памяти с адресом - 0x0000, второй - 0x0004, третий - 0x0008 и так далее (int 4 байта) Пусть максимальный элемент находится в ячейке 3. тогда 0x0008-0x0000 = 0x0008. Думал в явном виде в адрес возвращается.
1
kirill2536
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 15
12.04.2017, 20:37  [ТС] 7
Обьясните, пожалуйста, что значит это условие
if(!max)
0
_SayHello
616 / 363 / 114
Регистрация: 30.07.2015
Сообщений: 1,282
12.04.2017, 20:50 8
kirill2536, if( 0 == max)
0
kirill2536
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 15
12.04.2017, 23:00  [ТС] 9
Если адреса нет
Это так понимать?
0
_SayHello
616 / 363 / 114
Регистрация: 30.07.2015
Сообщений: 1,282
12.04.2017, 23:14 10
kirill2536, нулевой указатель не указывает ни на какой адрес.
0
Mournful Max
Велосипедист...
347 / 214 / 74
Регистрация: 15.12.2015
Сообщений: 784
Завершенные тесты: 1
13.04.2017, 01:08 11
_SayHelli,
Цитата Сообщение от _SayHelli Посмотреть сообщение
ptr++ - адрес следующего элемента массива
Такая инструкция (ptr++), вернет адрес ptr, после чего инкрементирует ptr. То есть, возвращает адрес теперешнего элемента, а не следующего

Цитата Сообщение от _SayHelli Посмотреть сообщение
нулевой указатель не указывает ни на какой адрес.
Указатель со значением NULL, указывает на нулевой адрес (0x0000)
1
LFC
730 / 535 / 416
Регистрация: 17.09.2015
Сообщений: 1,598
13.04.2017, 05:26 12
Цитата Сообщение от kirill2536 Посмотреть сообщение
Если адреса нет
Это так понимать?
смысл этой конструкции
C
1
2
if(!max)
     max = start;
в том чтобы max стал указывать на первое отрицательное число в массиве.
А когда переменная start найдет второе отрицательное число,то max уже будет иметь какой-то адрес и условие if(!max) не выполнится.Если же второе отрицательное число не будет найдено,то max так и будет указывать на единственный отриц. элемент,он же максимальный отрицательный. Если же и первое отрицательное число не будет найдено,то max так и будет указывать на NULL и тогда выполнится вот эта часть кода
C
1
2
if(!max)
    puts("not found");
0
_SayHello
616 / 363 / 114
Регистрация: 30.07.2015
Сообщений: 1,282
13.04.2017, 09:23 13
Captain Maxee, извините, не так выразился, имел ввиду, что по массиву можно гулять используя данный вариант. например:
while (*(ptr++)) - вариант для строки
1
LFC
730 / 535 / 416
Регистрация: 17.09.2015
Сообщений: 1,598
14.04.2017, 04:28 14
Цитата Сообщение от _SayHelli Посмотреть сообщение
while (*(ptr++)) - вариант для строки
при таком варианте сначала сдвигается указатель,а только потом проверяется имеет ли он значение,ибо то что в скобках (ptr++) выполняется в первую очередь
0
shvyrevvg
725 / 541 / 270
Регистрация: 12.05.2016
Сообщений: 1,572
14.04.2017, 04:59 15
Цитата Сообщение от LFC Посмотреть сообщение
при таком варианте сначала сдвигается указатель,а только потом проверяется имеет ли он значение,ибо то что в скобках (ptr++) выполняется в первую очередь
LFC, так тут скобки ни на что не влияют, приоритет у инкремента выше чем у разыменования.
0
LFC
730 / 535 / 416
Регистрация: 17.09.2015
Сообщений: 1,598
14.04.2017, 05:14 16
shvyrevvg, согласен
0
easybudda
Модератор
Эксперт CЭксперт С++
10209 / 6108 / 1536
Регистрация: 25.07.2009
Сообщений: 11,610
14.04.2017, 12:04 17
Цитата Сообщение от shvyrevvg Посмотреть сообщение
приоритет у инкремента выше чем у разыменования
Дело даже не в приоритетах. Постфиксная операция инкремента вернёт текущее значение, хоть обставь его скобками.
LFC, *(++ptr) не?
0
LFC
730 / 535 / 416
Регистрация: 17.09.2015
Сообщений: 1,598
14.04.2017, 12:18 18
Цитата Сообщение от easybudda Посмотреть сообщение
LFC, *(++ptr) не?
не пойму о чем вы
0
easybudda
14.04.2017, 12:34     Найти индекс максимального отрицательного элемента массива (используя указатели)
  #19

Не по теме:

Цитата Сообщение от LFC Посмотреть сообщение
не пойму о чем вы
Перечитал тему - понял, что к Вам не по адресу. Это выше спор был, как значение следующего элемента получить...

0
14.04.2017, 12:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2017, 12:34
Привет! Вот еще темы с ответами:

Индекс максимального элемента динамического массива (отладить код)
Здравствуйте. Программа некорректно считает индекс массива (вместо индекса...

Узнать индекс максимального элемента второй половины массива
Нам нужно узнать номер максимального элемента второй половины массива t с 20...

Указатели: определить номер максимального по модулю элемента массива
Обращаться к элементам массива необходимо используя указатель. 1. В одномерном...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru