С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
7 / 6 / 1
Регистрация: 24.11.2017
Сообщений: 124

C++ Неверно сравнивает элементы вектора (ошибка в условии)

01.11.2020, 16:25. Показов 600. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача в том, чтобы сравнить элементы вектора на монотонность нестрогого возрастания/убывания (если оно есть, то тогда TRUE, если его нет, то FALSE). Так же учитывается условия, когда элементы и возрастают, и убывают, а также когда они все равны.
Пользователь сам указывает размер вектора в методе класса, потом вызывается функция вне класса, где это все сравнивается и возвращает конечные значения. Именно в этой функции надо что-то исправить, сам пока не разобрался
Вот фрагмент кода:
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
int get_definition(int size, bool f, bool s, vector<int> vec)
    {
        f = false; s = false;
        for (int i = 0; i<size - 1; ++i){
            if (vec[i] < vec[i + 1]){
                if (f){
                    cout << "incorrect values\n";
                    return 0;
                }
                else s = true;
            }
            if (vec[i] > vec[i + 1]){
                if (s){
                    cout << "undefined (FALSE)\n";
                    return 0;
                }
                else f = true;
            }
        }
        if (!f && !s)cout
        << "all elements are equal (FALSE)";
        else if (f)cout << "decrease(TRUE)";
        else cout << "increase (TRUE)";
        vec.pop_back();
    }
};
Весь код:
Кликните здесь для просмотра всего текста
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <conio.h>
using namespace std;
 
class my_vector
{
private:
    //bool f, s;
    int size;
    vector<int> vec;
public:
    void vector_definition(int size)
    {
        vector<int> vec(size);
        cout << "elements:\n";
        for (int i = 0; i < size; i++) {
            cout << "i[" << i << "] = ";
            cin >> vec[i];
        }
        cout << "vector's size: " << size << endl;
        cout << "your vector: ( ";
        for (int i = 0; i < size; i++)
            cout << vec[i] << ' ';
        cout << ")"<< endl;
        
    }
    int get_definition(int size, bool f, bool s, vector<int> vec)
    {
        f = false; s = false;
        for (int i = 0; i<size - 1; ++i){
            if (vec[i] < vec[i + 1]){
                if (f){
                    cout << "incorrect values\n";
                    return 0;
                }
                else s = true;
            }
            if (vec[i] > vec[i + 1]){
                if (s){
                    cout << "undefined (FALSE)\n";
                    return 0;
                }
                else f = true;
            }
        }
        if (!f && !s)cout
        << "all elements are equal (FALSE)";
        else if (f)cout << "decrease(TRUE)";
        else cout << "increase (TRUE)";
        vec.pop_back();
    }
};
 
 
 
int main() {
    int size;
    bool f = 0, s = 0;
    cout << "size: ";
    cin >> size;
    my_vector run;
    run.vector_definition(size);
    vector<int> vec(size);
    run.get_definition(size,f,s,vec);
    _getch();
}


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

Полностью рабочий код без классов и функций:
Кликните здесь для просмотра всего текста
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
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <vector>
#include <conio.h>
using namespace std;
 
 
int main() {
    int size;
    vector<int> vec(size);
    ////1
    cout<<"size: ";
    cin>>size;
    cout<<"elements:\n";
    for(int i = 0; i < size; i++) {
        cout<<"i["<<i<<"] = ";
        cin>>vec[i];
    }
    bool f = false,s = false;
    cout<<"your vector: ";
    for(int i = 0; i < size; i++)
        cout << vec[i] << ' ';
    cout<<endl;
    
    for(int i = 0;i<size-1;++i){
        if(vec[i] < vec[i+1]){
            if(f){
                cout << "incorrect values\n";
                return 0;
            } else s = 1;
        }
        if(vec[i] > vec[i+1]){
            if(s){
                cout << "undefined (false)\n";
                return 0;
            } else f = 1;
        }
    }
      if(!f && !s)cout << "all elements are equal";
    else if(f)cout << "decrease(true)";
    else cout << "increase (true)";
}


Пожалуйста помогите, нужно срочно (скоро дедлайн).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.11.2020, 16:25
Ответы с готовыми решениями:

