Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 54, средняя оценка - 5.00
Romiys
3 / 3 / 0
Регистрация: 27.12.2010
Сообщений: 56
#1

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

24.08.2011, 11:49. Просмотров 9402. Ответов 19
Метки нет (Все метки)

Привет! Подскажите пожалуйста как написать функцию типа 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;
  }
   
}
 Комментарий модератора 
Используйте теги форматирования кода!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2011, 11:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос функция типа bool (C++):

Функция типа bool - C++
Сумма первой и последней цифры в введенном четырехзначном числе является нечетным значением. Если это так, то функция должна возвращать...

Сформировать массив типа bool из массива типа char - C++
Доброго времени суток! После ввода элементов массива вылазит ошибка "Необработанное исключение: System.NullReferenceException ... "...

Переменные типа bool - C++
Сколько переменных типа bool здесь определено: bool &l1, &p2, **t3, b4, *n5, w6;

Переменная типа bool - C++
Что значит данная строчка? for (int i = 0; i < n - 1 && uvelichenie; i++) #include <iostream.h> #include <windows.h> int...

Возвращение типа bool - C++
Написать встроенную функцию, которая возвращает значение типа bool в зависимости от истинности утверждения. Функция должна иметь столько...

размер типа bool - C++
сколько занимает в памяти bool?

19
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
24.08.2011, 11:55 #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;
}
 
}
1
Romiys
3 / 3 / 0
Регистрация: 27.12.2010
Сообщений: 56
24.08.2011, 12:07  [ТС] #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

 Комментарий модератора 
ОК, второе замечание о тегах. В следующий раз будет карточка.
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
24.08.2011, 12:09 #4
ForEveR, или, если сократить (с учётом того, что всё остальное правильно):
C++
1
2
3
4
bool gcd (int *v1, int *v2, int v3)
{
    return find(v1, v2, v3) != v2;
}
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
24.08.2011, 12:56 #5
Romiys, Не v3, а v2. Во вторых #include <algorithm> в файле.
В третьих std::find.
1
Romiys
3 / 3 / 0
Регистрация: 27.12.2010
Сообщений: 56
24.08.2011, 13:21  [ТС] #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
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
24.08.2011, 13:28 #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 на указатель?
0
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
24.08.2011, 13:32 #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;
}
1
Romiys
3 / 3 / 0
Регистрация: 27.12.2010
Сообщений: 56
24.08.2011, 13:44  [ТС] #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 ???
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
24.08.2011, 13:47 #10
Romiys, А вы уверены что 7 в векторе есть?
Патаму ша
0
Romiys
3 / 3 / 0
Регистрация: 27.12.2010
Сообщений: 56
24.08.2011, 13:52  [ТС] #11
Спасибо! Зачем неравенство ...!=v2 , я понял, а вот почему заданое число в векторе так и не находит понять не могу
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
24.08.2011, 13:54 #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.
1
Romiys
3 / 3 / 0
Регистрация: 27.12.2010
Сообщений: 56
24.08.2011, 14:03  [ТС] #13
Да, уверен. Я проверял. Записывал в вектор числа и с 7 и без 7. Результат возвращает одинаковый - 0.
Компилятор VC ++. Сейчас попробую переделаю итераторы

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

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

Такая простая прога и так сложно для меня было её писать. Вообще не понимаю как можно работать программистом, во всём этом разбираться и какие мозги надо иметь!!! :-)
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
24.08.2011, 14:07 #14
Romiys, Было бы желание, остальное приходит.
1
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
24.08.2011, 14:48 #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, а это оооооочень долго.
1
24.08.2011, 14:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2011, 14:48
Привет! Вот еще темы с ответами:

Цикл и переменная типа bool - C++
У меня есть переменная типа bool, которая при bool == true выводит звездочку, а при bool == false записывает пробел на место звездочки. Как...

Работа с глобальной переменной типа bool - C++
ок, я создала глобальную переменную типа bool (да, лучше этого избегать и все такое, но сейчас так надо) пусть будет bool abc; в main...

Функция с типом bool - C++
Добрый день! Есть функция main в которой надо вызвать другую функцию ( bool Simple с переменной int ), которая выводит является ли...

Почему переменная типа bool весит 1 байт? - C++
Всем доброго времени суток! Не подскажете, почему булеан весит 1 байт если он имеет всего два значения 0 и 1, следовательно он должен...


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

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

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