Форум программистов, компьютерный форум CyberForum.ru

Функция - C++

Восстановить пароль Регистрация
 
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
15.10.2011, 00:38     Функция #1
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
// binary_search_with_fun.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
int *Bin_Srch(int *first, int *last, int key)
{
    int l=first;
    int u=last-1;   
while (l <= u) 
    {
        int m = (l + u) / 2;
        if (*(first+m) == key) return m;
            if (*(first+m) < key) l = m + 1;
                if (*(first+m) > key) u = m - 1;
    }
    
}
 
int _tmain(int argc, _TCHAR* argv[])
{   setlocale(0,"");
    int arr[5]={1, 2, 3, 4, 5};
    int key;
    cout << "Число: \n";
    cin >> key;
    
    cout << endl << Bin_Srch(arr,arr+5,2);
    return 0;
}
Будьте добры, помогите понять принцип функций в целом, в каком случае требуется ставить указатель "*", а в каком нет.
Программа на двоичный поиск, как правильно осуществить функцию этого поиска?

Можете подкинуть статьи по функциям и указателям, ато в нете куча этих статей?)
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2011, 00:38     Функция
Посмотрите здесь:

что за функция такая strstr? или это не функция? C++
функция C++
Нужно сделать, чтобы программа состояла из 3 функций, тоесть 1-ая функция ввода массива, 2-ая основная функция, 3-я- вывод массива C++
C++ Создать производный класс, в котором реализована функция умножения вектора на число и функция сложения двух векторов
есть функция которая размещает 2 числа в порядке возрастания, значения в эту функцию передаю по указателю, но по указателям функция их не сортирует C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
15.10.2011, 00:40     Функция #2
можете посмотреть стандартную реализацию в библиотеке algorithm.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
15.10.2011, 01:26     Функция #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от xexew Посмотреть сообщение
Можете подкинуть статьи по функциям и указателям, ато в нете куча этих статей?)
xexew, почитайте лучше книжки. На форуме была прикреплённая тема со списком хорошей литературы.

Цитата Сообщение от xexew Посмотреть сообщение
Будьте добры, помогите понять принцип функций в целом, в каком случае требуется ставить указатель "*", а в каком нет.
Функция - это, грубо говоря, программа в программе. Подпрограмма. Часто выполняемые действия обычно выносят в функции, чтобы не писать по десять раз. Функция может принимать аргументы (параметры по-другому) и возвращать значение. Синтаксис такой:

тип_возвращаемого_значения имя ( тип_параметра_1 параметр_1, тип_параметра_2 параметр_2, ... )
{
тело_функции
}

Пример:

int add( int a, int b )
{
return a + b;
}

Функция add принимает два параметра типа int и возвращающая значение типа int, которое является суммой её параметров. То есть, когда я пишу

int c = add( 5, 8 );

Вызывается функция add, в первый параметр попадает число 5, во второй - 8. Значение, которое вернёт функция, 13, запишется в int c.



Указатель - переменная, хранящая адрес начала чего-либо. Синтаксис объявления указателя на объект:

тип_объекта * имя_указателя;

Пример:

char * alpha;

Указатель alpha на начало объекта (или последовательности объектов) типа char.

Если указатель указывает на элемент массива, то для перехода к следующему элементу нужно выполнить инкремент указателя, а для перехода к предыдущему элементу - декремент указателя:

alpha++;
alpha--;

Так же можно производить доступ через operator[]:

alpha[5];

Чтобы взять значение, на которое указывает указатель, нужно его разименовать:

C
1
2
3
4
char * alpha = "Hello"; // alpha указывает на начало массива char
char c = *alpha; // c == 'H'
alpha++;
c = *alpha; // c == 'e'
Или получить доступ по индексу:

C
1
2
char * alpha = "Hello"; // alpha указывает на начало массива char
char c = alpha[4]; // c == 'o'

Для взятия адреса объекта используется операция взятия адреса объекта:

C
1
2
3
int a = 18;
int * ptr = &a; // взятие адреса a и запись его в указатель ptr
int b = *ptr; // разыменовывание указателя ptr и запись значения по указателю в b; b == 18
При создании указателя на массив операция взятия адреса не требуется, так как идентификатор (имя) массива эквивалентно указателю на начало массива:

C
1
2
int a[16];
int * ptr = a;


При передачи больших объектов и массивов в функцию предпочтительна передача по указателю, так как в этом случае функция примет 4 байта указателя вместо огромного объекта или массива:

C
1
2
3
4
5
6
int lng( char * str ); // функция принимает указатель на char
 
//...
 
printf( "%d", lng( "hello" ) ); // передача указателя на начало строки hello в функцию lng;
                          // значение, возвращённое функцией lng передаётся в функцию printf
Есть ещё указатели на функцию. Будет интересно подробнее узнать про всё это - найдёте книжки и почитаете.
silent_1991
15.10.2011, 14:46
  #4

Не по теме:

Цитата Сообщение от talis Посмотреть сообщение
аргументы (параметры по-другому)
Небольшое исправление:
Обычно то, что стоит в прототипе функции называют параметрами, а то, что фактически передаётся при вызове функции - аргументами.

xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
15.10.2011, 20:38  [ТС]     Функция #5
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
int *Bin_Srch(int *first, int *last, int key)
{
    int l=*first;
    int u=*last-1;  
while (l <= u) 
    {
        int m = (l + u) / 2;
        if (*(first+m) == key) return m;
            if (*(first+m) < key) l = m + 1;
                if (*(first+m) > key) u = m - 1;
    }
    return -1;
}
 
int _tmain(int argc, _TCHAR* argv[])
{   setlocale(0,"");
    int arr[5]={1, 2, 3, 4, 5};
    int key;
    cout << "Число: \n";
    cin >> key;
    int *p=Bin_Srch(arr,arr+5,key);
    cout << p <<" "; 
    return 0;
}
подскажите, почему функция не может вернуть значение -1?
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
15.10.2011, 20:47     Функция #6
Цитата Сообщение от xexew Посмотреть сообщение
подскажите, почему функция не может вернуть значение -1?
C++
1
int u=*last-1;
Оператор разыменования имеет больший приоритет чем оператор -
иными словами, этот код эквивалентен следующему:
C++
1
 int u=(*last)-1;
по этому что бы получить ожидаемый результат нужно написать так:
C
1
int u = *(last - 1);
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
15.10.2011, 20:55  [ТС]     Функция #7
спасибо, но он все равно пишет что не может конвертировать из 'int' в 'int *', ссылаясь на строку, где написано
C++
1
return -1
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
15.10.2011, 20:58     Функция #8
Цитата Сообщение от xexew Посмотреть сообщение
спасибо, но он все равно пишет что не может конвертировать из 'int' в 'int *', ссылаясь на строку, где написано
C++
1
return -1
Да, потому что функция объявлена, как возвращающая указатель, а вы пытаетесь вернуть просто число (int)
Возвращайте тогда нулевой указатель, чтобы сигнализировать о том что элемент не найден:
C++
1
return NULL;
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
15.10.2011, 21:37  [ТС]     Функция #9
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
int *Bin_Srch(int *first, int *last, int key)
{
    int l=*first;
    int u=*(last-1);    
while (l <= u) 
    {
        int m = (l + u) / 2;
        if (*(first+m) == key) key=*(first+m);
            if (*(first+m) < key) l = m + 1;
                if (*(first+m) > key) u = m - 1;
    }
    return NULL;
}
 
int _tmain(int argc, _TCHAR* argv[])
{   setlocale(0,"");
    int arr[5]={1, 2, 3, 4, 5};
    int key;
    cout << "Число: \n";
    cin >> key;
    int *p=Bin_Srch(arr,arr+5,key);
    cout << p <<" "; 
    return 0;
}
Программа запускается, но после прочтения числа просто бездействует, что может быть не так?
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
15.10.2011, 21:46     Функция #10
Цитата Сообщение от xexew Посмотреть сообщение
Программа запускается, но после прочтения числа просто бездействует, что может быть не так?
А где у вас оператор return на тот случай если элемент найден?
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
15.10.2011, 21:47     Функция #11
А она у вас всегда NULL возвращает, других-то return-ов нет
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
15.10.2011, 21:48     Функция #12
вот написал:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int *binsearch(int *first, int *last, int key)
{
    int *mid;
 
    while (first < last) {
        mid = first + (last-first) / 2;
        if (*mid > key)
            last = mid;
        else if (*mid < key)
            first = mid + 1;
        else
            return mid;
    }
    return NULL;
}
изучайте...
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
15.10.2011, 21:51  [ТС]     Функция #13
ох..большое спасибо за решение)
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
17.10.2011, 23:48  [ТС]     Функция #14
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
// binary_search_with_fun.cpp : Defines the entry point for the console application.
//
 
int *binsearch(int *first, int *last, int key)
{
        int* mid;
        int* p=last; 
        while (first < last) {
                mid = first + (last-first) / 2;
                if (*mid == key) return mid;        
                if (*mid < key) last = mid + 1;
                if (*mid > key) first = mid - 1;
                        return mid;
        }
        return p;
}
 
int _tmain(int argc, _TCHAR* argv[])
{   setlocale(0,"");
    int arr[5]={1,5,4,3,2};
    int* q=binsearch(arr,arr+5,2);
    cout << "\nИндекс: " << q-arr << endl; 
    return 0;
}
посмотрите пожалуйста "свежим" взглядом, где ошибка? не правильно возвращает значение, может в цикле что-то не то?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2011, 00:46     Функция
Еще ссылки по теме:

оформить решение в виде функции следующими способами: 1. функция расположена после ее вызова; 2. функция расположена после до ее вызова; 3. функ C++
C++ Функция возвращающая абсолютное разницу первого и второго параметров и функция типа int, возвращающая минимальное из трех целых чисел
Функция заполняющая массив и функция вывода массива C++

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

Или воспользуйтесь поиском по форуму:
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
18.10.2011, 00:46     Функция #15
Цитата Сообщение от xexew Посмотреть сообщение
int arr[5]={1,5,4,3,2};

xexew, условие для бинарного поиска - отсортированный массив. Иначе будет работать с ошибками. Сами подумайте:

Код
берём середину интервала
если ключ меньше значения
   ищем в левой части
если ключ больше значения
   ищем в правой части
если ключ равен значению
   возвращаем адрес найденного элемента
если границы поиска стоят впритык друг к другу или вообще пересеклись
   возвращаем, что значения нет в массиве

повторить
Yandex
Объявления
18.10.2011, 00:46     Функция
Ответ Создать тему
Опции темы

Текущее время: 09:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru