0 / 0 / 0
Регистрация: 11.01.2019
Сообщений: 56
1

Функция поиска элемента в массиве без индексов

28.05.2019, 17:54. Показов 1598. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, прошу помощи в моем коде. Нужно написать функцию, которая принимает начальный адрес и конечный адрес фрагмента массива целых чисел и одно целочисленное значение и возвращает адрес первого появления этого значения в фрагменте либо конечный адрес фрагмента, если этого значения нету в нем. Функция должна быть адаптирована для использования в примере программы ниже и не использует индексы массива.
C
1
2
3
4
int main() {
      const int table[] = {1, 7, -5, 2, 8, -5, 3};
      printf("%li\n", find(table + 3, table + 7, -5) - table);
      return 0; }
Я написал такую функцию и все вроде работает отлично
C
1
2
3
4
int *find(const int *begin, const int *end, int a){
    for(const int *pointer = begin; pointer + 1 < end; ++pointer){
        if(*pointer == a)
            return (int *)pointer;}}
в данном случае функция найдет цифру -5 на 5-ой позиции в фрагменте массива от table+3 до table+7, то есть от 4-го до 7-го элемента, если, например, вписать в функцию 9, то функция выведет 7, так как 9-ки нету в этом фрагменте функция выводит адрес последнего элемента фрагмента.
И тут есть такое НО: если передать функции как начало и конец фрагмента NULL то есть вот так find(NULL, NULL, -5) функция по логике должна вернуть конец фрагмента то есть NULL, но возвращает она какой-то бред. Я пытался многими способами решить проблему, но так и не удалось. Спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2019, 17:54
Ответы с готовыми решениями:

Написать процедуру поиска суммы индексов первого и последнего нулевого элемента в одномерном массиве
Добрый день! Собственно такая задача: Написать процедуру поиска суммы индексов первого и...

Функция поиска в массиве и указатели + функция сортировки и поиск найденного элемента
Написать функцию поиска максимального элемента, передать в неё указатель на начало и конец поиска и...

Функция поиска максимального элемента в массиве
Необходимо составить функцию поиска индекса макс. эл-та в массиве. int max (void *arr, unsigned...

Функция поиска максимального элемента в массиве
Составьте функцию maxarray, возвращающую индекс максимального элемента произвольного массива....

9
296 / 227 / 102
Регистрация: 11.08.2016
Сообщений: 780
28.05.2019, 19:49 2
Алексей_КЛНН,
C
1
for(const int *pointer = begin; pointer + 1 < end; ++pointer){
Вы создали указатель на константу int и присвоили ей адрес NULL.
Затем сравнивается условие, которое будет ЛОЖЬ и цикл прекращается. Но, в функции кроме как тела for, нету возвращающего оператора return. Поэтому возвращается мусор.
C
1
2
3
4
5
6
7
8
9
int *find(const int *begin, const int *end, int a)
{
    for(const int *pointer = begin;; pointer + 1 < end; ++pointer)
    {
        if(*pointer == a)
            return (int *)pointer;
    }
    return NULL;
}
А ещё
C
1
 printf("%li\n"
функция ожидает long int, хотя возвращаемое значение у Вас
C
1
int *find
Добавлено через 2 минуты
Кстати, у printf имеется модификатор %p для вывода указателей.
C
1
printf("%p\n", (void *)(find(NULL, NULL, -5) - table));
0
0 / 0 / 0
Регистрация: 11.01.2019
Сообщений: 56
28.05.2019, 20:14  [ТС] 3
Добавлено через 2 минуты
D3m1an, Спасибо за подсказку и замечание, но функция по прежнему возвращает мусор, а лонг инт для функции я не могу поставить ибо массив является константой типа инт.
0
296 / 227 / 102
Регистрация: 11.08.2016
Сообщений: 780
28.05.2019, 21:11 4
Алексей_КЛНН, так изменить можно функцию. Но, не суть.
Ноль вернёт, если вы уберёте
C
1
 - table
От нуля вы отнимаете адрес table. Мне не ясно, зачем это сделано.
Код
00000000

Process returned 0 (0x0)   execution time : 3.717 s
Press any key to continue.
0
0 / 0 / 0
Регистрация: 11.01.2019
Сообщений: 56
28.05.2019, 22:02  [ТС] 5
D3m1an, вот такое у меня домашнее задание) Нужно написать функцию именно под готовую уже функцию main и изменять ее нельзя. Поэтому раз идей больше нет, спасибо большое за помощь!
0
296 / 227 / 102
Регистрация: 11.08.2016
Сообщений: 780
28.05.2019, 22:30 6
Алексей_КЛНН, текст домашнего задания можете скинуть? Мне кажется, что возникло недопонимание.

Добавлено через 13 минут
Вот программа для поиска без индексов. Возвращает NULL если не найдено, либо адрес искомого в массиве table[]
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
 
const int *find(const int * begin, const int * end, int a)
{
    for(; begin != end; ++begin)
        if(*begin == a) return begin;
    return NULL;
}
 
int main() {
      const int table[] = {1, 7, -5, 2, 8, -5, 3};
      printf("adress in table[] - \t\t%p\nfinded adress in table[] - \t%p\n", &table[5], find(table+3, table + sizeof table / sizeof table[0], -5));
      return 0; }
О чём я и говорил. Только не понимаю, почему это не подходит ?

Добавлено через 1 минуту
В случае не совпадения.
Код
adress in table[] -             0028FF18
finded adress in table[] -      00000000

Process returned 0 (0x0)   execution time : 0.004 s
Press any key to continue.
В случае, когда есть совпадение.
Код
adress in table[] -             0028FF18
finded adress in table[] -      0028FF18

Process returned 0 (0x0)   execution time : 0.011 s
Press any key to continue.
0
0 / 0 / 0
Регистрация: 11.01.2019
Сообщений: 56
28.05.2019, 22:30  [ТС] 7
D3m1an, Напишите функцию find, которая принимает начальный адрес и конечный адрес фрагмента массива целых чисел и одно целочисленное значение и возвращает адрес первого появления этого значения в фрагменте либо его
конечный адрес, если это значение не существует в нем. Функция должна быть адаптирована для использования
в примере программы ниже. Функция не использует индексы массива и не использует заголовочные файлы.
C
1
2
3
4
int main() {
const int table[] = {1, 7, -5, 2, 8, -5, 3};
printf("%li\n", find(table + 3, table + 7, -5) - table);
return 0; }
Out: 5
0
296 / 227 / 102
Регистрация: 11.08.2016
Сообщений: 780
28.05.2019, 22:38 8
Лучший ответ Сообщение было отмечено Алексей_КЛНН как решение

Решение

Алексей_КЛНН, Всё, сорян, про пример ниже не прочёл, что она должна именно подходить.

Добавлено через 6 минут
Цитата Сообщение от Алексей_КЛНН Посмотреть сообщение
и возвращает адрес первого появления этого значения в фрагменте
возвращает корректно.

Цитата Сообщение от Алексей_КЛНН Посмотреть сообщение
либо его
конечный адрес, если это значение не существует в нем.
Просто тогда отправляем указатель на конец массива.
C
1
2
3
4
5
6
const int *find(const int * begin, const int * end, int a)
{
    for(; begin != end; ++begin)
        if(*begin == a) return begin;
    return end;    //Когда совпадений нет, отправиться конец фрагмента(массива)
}
0
0 / 0 / 0
Регистрация: 11.01.2019
Сообщений: 56
28.05.2019, 22:51  [ТС] 9
D3m1an, все равно по прежнему выдает что-то типа "-1589181"
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
04.06.2019, 08:37 10
Алексей_КЛНН, значит неправильно использовали. Как вызов делали?
0
04.06.2019, 08:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.06.2019, 08:37
Помогаю со студенческими работами здесь

Функция поиска заданного элемента в массиве
&quot;Написать функцию поиска заданного элемента в целочисленном массиве. Отсортировать по возрастанию...

Функция поиска минимального элемента в массиве
написать программу перезагрузки функции поиска минимального элемента в массиве. элементы массива...

Функция Поиска элемента дерева с рекурсией и без
Деревья. Функция Поиска элемента дерева с рекурсией и без. То бишь есть дерево и один листик...

Функция поиска максимального элемента в массиве. Не работает!
function max_value(const a:array of integer):integer; var i,elem,max:integer; begin for...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru