Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 2
Регистрация: 22.02.2011
Сообщений: 76
1

Функция

15.10.2011, 00:38. Показов 938. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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;
}
Будьте добры, помогите понять принцип функций в целом, в каком случае требуется ставить указатель "*", а в каком нет.
Программа на двоичный поиск, как правильно осуществить функцию этого поиска?

Можете подкинуть статьи по функциям и указателям, ато в нете куча этих статей?)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.10.2011, 00:38
Ответы с готовыми решениями:

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

Функция удаления текста в скобках [2], непосредственно функция + 12кб вложений
Доброго времени суток, случилось так, что пришлось работать с с-строками (лаба, угу), в которой...

Перегрузка операций: friend-функция или функция-член класса
Здравствуйте, меня интересует вопрос, в чем разница при перегрузке операторов через operator и...

Функция sqrt: существует более одного экземпляра. Функция перегруженная
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;iomanip&gt; using namespace std; int main(){...

14
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
15.10.2011, 00:40 2
можете посмотреть стандартную реализацию в библиотеке algorithm.
0
794 / 546 / 61
Регистрация: 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
Есть ещё указатели на функцию. Будет интересно подробнее узнать про всё это - найдёте книжки и почитаете.
3
silent_1991
15.10.2011, 14:46
  #4

Не по теме:

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

1
0 / 0 / 2
Регистрация: 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?
0
237 / 210 / 29
Регистрация: 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);
1
0 / 0 / 2
Регистрация: 22.02.2011
Сообщений: 76
15.10.2011, 20:55  [ТС] 7
спасибо, но он все равно пишет что не может конвертировать из 'int' в 'int *', ссылаясь на строку, где написано
C++
1
return -1
0
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
15.10.2011, 20:58 8
Цитата Сообщение от xexew Посмотреть сообщение
спасибо, но он все равно пишет что не может конвертировать из 'int' в 'int *', ссылаясь на строку, где написано
C++
1
return -1
Да, потому что функция объявлена, как возвращающая указатель, а вы пытаетесь вернуть просто число (int)
Возвращайте тогда нулевой указатель, чтобы сигнализировать о том что элемент не найден:
C++
1
return NULL;
1
0 / 0 / 2
Регистрация: 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;
}
Программа запускается, но после прочтения числа просто бездействует, что может быть не так?
0
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
15.10.2011, 21:46 10
Цитата Сообщение от xexew Посмотреть сообщение
Программа запускается, но после прочтения числа просто бездействует, что может быть не так?
А где у вас оператор return на тот случай если элемент найден?
0
448 / 211 / 21
Регистрация: 07.10.2011
Сообщений: 462
15.10.2011, 21:47 11
А она у вас всегда NULL возвращает, других-то return-ов нет
0
237 / 210 / 29
Регистрация: 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;
}
изучайте...
1
0 / 0 / 2
Регистрация: 22.02.2011
Сообщений: 76
15.10.2011, 21:51  [ТС] 13
ох..большое спасибо за решение)
0
0 / 0 / 2
Регистрация: 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;
}
посмотрите пожалуйста "свежим" взглядом, где ошибка? не правильно возвращает значение, может в цикле что-то не то?
0
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
18.10.2011, 00:46 15
Цитата Сообщение от xexew Посмотреть сообщение
int arr[5]={1,5,4,3,2};

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

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

повторить
1
18.10.2011, 00:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2011, 00:46
Помогаю со студенческими работами здесь

Какую библиотеку надо подключать чтоб работала функция _getch() и функция cin.get()?
какую библиотеку надо подключать чтоб работала функция _getch() и функция cin.get()

Чистая виртуальная функция функция не имеет оператора переопределения
Пишу программу для записи заметок. Есть 2 класса: Page и Note. Note наследуется от Page. ...

что за функция такая strstr? или это не функция?
void search(sp *list){ sp *prt = list; char f,r; cout&lt;&lt;Rus(&quot;введите текст&quot;)&lt;&lt;endl; cin&gt;&gt;f;...

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


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

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