0 / 0 / 0
Регистрация: 23.02.2018
Сообщений: 71
1

Пропуск вывода функции

19.08.2020, 20:20. Показов 332. Ответов 11

Столкнулся с проблемой. При запуске программы должна выводиться функция menu. Но в итоге получаем черный экран Почему не имеем к ней доступа? Да можно реализовать ее и в mein. Но все же интересно почему так

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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include<iostream>
#include<string>
#include<Windows.h>
#include<ctime>
using namespace std;
 
template<typename T, typename T2, typename T3>
class List
{
public:
    List();
    ~List();
 
    
    void push_back(T name, T2 price, T3 quantity);              //добавить элемент в конец списка
 
    
    int GetSize() { return Size; }      //возвращает кол-во эл. в списке
    void print_next();                  //Печать от 0 до Size
 
    public:
template<typename T, typename T2, typename T3>
    class Node                          //класс элемента
    {
public:
        Node* pNext;                //Указатель на следующий элемент
        Node* pPrev;                //Указатель на предыдущий элемент
                                    //Порядковый номер товара
        T name;                     //Название товара
        T2 price;                   //Цена за единицу товара
        T3 quantity;                //Количество товара
 
                                    //конструктор для класса Node куда передаем данные и указатели на сл/пред элемент
        Node(T name = T(), T2 price = T2(), T3 quantity = T3(), Node* pNext = nullptr, Node* pPrev = nullptr)
        {
            this->name = name;
            this->price = price;
            this->quantity = quantity;
            this->pNext = pNext;
            this->pPrev = pPrev;
        }
    };
    int Size;                           //Для счета количества элементов
    Node<T,T2,T3>* head;                //Начало списка(указатель т.к. все элементы будут выделяться в дин. памяти)
    Node<T, T2, T3>* tail;              //Конец списка
};
template<typename T, typename T2, typename T3>
List<T, T2, T3>::List()
{
    Size = 0;
    head = tail = nullptr;              //показывем что список пуст
}
 
template<typename T, typename T2, typename T3>
List<T, T2, T3>::~List()                        //деструктор для очистки списка в дин. памяти 
{
    cout << "Вызвался диструктор";
    //clear();
}
template<typename T, typename T2, typename T3>      //Переделать на поиск элемента и с конца списка
void List<T, T2, T3>::print_next()
{
    Node<T, T2, T3>* temp = head;
    for (int i = 0; i < Size; i++)
    {
        if (Size == 0)
        {
            cout << "Список пуст" << endl;
        }
        else
        {
            cout << i + 1 << "-" << temp->name;
            cout << "\t" << temp->price;
            cout << "\t" << temp->quantity << endl;
            temp = temp->pNext;
        }
    }
    cout << endl;
}
template<typename T, typename T2, typename T3>              //добавление элемента в конец списка(+)
void List<T, T2, T3>::push_back(T name, T2 price, T3 quantity)      //реализация метода добавления данных в конец списка
{
    Node<T, T2, T3> *temp = new Node<T, T2, T3>(name, price, quantity);
    temp->pNext = nullptr;
    if (tail == nullptr)                //проверка не пустой ли элемент
    {
        head = tail = temp;             //записываем данные в список
    }
    else
    {
        temp->pPrev = tail;         //Указываем, что предыдущим элементом списка относительно добавленного, будет последний элемент существующего списка
        tail->pNext = temp;         //в последнем элементе указателю на сл адрес  присваиваем вр. переменную
        tail = temp;                //присваиваем последнему элементу временную переменную
    }
    Size++;                         //+1 добавленный элемент
}
void menu()
{
    system("cls");
    cout << "1. Создать список" << endl;
    cout << "2. Просмотр списка" << endl;
    cout << "3. Добавить в список новую запись" << endl;
    cout << "4. Найти и откорректировать запись" << endl;
    cout << "5. Удалить запись из списка" << endl;
    cout << "6. Сохранить список в файл" << endl;
    cout << "7. Загрузить список из файла" << endl;
    cout << "0. Exit" << endl;
    cout << ">> ";
}
int main()
{
    SetConsoleCP(1251);                 //для ввода русских символов
    SetConsoleOutputCP(1251);           // для вывода русских символов
    srand(time(NULL));  
    List<string, double, int> lst;
    int mItem; //для меню
    do
    {
        void menu();
        cin >> mItem;
        switch (mItem)
        {
        case 1: 
        {
            system("cls");
            int nList;
            cout << "Введите сколько вы хотите добавить элементов >> ";
            cin >> nList;
            string name;
            double price;
            int quanity;
            
            for (int i = 0; i < nList; i++)
                {
                    cout << "Введите название товара >> "; cin >> name;
                    cout << "\nВведите цену за единицу товара >> "; cin >> price;
                    cout << "\nВведите кол-во товара >> "; cin >> quanity;
                    lst.push_back(name, price, quanity);
                    system("cls");
                }
            lst.print_next();
            break;
        }
        case 2: system("cls");      break;
        case 3: system("cls");      break;
        case 4: system("cls");      break;
        case 5: system("cls");      break;
        case 6: system("cls");      break;
        case 7: system("cls");      break;
        case 0:break;
        }
        if (mItem != 0)
        {
            system("pause");
        }
    } while (mItem != 0);
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2020, 20:20
Ответы с готовыми решениями:

Странный пропуск функции
Продолжаю зучать книгу Дейтелов, 5 издание. Дошёл до упражнения 3.14. Нужно создать класс...

Обеспечить пропуск расчетов при значениях функции в заданном интервале
Обеспечить пропуск расчетов при 0.3&lt;cos(x)&lt;0.4.

Написать программу, которая должна включать функции для: - вывода шапки таблицы; - вывода данных одной строки
Написать программу, которая должна включать функции для: - вывода шапки таблицы; - вывода данных...

Ошыбка C2334: непредвиденные лексемы перед "{"; пропуск вероятного тела функции
Не могу понять где ошыбка и как ее исправить . Друзья, помогите пожалуйста 1&gt;------ Построение...

11
1825 / 982 / 413
Регистрация: 11.10.2018
Сообщений: 5,109
19.08.2020, 20:25 2
Цитата Сообщение от energ1 Посмотреть сообщение
C++
1
void menu();
- зачем здесь слово void? Это ошибка.
1
0 / 0 / 0
Регистрация: 23.02.2018
Сообщений: 71
19.08.2020, 20:36  [ТС] 3
Цитата Сообщение от FFPowerMan Посмотреть сообщение
здесь слово void? Это ошибка.
Спасибо. То мучился с public/private то эти мелкие ошибки, спасибо - глаз уже заплыл с учебой))

Добавлено через 4 минуты
Сразу Вопрос задам. Можем ли мы работать с классом лист через функции находящиеся вне класса так чтобы при завершении функции у нас не вызывался деструктор.
На примере этой же программы. если мы case 1 вынесем в функцию, а в case 2 вынесем допустим в функцию вывода на экран то:
вызвав case 1 мы введем данные успешно, но когда мы дойдем до границы функции у нас вызовется деструктор
далее вызываем case 2 и получим пустой список
0
1825 / 982 / 413
Регистрация: 11.10.2018
Сообщений: 5,109
19.08.2020, 20:41 4
Кликните здесь для просмотра всего текста
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include <iostream>
#include <string>
#include <Windows.h>
#include <ctime>
#include <locale.h>
using namespace std;
 
template<typename T, typename T2, typename T3>
class Node                          //класс элемента
{
public:
        Node* pNext;                //Указатель на следующий элемент
        Node* pPrev;                //Указатель на предыдущий элемент
                                    //Порядковый номер товара
        T name;                     //Название товара
        T2 price;                   //Цена за единицу товара
        T3 quantity;                //Количество товара
 
                                    //конструктор для класса Node куда передаем данные и указатели на сл/пред элемент
        Node(T name = T(), T2 price = T2(), T3 quantity = T3(), Node* pNext = nullptr, Node* pPrev = nullptr)
        {
            this->name = name;
            this->price = price;
            this->quantity = quantity;
            this->pNext = pNext;
            this->pPrev = pPrev;
        }
};
 
template<typename T, typename T2, typename T3>
class List
{
public:
    List();
    ~List();
 
    
    void push_back(T name, T2 price, T3 quantity);              //добавить элемент в конец списка
 
    
    int GetSize() { return Size; }      //возвращает кол-во эл. в списке
    void print_next();                  //Печать от 0 до Size
 
    int Size;                           //Для счета количества элементов
    Node<T,T2,T3>* head;                //Начало списка(указатель т.к. все элементы будут выделяться в дин. памяти)
    Node<T, T2, T3>* tail;              //Конец списка
};
template<typename T, typename T2, typename T3>
List<T, T2, T3>::List()
{
    Size = 0;
    head = tail = nullptr;              //показывем что список пуст
}
 
template<typename T, typename T2, typename T3>
List<T, T2, T3>::~List()                        //деструктор для очистки списка в дин. памяти 
{
    cout << "Вызвался диструктор";
    //clear();
}
template<typename T, typename T2, typename T3>      //Переделать на поиск элемента и с конца списка
void List<T, T2, T3>::print_next()
{
    Node<T, T2, T3>* temp = head;
    for (int i = 0; i < Size; i++)
    {
        if (Size == 0)
        {
            cout << "Список пуст" << endl;
        }
        else
        {
            cout << i + 1 << "-" << temp->name;
            cout << "\t" << temp->price;
            cout << "\t" << temp->quantity << endl;
            temp = temp->pNext;
        }
    }
    cout << endl;
}
template<typename T, typename T2, typename T3>              //добавление элемента в конец списка(+)
void List<T, T2, T3>::push_back(T name, T2 price, T3 quantity)      //реализация метода добавления данных в конец списка
{
    Node<T, T2, T3> *temp = new Node<T, T2, T3>(name, price, quantity);
    temp->pNext = nullptr;
    if (tail == nullptr)                //проверка не пустой ли элемент
    {
        head = tail = temp;             //записываем данные в список
    }
    else
    {
        temp->pPrev = tail;         //Указываем, что предыдущим элементом списка относительно добавленного, будет последний элемент существующего списка
        tail->pNext = temp;         //в последнем элементе указателю на сл адрес  присваиваем вр. переменную
        tail = temp;                //присваиваем последнему элементу временную переменную
    }
    Size++;                         //+1 добавленный элемент
}
void menu()
{
    system("cls");
    cout << "1. Создать список" << endl;
    cout << "2. Просмотр списка" << endl;
    cout << "3. Добавить в список новую запись" << endl;
    cout << "4. Найти и откорректировать запись" << endl;
    cout << "5. Удалить запись из списка" << endl;
    cout << "6. Сохранить список в файл" << endl;
    cout << "7. Загрузить список из файла" << endl;
    cout << "0. Exit" << endl;
    cout << ">> ";
}
int main()
{
    setlocale(LC_ALL, "Rus");
    //SetConsoleCP(1251);                 //для ввода русских символов
    //SetConsoleOutputCP(1251);           // для вывода русских символов
    srand(time(NULL));  
    List<string, double, int> lst;
    int mItem; //для меню
    do
    {
        menu();
        cin >> mItem;
        switch (mItem)
        {
        case 1: 
        {
            system("cls");
            int nList;
            cout << "Введите сколько вы хотите добавить элементов >> ";
            cin >> nList;
            string name;
            double price;
            int quanity;
            
            for (int i = 0; i < nList; i++)
                {
                    cout << "Введите название товара >> "; cin >> name;
                    cout << "\nВведите цену за единицу товара >> "; cin >> price;
                    cout << "\nВведите кол-во товара >> "; cin >> quanity;
                    lst.push_back(name, price, quanity);
                    system("cls");
                }
            lst.print_next();
            break;
        }
        case 2: system("cls");      break;
        case 3: system("cls");      break;
        case 4: system("cls");      break;
        case 5: system("cls");      break;
        case 6: system("cls");      break;
        case 7: system("cls");      break;
        case 0:break;
        }
        if (mItem != 0)
        {
            system("pause");
        }
    } while (mItem != 0);
    return 0;
}


Добавлено через 1 минуту
Цитата Сообщение от energ1 Посмотреть сообщение
Можем ли мы работать с классом лист через функции находящиеся вне класса
- думаю можно при условии, что все поля класса public. Только не с классом работать, а с объектом.
0
2136 / 1051 / 402
Регистрация: 08.11.2016
Сообщений: 3,018
19.08.2020, 22:52 5
FFPowerMan, можно и без public, есть же друзья

energ1, а вообще, в большинстве случаев, можно обойтись функциями членами класса.
0
0 / 0 / 0
Регистрация: 23.02.2018
Сообщений: 71
19.08.2020, 23:08  [ТС] 6
Вообщем если работать только классом то проще реализовать вск функции в нем. Или сделать их friend.

Еще вопрос 1. Как лучше ревлизовать запись и чтение данных по текущей проге.
0
1825 / 982 / 413
Регистрация: 11.10.2018
Сообщений: 5,109
20.08.2020, 08:57 7
Цитата Сообщение от energ1 Посмотреть сообщение
C++
1
T name = T()
- а зачем = T()?
0
С чаем беда...
Эксперт CЭксперт С++
9263 / 4762 / 1289
Регистрация: 18.10.2014
Сообщений: 10,841
20.08.2020, 09:21 8
Цитата Сообщение от FFPowerMan Посмотреть сообщение
- а зачем = T()?
Это вызовет инициализацию даже для объектов без пользовательского конструктора.
0
2136 / 1051 / 402
Регистрация: 08.11.2016
Сообщений: 3,018
20.08.2020, 14:03 9
Цитата Сообщение от energ1 Посмотреть сообщение
Как лучше ревлизовать запись и чтение данных по текущей проге.
Очевидно перегрузить операторы << и >> для класса List, примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template<typename T, typename T2, typename T3>
class List;
 
template<typename T, typename T2, typename T3>
std::ostream & operator<<(std::ostream &, const List<T, T2, T3> &);
 
template<typename T, typename T2, typename T3>
class List
{
// ваш код
    friend std::ostream & operator<< <>(std::ostream &out, const List &lst)
    {
        // реализация перегрузки
    }
};
0
0 / 0 / 0
Регистрация: 23.02.2018
Сообщений: 71
20.08.2020, 14:21  [ТС] 10
Цитата Сообщение от FFPowerMan Посмотреть сообщение
T name = T()
C++
1
2
Node(T name    -  Так у нас здесь лежит мусор
Node(T name = T()  -  а так при Если передаем сюда класс то вызывается конструктор по умолчанию, если данные то присваивается в поле значение по умолчанию этого типа данных
0
1825 / 982 / 413
Регистрация: 11.10.2018
Сообщений: 5,109
20.08.2020, 14:30 11
Цитата Сообщение от energ1 Посмотреть сообщение
вызывается конструктор по умолчанию, если данные то присваивается в поле значение по умолчанию этого типа данных
- но у типов данных int и double нет конструкторов по умолчанию, только выделение памяти - инициализация не происходит.
0
15254 / 8221 / 1993
Регистрация: 30.01.2014
Сообщений: 14,002
20.08.2020, 16:25 12
FFPowerMan, ну вот он, собственно, и пытался кривенько объяснить, что это сделано, чтобы инициализация была даже в отсутствие конструкторов (если у T нет конструктора, то будет zero-initialization).
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.08.2020, 16:25

Одномерный массив и функции (сделать 3 функции ввода/решения/вывода)
Ребята помогите, хоть убейте не могу эту задачу с помощью функций сделать!( Нужно сделать 3 функции...

Добавить в код любые пользовательские функции (лучше всего - функции ввода/вывода)
Ребят, прошу вас помочь добавить любые две функции, лучше всего если ввод и вывод, но например и за...

Изменить программу вывода функции так, чтобы можно было передавать функции типа double
Помогите разобраться. Изменить программу вывода функции так, чтобы можно было передавать функции...

Классы. Программирование алгоритмов с использованием конструктора, деструктора, friend - функции инициализации set() и функции вывода результатов prin
Братаны, выручайте!:help: Общая постановка. Пользовательский класс Х должен содержать необходимые...

Классы. Программирование алгоритмов с использованием конструктора, деструктора, friend - функции инициализации set() и функции вывода результатов pri
Братаны, выручайте! Общая постановка. Пользовательский класс Х должен содержать необходимые...

Функции вывода
Здравствуйте, уважаемые господа. По некоторым причинам мне очень важна скорость вывода различных...


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

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

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