Неверно сравнивает даты функция CompareDateTime
function DateListSortDesc(List: TStringList; Index1, Index2: Integer): Integer; {- функция для пользовательской сортировки списков даты и...

Не сравнивает русский текст в условии
Не могу понять в чем проблема. При вводе слова &quot;вова&quot; должно выводить &quot;твое имя вова&quot; , а выполняется второе условие &quot;У тебя...

Заменить элементы вектора, равные максимальному, на последний элемент вектора
Если в векторе максимальный элемент встречается больше одного раза, то заменить элементы, равные максимальному на последний элемент вектора.

5
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433
01.11.2020, 16:44
starpower, ты уверен, что вектор в 12-ой строке vector<int> vec; (твои данные) и вектор в 16-ой строке vector<int> vec(size); один и тот же вектор? Вектор в 16-ой строке это временный вектор, когда метод вызвался, то все аргументы "разложились" на стеке по порядку следования, когда метод отработал, то все аргументы "сложились" в обратном порядке, короче говоря удалились.
0
7 / 6 / 1
Регистрация: 24.11.2017
Сообщений: 124
01.11.2020, 16:56  [ТС]
Timurs, боже, это опять вы))) честно, я не очень силен в ООП, а мне надо реализовать инкапсуляцию. То бишь, мне надо модификатор доступа для vector<int> vec;? В сам метод класса его переместить?
0
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433
01.11.2020, 17:27
starpower, ты когда создал объект
C++
1
my_vector run;
То у тебя данные должны быть проинициализированы, в данных у тебя два поля
C++
1
2
int size;
vector<int> vec;
То есть в момент создания объекта
C++
1
my_vector run;
у тебя вызывается конструктор по умолчанию.
Вот теперь возьми и посмотри, что этот конструктор по умолчанию сделал с твоими данными
C++
1
2
cout << "size data: " << run.size << endl;
cout << "vector data: " << run.vec << endl;
Если сделано не так, как ты этого хотел, то пиши конструктор руками. Передавай туда сайз и делай ресайз вектора.

Добавлено через 7 минут
starpower, возможно меня сейчас тут тухлыми помидорами закидают, но инкапсуляция и сокрытие данных всё - таки разные вещи. Инкапсуляция это, ну вот ты написал класс, в нем ты описал данные, а также методы, которые производят с этими данными те или иные операции, и всё это в одном классе, в одном месте, вот это и есть инкапсуляция, класс как бы инкапсулирует это всё дело, то есть внутри него ты можешь работать со всеми этими данными в независимости от того приватные они или нет, а сокрытие данных это как бы интерфейс, то есть ты задаёшь сможет ли извне кто-то (из того же мейна) обратиться к каким-то данным или нет. То есть инкапсуляцию ты сделал.

Добавлено через 15 минут
starpower, нет, в классе должны быть данные (они у тебя есть, я выше писал об этом), а также методы, которые оперируют этими данными (они у тебя тоже есть). Тут всё хорошо. Ты просто не понимаешь как создаётся объект, объект создаётся конструктором, конструктор это функция, имя которой совпадает с именем класса, если ты не писал явно этот конструктор, то компилятор сам его пишет за тебя. Лично я стараюсь всегда писать конструкторы сам. Да и вообще конструктор это одна из самых важных вещей в ооп на мой взгляд.

Добавлено через 7 минут
starpower, Nishen писал же тебе про Липмана базовый курс, открой почитай немного, потом открой Топпа, Форда "Структуры данных в C++" и прочитай первые три главы, реши все задачи по этим главам, особенно внимательно читай вторую главу по базовым типам данных, он как раз абстрактно пишет как выглядят классы этих базовых типов, в третьей главе уже про классы говорит. Ну уйдёт у тебя полгода, но хоть минимальное понимание будет. Тут дело не в языке, это в принципе основы.
0
7 / 6 / 1
Регистрация: 24.11.2017
Сообщений: 124
01.11.2020, 18:12  [ТС]
Timurs, спасибо ща помощь...
Честно, мне нахер не нужно это программирование и этот мерзкий С++ я ненавижу каждой клеточкой своего тела (что наверное касается всех ЯП), пусть хоть меня трижды закидают здесь помидорами) мне просто хочется поскорее закончить все свои дедлайны, сдать весь свой говнокод и отвязаться от этого всего. Поэтому я и здесь, чтобы люди которые обожают программирование, а в особенности С++, который возможно даже заменяет им девушку/жену чем-то смогли помочь, абсолютно уверен в том, что все эти вещи для них как 2+2 и все решается элементарно просто. Учебная программа моего вуза просто вынуждает всем этим заниматься. Я и сам знаю что у меня куча пробелов, которые наверстывать уже поздно, так как я уже давно как ни 1-ый и даже не 2-ой курс. За годы изучения программирования моя ненависть только возросла (конечно это не вина С++ и прочих ему), потому что ни черта в нашем вузе не учат и язык на котором мы обучаемся (несмотря на то, что поступал я в русскоязычный поток) они тоже ничерта не знают. А если интересно где я учусь, то учусь я в Ташкентском Университете "Информационных технологий", самом ужасном и конченном универе по данной специальности, а учится где либо еще у меня возможности нет))) так что не надо забивать мне голову своими нотациями, сегодня мне надо - завтра нафиг уже все забуду. Все равно когда закончу вуз, буду работать в макдаке.

Добавлено через 6 минут

Добавлено через 27 секунд
Timurs,
хз вот переделал и все равно ошибка
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <conio.h>
using namespace std;
 
class my_vector
{
private:
    //bool f, s;
    int size=0;
    vector<int> vec=0;
public:
    my_vector(){
        cout << "size: ";
        cin >> size;
    }
    int vector_definition(int size)
    {
        vector<int> vec(size);
        cout << "elements:\n";
        for (int i = 0; i < size; i++) {
            cout << "i[" << i << "] = ";
            cin >> vec[i];
        }
        cout << "vector's size: " << size << endl;
        cout << "your vector: ( ";
        for (int i = 0; i < size; i++)
            cout << vec[i] << ' ';
        cout << ")" << endl;
    }
    int get_definition(int size, bool f, bool s, vector<int> vec)
    {
        f = false; s = false;
        for (int i = 0; i < size - 1; ++i){
 
            if (vec[i] < vec[i + 1])
            {
 
                //f = 1;
                cout << "increase (TRUE)";
                cout << endl;
                //return f;
            }
 
 
            else if (vec[i] > vec[i + 1])
            {
                if (f){
 
                    cout << "incorrect values\n";
                    return 0;
            } else s = 0;
                //cout << "increase (TRUE)";
                //cout << endl;
                //return s;
            }
 
            
            if (vec[i] < vec[i + 1])
            {
                if (s)
                {
                    cout << "undefined (false)\n";
                    return 0;
                }
                else f = 0;
                
                //cout << "all elements are equal (FALSE)";
                //return 0;
            }
 
        }
        if (!f && !s)cout << "all elements are equal";
        else if (s)cout << "decrease(true)";
        else cout << "increase (true)";
        cout << "your vector: ( ";
        for (int i = 0; i < size; i++)
            cout << vec[i] << ' ';
        cout << ")" << endl;
    }
};
 
 
 
int main() {
    my_vector run;
    run.vector_definition(size);
    run.get_definition(size, f,s,vec);
    _getch();
}
Зря я эти хреновы классы и функции пытался замостить. Только кучу времени и нервов зря потратил.

Добавлено через 13 минут
Timurs, спасибо большое за помощь, все заработало:
Кликните здесь для просмотра всего текста
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <conio.h>
using namespace std;
 
class my_vector
{
private:
    //bool f, s;
    int size=0;
    vector<int> vec=0;
public:
    my_vector(){
        cout << "size: ";
        cin >> size;
    }
    int vector_definition()
    {
        vector<int> vec(size);
        cout << "elements:\n";
        for (int i = 0; i < size; i++) {
            cout << "i[" << i << "] = ";
            cin >> vec[i];
        }
        cout << "vector's size: " << size << endl;
        cout << "your vector: ( ";
        for (int i = 0; i < size; i++)
            cout << vec[i] << ' ';
        cout << ")" << endl;
 
        bool f = false, s = false;
        for (int i = 0; i < size - 1; ++i){
 
            if (vec[i] < vec[i + 1])
            {
                if (f){
 
                    cout << "incorrect values\n";
                    return 0;
                }
                else s = 1;
            }
 
 
            if (vec[i] > vec[i + 1])
            {
                if (s)
                {
                    cout << "undefined (false)\n";
                    return 0;
                }
                else f = 1;
            }
    }
        if (!f && !s)cout << "all elements are equal";
        else if (f)cout << "decrease(true)";
        else cout << "increase (true)";
 
    }
};
 
int main() {
    my_vector run;
    run.vector_definition();
    _getch();
}


И отдельное спасибо за то, что заменяете нам наших учителей, которым по правде нет никакого дела знаем ли мы что-то или нет) я очень ценю то что вы для нас студентов делаете, не знаю чтобы мы без вас делали)
0
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433
01.11.2020, 19:58
starpower, давай просто последовательно, от простого к сложному.

Наша первая задача, выяснить, что делает с нашими данными конструктор по умолчанию, он же дефолтный конструктор.
Что для этого нам потребуется? Очевидно, накидать минимально простейший класс и посмотреть.
Ок, пишем код.
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>
 
using std::cout; using std::endl; using std::cin;
 
class MyClass
{
private:
    int size;
    std::vector<int> vec;
public:
 
    void print() { 
        cout << "size data: " << size << endl;
        cout << "vector data: " << endl;
        for (int i : vec) cout << i << " ";
    }
};
 
int main() {
 
    MyClass myVec;
    myVec.print();
 
    return 0;
}
Запускаем, видим, что size data: 0 и vector data: пустой.
Это явно не то, что мы хотели увидеть.

Ок, наша вторая задача написать конструктор явно.
Пишем.
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
33
#include <iostream>
#include <vector>
 
using std::cout; using std::endl; using std::cin;
 
class MyClass
{
private:
    int size;
    std::vector<int> vec;
public:
    MyClass(int len) : size(len), vec(len) {
        
        for (int& i : vec) cin >> i;
 
    }
 
    void print() { 
        cout << "size data: " << size << endl;
        cout << "vector data: " << endl;
        for (int i : vec) cout << i << " ";
    }
};
 
int main() {
 
    int const size = 5;
 
    MyClass myVec(size);
    myVec.print();
    
    return 0;
}
Уже работает.

Ок, наша третья задача разрешить пользователю вводить только целые числа, так как у нас вектор целых чисел.
Ок, пишем.
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <vector>
 
using std::cout; using std::endl; using std::cin;
 
class MyClass
{
private:
    int size;
    std::vector<int> vec;
public:
    MyClass(int len) : size(len), vec(len) {
        
        for (int& i : vec) {
            
            /* Валидация целого числа */
            while (! (cin >> i) ) { // тело цикла будет работать 
                                         // пока пользователь не введёт целое число
                
                cout << "It is not a number!" << endl; // предупреждаем его об этом
                
                cin.clear(); // сбрасываем флаг ошибки входного потока
                
                /* cin.rdbuf()->in_avail() возвращает количество символов во входном потоке */
                cin.ignore(cin.rdbuf()->in_avail()); // очищаем входной поток
 
            }
 
        }
 
    }
 
    void print() { 
        cout << "size data: " << size << endl;
        cout << "vector data: " << endl;
        for (int i : vec) cout << i << " ";
    }
};
 
int main() {
 
    int size = 5;
 
    MyClass myVec(size);
    myVec.print();  
 
    return 0;
}
Всё работает, объект создаётся, данные инициализируются так как мы этого хотим, приступаем к задаче. Как-то так собственно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.11.2020, 19:58
Помогаю со студенческими работами здесь

Упорядочить по убыванию элементы вектора Z, полученные из элементов исходного вектора
Упорядочить по убыванию элементы вектора Z полученные из элементов вектора y ={-0.5;4.3;-2.1;1.5;-5.1;6.3;-4.5;2.8;-6.5} множением на...

Дан список, элементы которого являются координатами вектора. Найти длину вектора
1. Дан список, элементы которого являются координатами вектора в n-мерном пространстве. Найти длину вектора.

Из вектора получить матрицу 4-го порядка, в каждом столбце которого записаны последовательно элементы вектора
Помогите,не могу понять как это сделать : Задан вектор x=1:16. Получить из него матрицу 4-го порядка, в каждом столбце которого записаны...

Из вектора С сформировать вектор А, содержащий четные элементы вектора С
Всем здравствуйте, у меня возникла проблема с решением задачи связанной с вектором, хочу просить помощи специалистов, условия задачи...

STL. Функция, которая будет искать элементы большее среднего арифметического вектора и удалять их из вектора
у меня есть вектор, помогите пожалуйста дописать функцию, которая будет искать элементы большее среднего арифметического вектора и удалять...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru