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

функция типа bool - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 54, средняя оценка - 5.00
Romiys
3 / 3 / 0
Регистрация: 27.12.2010
Сообщений: 56
24.08.2011, 11:49     функция типа bool #1
Привет! Подскажите пожалуйста как написать функцию типа bool. Есть вектор целых чисел, в котором надо найти заданное число. Если оно есть функция возвращает true, если такова числа в векторе нет - выдаёт false. Подскажите как исправить ошибку?

C++
1
2
3
4
5
6
7
8
9
10
11
12
bool gcd (int *v1, int *v2, int v3)
{
  if (find(v1, v2, v3)) 
  {
  return true;
 
  }else{
  
  return false;
  }
   
}
 Комментарий модератора 
Используйте теги форматирования кода!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2011, 11:49     функция типа bool
Посмотрите здесь:

C++ размер типа bool
Возвращение типа bool C++
Функция типа bool C++
bool функция, нужен разбор C++
Почему переменная типа bool весит 1 байт? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.08.2011, 11:55     функция типа bool #2
Если я правильно понял что это std::find тогда.

C++
1
2
3
4
5
6
7
8
9
10
11
12
bool gcd (int *v1, int *v2, int v3)
{
if (find(v1, v2, v3) != v2)
{
return true;
 
}else{
 
return false;
}
 
}
Romiys
3 / 3 / 0
Регистрация: 27.12.2010
Сообщений: 56
24.08.2011, 12:07  [ТС]     функция типа bool #3
Не работает

Вот основной код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "localMath.h"
#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
    vector<int> ivec;
    int k, x=7;
    vector<int>::iterator i=ivec.begin();
    vector<int>::iterator j=ivec.end();
 
    cout << "Enter values: \n";
        while(cin>>k)
        ivec.push_back(k);
 
       cout << "gcd: " << gcd(i, j, x) << endl;
 
    system("pause");
    return 0;
}

а вот код самой функции


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef LOCALMATH_H
#define LOCALMATH_H
 
bool gcd (int *v1, int *v2, int v3)
{
  if (find(v1, v2, v3)==v3) 
  {
  return true;
 
  }else{
  
  return false;
  }  
  
}
#endif

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

Ошибка:

error C2065: 'find' : undeclared identifier

 Комментарий модератора 
ОК, второе замечание о тегах. В следующий раз будет карточка.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.08.2011, 12:09     функция типа bool #4
ForEveR, или, если сократить (с учётом того, что всё остальное правильно):
C++
1
2
3
4
bool gcd (int *v1, int *v2, int v3)
{
    return find(v1, v2, v3) != v2;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.08.2011, 12:56     функция типа bool #5
Romiys, Не v3, а v2. Во вторых #include <algorithm> в файле.
В третьих std::find.
Romiys
3 / 3 / 0
Регистрация: 27.12.2010
Сообщений: 56
24.08.2011, 13:21  [ТС]     функция типа bool #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
#include "localMath.h"
 
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 std::find();
 
int main()
{
    vector<int> ivec;
    int k, x=7;
    vector<int>::iterator i=ivec.begin();
    vector<int>::iterator j=ivec.end();
 
    cout << "Enter values: \n";
        while(cin>>k)
        ivec.push_back(k);
 
    cout << "gcd: " << gcd(i, j, x) << endl;
    system("pause");
    return 0;
}
Функция:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef LOCALMATH_H
#define LOCALMATH_H
 
 
bool gcd (int *v1, int *v2, int v3)
{
  
  return find(v1, v2, v3)!=v3;
 
   
}
 
#endif
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.08.2011, 13:28     функция типа bool #7
Romiys, Мда.

В h файле подключите хедер algorithm. Код будет такой.

C++
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef LOCALMATH_H
#define LOCALMATH_H
 
#include <algorithm>
 
bool gcd (int *v1, int *v2, int v3)
{
  
  return std::find(v1, v2, v3) != v2;
}
 
#endif
в cpp файле уберите нафиг эту строчку:

C++
1
std::find();
algorithm тоже подключать в cpp не надо.

А теперь главный вопрос. Кто давал гарантию, что итератор вектора - typedef на указатель?
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
24.08.2011, 13:32     функция типа bool #8
Цитата Сообщение от Romiys Посмотреть сообщение
#ifndef LOCALMATH_H
#define LOCALMATH_H
bool gcd (int *v1, int *v2, int v3)
{
return find(v1, v2, v3)!=v3;
}
#endif
Стандартный алгоритм find возвращает итератор указывающий на элемент эквивалентный третьему аргументу или итератор за последний элемент(то есть второй аргумент).

C++
1
2
3
4
bool gcd (int *v1, int *v2, int v3)
{
return find(v1, v2, v3)!=v2;
}
Romiys
3 / 3 / 0
Регистрация: 27.12.2010
Сообщений: 56
24.08.2011, 13:44  [ТС]     функция типа bool #9
Да, спасибо откомпелировалось, но не работает. Допустим, я ущу есть 7 в векторе или нет. х=7

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "localMath.h"
 
#include <iostream>
#include <vector>
 
using namespace std;
 
 
int main()
{
    vector<int> ivec;
    int k, x=7;
    vector<int>::iterator i=ivec.begin();
    vector<int>::iterator j=ivec.end();
 
    cout << "Enter values: \n";
        while(cin>>k)
        ivec.push_back(k);
 
    cout << "gcd: " << gcd(i, j, x) << endl;
    system("pause");
    return 0;
}
Функция

C++
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef LOCALMATH_H
#define LOCALMATH_H
#include <algorithm>
 
 
bool gcd (int *v1, int *v2, int v3)
{
  
  return std::find(v1, v2, v3)!=v2;
}
 
#endif
И не понимаю почему написано так:

C++
1
return std::find(v1, v2, v3)!=v2;
Зачем неравенство ... !=v2; И почему именно v2, а не v3 ???
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.08.2011, 13:47     функция типа bool #10
Romiys, А вы уверены что 7 в векторе есть?
Патаму ша
Romiys
3 / 3 / 0
Регистрация: 27.12.2010
Сообщений: 56
24.08.2011, 13:52  [ТС]     функция типа bool #11
Спасибо! Зачем неравенство ...!=v2 , я понял, а вот почему заданое число в векторе так и не находит понять не могу
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.08.2011, 13:54     функция типа bool #12
Romiys, У меня только два вопроса.

Что за компилятор?
Точно-ли вы вводите в вектор число 7?

Да и кстати. После push_back итераторы некорректны. Берите итератор после того как заполните вектор. Целее будете.

Подробнее

This effectively increases the vector size by one, which causes a reallocation of the internal allocated storage if the vector size was equal to the vector capacity before the call. Reallocations invalidate all previously obtained iterators, references and pointers.
Romiys
3 / 3 / 0
Регистрация: 27.12.2010
Сообщений: 56
24.08.2011, 14:03  [ТС]     функция типа bool #13
Да, уверен. Я проверял. Записывал в вектор числа и с 7 и без 7. Результат возвращает одинаковый - 0.
Компилятор VC ++. Сейчас попробую переделаю итераторы

Добавлено через 7 минут
Уррра! Работает! Спасибо!!! Точно проблема была в некорректности итераторов!

Спасибо за ссылку на описание функции find(). Всё описание на английском, буду переводить, въезжать как-то.

Такая простая прога и так сложно для меня было её писать. Вообще не понимаю как можно работать программистом, во всём этом разбираться и какие мозги надо иметь!!! :-)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.08.2011, 14:07     функция типа bool #14
Romiys, Было бы желание, остальное приходит.
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
24.08.2011, 14:48     функция типа bool #15
Вот рабочий код:
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
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
template<class InIter,class T>
bool gcd (InIter First, InIter Last, T Value)
{
 
    return find(First, Last, Value)!=Last;
}
 
int main()
{
    vector<int> ivec;
    int k, x=7;
 
    cout << "Enter values: \n";
    while(cin>>k,k != 0)
        ivec.push_back(k);
 
    cout << "gcd: " << boolalpha << gcd(ivec.begin(), ivec.end(), x) << endl;
    system("pause");
    return 0;
}
Во первых у вас неправильно:
vector<int>::iterator i=ivec.begin();
vector<int>::iterator j=ivec.end();
Сначала вы сохранили начало и конец вектора но после этого вы изменяете последовательность(добавляете элементы) и нет не какой гарантии что итератор конца сохранится.

Во вторых у вас неправильные параметры функции int* , а должно быть vector<int>::iterator либо шаблонные как у меня.

А в третих я не понимаю как это работает:
C++
1
2
 while(cin>>k)
                ivec.push_back(k);
То есть вы добавляете элементы в вектор до тех пор пока не конец потока(файла) cin, а это оооооочень долго.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.08.2011, 15:14     функция типа bool #16
Overmind024, Это пока мы не пошлем EOF или не введем нечто, что не будет числом.
Romiys
3 / 3 / 0
Регистрация: 27.12.2010
Сообщений: 56
24.08.2011, 16:15  [ТС]     функция типа bool #17
Всем большое спасибо за то, что помогли мне найти ошибки! :-) Я понял и теперь всё правильно работает.



А в третих я не понимаю как это работает:
C++
1
2
 while(cin>>k)
                ivec.push_back(k);
То есть вы добавляете элементы в вектор до тех пор пока не конец потока(файла) cin, а это оооооочень долго.
Отвечаю на Ваш вопрос. Я ввожу числа через Enter. Потом нажимал CTRL+Z, что обозначало конец ввода.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.08.2011, 16:22     функция типа bool #18
Цитата Сообщение от Overmind024 Посмотреть сообщение
А в третих я не понимаю как это работает:

C++
1
2
while(cin>>k)
    ivec.push_back(k);
То есть вы добавляете элементы в вектор до тех пор пока не конец потока(файла) cin, а это оооооочень долго.
Для fstream перегружен оператор void*(), который возвращает нулевое значение, если стоят флаги failbit или badbit. Любое ненулевое число, соответственно, если не стоят. Как только вводиться EOF или другой недопустимый символ устанавливается соответствующий флаг, выражение cin >> k становиться ложью и цикл прерывается. Как-то так.
Сыроежка
Заблокирован
24.08.2011, 20:54     функция типа bool #19
Цитата Сообщение от Romiys Посмотреть сообщение
Привет! Подскажите пожалуйста как написать функцию типа bool. Есть вектор целых чисел, в котором надо найти заданное число. Если оно есть функция возвращает true, если такова числа в векторе нет - выдаёт false. Подскажите как исправить ошибку?

C++
1
2
3
4
5
6
7
8
9
10
11
12
bool gcd (int *v1, int *v2, int v3)
{
  if (find(v1, v2, v3)) 
  {
  return true;
 
  }else{
  
  return false;
  }
   
}
Используйте теги форматирования кода!
Во-первых, у вас неправильно задано объявление функции. Если вы имеете дело с вектором, то следует пользоваться его итератором, а не указателями на int.

Поэтому объявление функции должно выглядеть так

C++
1
bool gcd ( std::vector<int>::iterator it1, std::vector<int>::iterator it2, int value );
Определение этой функции следующее

C++
1
2
3
4
bool gcd ( std::vector<int>::iterator it1, std::vector<int>::iterator it2, int value )
{
   return ( std::find( it1, it2, value ) != it2 );
}
То есть совсем не обязательно, что итератор в вектор реализован в виде обычного указателя. Поэтому параметры вашей функции должны иметь тип итераторв вектора, а не указателей на int.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2011, 20:58     функция типа bool
Еще ссылки по теме:

Переменная типа bool C++
Переменные типа bool C++
Цикл и переменная типа bool C++

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

Или воспользуйтесь поиском по форуму:
diagon
24.08.2011, 20:58     функция типа bool
  #20

Не по теме:

А при чем тут gcd? Это же НОД, только на инглише.

Yandex
Объявления
24.08.2011, 20:58     функция типа bool
Ответ Создать тему
Опции темы

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