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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.94
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
#1

Меню на C++ - C++

25.11.2012, 07:09. Просмотров 4682. Ответов 10
Метки нет (Все метки)

Ув. форумчане, доброго времени суток. Прошу вас помочь. Сейчас вот пытаюсь сделать красивое меню на C++. Код меню не мой. Я выучил язык C и сейчас преступил к изучению C++. ООП. Мои знания это классы, конструкторы, деструкторы, координаты. Вот код меню, который мне скинул преподаватель (в нём 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
#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std;
HANDLE H=GetStdHandle(STD_OUTPUT_HANDLE);
void Stand(int x, int y, int k, char*str){
    CONSOLE_CURSOR_INFO ci; ci.bVisible=0; ci.dwSize=100; SetConsoleCursorInfo(H,&ci); // убрать мигающий курсор
    setlocale(LC_ALL,"RUS");
    COORD c;
    c.X=x; c.Y=y;
    SetConsoleCursorPosition(H,c);
    SetConsoleTextAttribute(H,k);
    cout<<str<<"\n";
}
 
void main()
{
 
    Stand(5,5,10,"Новая игра");
    Stand(5,7,2,"Загрузить игру");
    Stand(5,9,2,"Опции");
    Stand(5,11,2,"Выход");
 
    int k; // код клавиши
    int cur=1; // какой пункт выбран сейчас
    while(1){
        k=getch();
        if(k==80){
            if(cur<4){
                cur++;
                if(cur==2){
                    Stand(5,5,2,"Новая игра");
                    Stand(5,7,10,"Загрузить игру");
                }
                else if(cur==3){
                    Stand(5,7,2,"Загрузить игру");
                    Stand(5,9,10,"Опции");
                }
                else if(cur==4){
                    Stand(5,9,2,"Опции");
                    Stand(5,11,10,"Выход");
                }
            }
        }
        else if(k==72){
            if(cur>1){
                cur--;
                if(cur==3){
                    Stand(5,9,10,"Опции");
                    Stand(5,11,2,"Выход");
                }
                else if(cur==2){
                    Stand(5,7,10,"Загрузить игру");
                    Stand(5,9,2,"Опции");
                }
                else if(cur==1){
                    Stand(5,5,10,"Новая игра");
                    Stand(5,7,2,"Загрузить игру");
                }
            }
        }
        else if(k==13){
            system("cls");
            SetConsoleTextAttribute(H,12);
            if(cur==1) cout<<"Начало новой игры!\n\n";
            else if(cur==2) cout<<"Загрузка старой игры!\n\n";
            else if(cur==3) cout<<"Настройки игры!\n\n";
            else cout<<"Пока!\n\n";
            getch();
            exit(0);
        }
    }
 
}
Вот мой код, сделанный по этому шаблону(в моём тоже 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
/*Разработать класс String, который в дальнейшем будет использоваться для работы со строками.
Класс должен содержать: 
* конструктор по умолчанию, позволяющий создать строку длиной 80 символов; 
* конструктор, позволяющий создавать строку произвольного размера; 
* конструктор, который создаёт строку и инициализирует её строкой, полученной от пользователя. 
класс должен содержать методы для ввода строк с клавиатуры и вывода строк на экран.*/
 
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <string.h>
#include <windows.h>
using namespace std;
 
HANDLE H = GetStdHandle(STD_OUTPUT_HANDLE);
 
class String
{
private:
    char * string;
public:
    String() //По умолчанию.
    {
        string = new char[80];
        Initialization();
    }
    ~String()
    {
        delete [] string;
    }
    void Initialization()
    {
        cout<<"Максимальный размер строки может быть 80 символов!\n\n";
        cout<<"Введите строку: ";
        cin>>string;
        if(strlen(string) > 80)
        {
            system("cls");
            cout<<"Вы ввели сильно много символов!\n\n";
            system("exit");
        }
        else
        {
            system("cls");
            OemToAnsi(string,string);
            ShowString();
        }
    }
    void ShowString()
    {
        cout<<"Строка: "<<string<<endl<<endl;
    }
    void Stand(int x, int y, int key, char*str)
    {
        CONSOLE_CURSOR_INFO ci; ci.bVisible=0; ci.dwSize=100; SetConsoleCursorInfo(H,&ci);
        setlocale(LC_ALL,"RUS");
        COORD c;
        c.X = x; c.Y = y;
        SetConsoleCursorPosition(H,c);
        SetConsoleTextAttribute(H,key);
        cout<<str<<"\n";
    }
};
 
void main()
{
    system("title String");
    setlocale (0, "");
    String s;
    s.Stand(0,2,10,"Параметры по умолчанию");
    s.Stand(0,4,2,"Произвольная строка");
    s.Stand(0,6,2,"Создать строку");
    s.Stand(0,8,2,"Выход");
 
    int key; 
    int punkt = 1;
    while(1)
    {
        key = getch();
        if(key == 80)
        {
            if(punkt < 4)
            {
                punkt++;
                if(punkt == 2)
                {
                    s.Stand(0,2,2,"Параметры по умолчанию");
                    s.Stand(0,4,10,"Произвольная строка");
                }
                else if(punkt = 3)
                {
                    s.Stand(0,4,2,"Произвольная строка");
                    s.Stand(0,6,10,"Создать строку");
                }
                else if(punkt == 4)
                {
                    s.Stand(0,6,2,"Создать строку");
                        s.Stand(0,8,10,"Выход");
                }
            }
        }
        else if(key == 72)
        {
            if(punkt > 1)
            {
                punkt--;
                if(punkt == 3)
                {
                    s.Stand(0,6,10,"Создать строку");
                    s.Stand(0,8,2,"Выход");
                }
                else if(punkt == 2)
                {
                    s.Stand(0,4,10,"Произвольная строка");
                    s.Stand(0,6,2,"Создать строку");
                }
                else if(punkt == 1)
                {
                    s.Stand(0,2,10,"Параметры по умолчанию");
                    s.Stand(0,4,2,"Произвольная строка");
                }
            }
        }
        else if(key == 13)
        {
            system("cls");
            SetConsoleTextAttribute(H,12);
            if(punkt == 1) cout<<"Параметры по умолчанию!\n\n";
            else if(punkt == 2) cout<<"Произвольная строка\n\n";
            else if(punkt == 3) cout<<"Создать строку!\n\n";
            else cout<<"До свидания!\n\n";
            getch();
            exit(0);
        }
    }
 
}
Дело в том, что в меню, которое мне скинули всё в порядке. Смена оттенка пункта работает нормально(со всеми пунктами), а в моём всё печально. - Изначально оттенок первого пункта яркий, потом перехожу на второй с помощью клавиш(стрелочки вверх, вниз), второй пункт тоже нормально, третий также, а на 4 перейти не получается и оттенок не меняется. Help please!

Добавлено через 4 минуты
Вообще я не сильно разобрался в конструкторах... Как их перегружать понятно, но смысл? Как я понял их перегрузка полезна в полиморфизме (в зависимости от ситуации), но как это принимать? Например строки, пользователь вводит строку, но я хочу чтобы это была нормальная строка, например не состояла из цифр и т.п? - Тогда перегрузка конструкторов сработает автоматически? Например я ввёл нормальною строку и выполнилось действие, а если ввёл не кучу символов или много цифр, то напишет : "Строка не может состоять из одних цифр!" - как-то так...

Добавлено через 4 минуты
Ещё, скажите мне пожалуйста, какие у меня есть ошибки в коде? + возник вопрос можно ли как-то контролировать ввод строки? например я не хочу, например оператором cin>> я прошу пользователя ввести символьную строку т.е какое-то слово или предложение, ну не хочу я, чтобы она состояла из цифр... как это проверить?

Добавлено через 1 час 27 минут
Помогите. SOS. А то не у кого спросить кроме вас и работа стоит...

Добавлено через 2 часа 44 минуты
пока от вас чего-то дождёшься... я разочарован... Помогите хоть с синтаксисом и теорией:

Вообще я не сильно разобрался в конструкторах... Как их перегружать понятно, но смысл? Как я понял их перегрузка полезна в зависимости от ситуации, но как этим пользоваться? Например строки, пользователь вводит строку, но я хочу чтобы это была нормальная строка, не состояла только из цифр и т.п? - Тогда перегрузка конструкторов сработает автоматически? Например я ввёл нормальною строку и выполнилось действие, а если ввёл кучу символов или много цифр, то напишет : "Строка не может состоять из одних цифр!" - как-то так...

+ Ещё, скажите мне пожалуйста, какие у меня есть ошибки в коде? + возник вопрос можно ли как-то контролировать ввод строки? например я не хочу, например оператором cin>> я прошу пользователя ввести символьную строку т.е какое-то слово или предложение, ну не хочу я, чтобы она состояла из цифр... как это проверить?

Добавлено через 1 минуту
меню не работало из-за того, что в я одном if'e случайно место оператора сравнивания написал оператор присваивания ахах
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2012, 07:09     Меню на C++
Посмотрите здесь:

Вызов меню из меню - C++
Добрый день, начал писать простую программку что бы попрактиковаться. В программе даётся 3 пункта меню, нужно что бы при нажатии на любой...

Отображение меню формы + меню MDI - Visual Basic
Привет всем Как сделать так, чтобы при открытии формы отображалось и меню MDI формы, и ее сосбственное меню? Спасибо

Привязать действие из меню к контекстному меню - Visual Basic .NET
Добрый вечер. Как собственно привязать действие из подменю к контекстному меню(с помощью Events??). Получилось привязывать только из...

Меню и под меню (Вывод в шаблон) - PHP ООП
Привет всем. Есть две таблицы таб.Category id title 1 Кат.1 2 Кат.2 3 Кат.3 4 Кат.4

Создать 2 вида меню Fox: произвольного и вертикального вида. На основании данных примеров сделать свои типы меню - FoxPro
Создать 2 вида меню Fox: произвольного и вертикального вида. На основании данных примеров сделать свои типы меню, в меню должны быть...

Как избавится от меню пуск, или как узнать когда это меню открыли? - Visual Basic
Как избавится от меню пуск, или как узнать когда это меню открыли???

Посторонний текст и иероглифы в меню "Параметры" и в контекстном меню в Word 2007 - MS Word
Здравствуйте! Проблема такая, когда вставляю любой текст в ворд 2007, то когда нужно выбрать пункт &quot;сохранить только текст&quot; появляется...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
25.11.2012, 15:20     Меню на C++ #2
owned, хех, вопросы-то еще есть после такого длинного монолога?)
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
25.11.2012, 15:56  [ТС]     Меню на C++ #3
I.M., да остались.

Добавлено через 13 секунд
все вопросы кроме меню
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
25.11.2012, 16:36     Меню на C++ #4
Тогда давайте по порядку.
Цитата Сообщение от owned Посмотреть сообщение
Вообще я не сильно разобрался в конструкторах... Как их перегружать понятно, но смысл?
Для собственного удобства. Чтобы один и тот же объект можно было создать по-разному. Например, вы делаете класс Массив. Какие у него могут быть конструкторы? Пустой; конструктор, принимающий размер массива; конструктор, принимающий другой Массив, чтобы его скопировать; конструктор, принимающий интервал элементов, которые нужно скопировать.
Таким образом, получаем 4 перегруженных конструктора. И это далеко не предел)

Добавлено через 2 минуты
Цитата Сообщение от owned Посмотреть сообщение
Например строки, пользователь вводит строку, но я хочу чтобы это была нормальная строка, например не состояла из цифр и т.п? - Тогда перегрузка конструкторов сработает автоматически?
Нет, не сработает. Потому что для программы строка как имела тип std::string, так и будет его иметь. А ваша задача, объяснить программе, как отличить нормальную строку от ненормальной. Т.е. такую проверку делаете вы сами.

Добавлено через 1 минуту
Цитата Сообщение от owned Посмотреть сообщение
ну не хочу я, чтобы она состояла из цифр... как это проверить?
Проверять каждый символ введенной строки, является ли он цифрой или нет. Есть такая штука, как isdigit
http://www.cplusplus.com/reference/cctype/isdigit/

Добавлено через 1 минуту
Цитата Сообщение от owned Посмотреть сообщение
Ещё, скажите мне пожалуйста, какие у меня есть ошибки в коде?
Хм, ошибки компиляции, выполнения, неверный результат или вы просто устроили "охоту на ведьм"?)
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
25.11.2012, 16:42  [ТС]     Меню на C++ #5
Цитата Сообщение от I.M. Посмотреть сообщение
Хм, ошибки компиляции, выполнения, неверный результат или вы просто устроили "охоту на ведьм"?)
ошибки в расположении. например с областью видимости...
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
25.11.2012, 18:44     Меню на C++ #6
owned, т.е. код рабочий и вы интересуетесь, верна ли структура класса, общая читаемость кода и т.д.?
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
25.11.2012, 19:03  [ТС]     Меню на C++ #7
I.M., вроде того
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
25.11.2012, 20:17     Меню на C++ #8
Ок. Я тогда буду комментировать только ваш код.
Начнем с того, что из трех конструкторов сделан пока только один.
15 - точно нужна глобальная переменная? если можно, лучше без нее
19 - можно не писать прайват. Так как область видимости в классе по умолчанию прайват
20 - надо переименовать переменную, так как это имя уже используется в стандартной библиотеке
- почему нет переменной, отвечающей за размер выделенной памяти?
- почему нет переменной, отвечающей за текущую длину строки? да, это две разные переменные
24 - магическое число 80 сделать константой и далее использовать ее
25 - не надо вызывать метод инициализации. Конструктор по умолчанию на то и сделан, что вызывается, когда человек не хочет сразу загонять туда данные
33 - а почему именно 80? у вас в задании 80 - это длина строки в конструкторе по умолчанию. В дальнейшем длина строки может быть любой. Убрать это ограничение
35 - опасный ввод. А что если я введу строку длиннее 80 символов? я могу испортить память вашей программы - она может закрешиться в самой неожиданной ситуации. Надо использовать ограничение на длину считываемых символов или считывать данные в std::string
40 - какое право имеет метод ввода на закрытие всей программы? пусть возвращает код ошибки, кидает исключение, просит повторить ввод, просто завершает свою работу ретурном
46 - не надо. Если я запустил ввод данных, то я хочу именно ввести данные. Зачем мне тут же печатать то, что я только что ввел?
53 - вообще убрать из класса, так как эта функция не использует переменные класса и с ним никак не связан.
65 - int main()

В самом мейне куча магических констант, которые делают код совершенно нечитаемым и непонятным.
if-else можно заменить на switch-case. Свитч как раз для этого и создан

Пока вот. Поправьте это, допишите конструкторы, посмотрю еще раз
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
25.11.2012, 21:45  [ТС]     Меню на C++ #9
Цитата Сообщение от I.M. Посмотреть сообщение
Начнем с того, что из трех конструкторов сделан пока только один.
просто я не делал другие т.к были проблемы с меню.

Цитата Сообщение от I.M. Посмотреть сообщение
15 - точно нужна глобальная переменная? если можно, лучше без нее
а где мне её объявить и как мне потом до неё достучаться? по другому не получается или я туплю... вообще её желательно объявлять в void mai'e (вот сейчас я объявил в воиде и вот ошибка Error C2065: 'H' : undeclared identifier)

Вот мой текущий код, когда H объявляется в глобальной(меня это тоже смущает):

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
161
162
163
164
165
166
167
168
/*Разработать класс String, который в дальнейшем будет использоваться для работы со строками.
Класс должен содержать: 
* конструктор по умолчанию, позволяющий создать строку длиной 80 символов; 
* конструктор, позволяющий создавать строку произвольного размера; 
* конструктор, который создаёт строку и инициализирует её строкой, полученной от пользователя. 
класс должен содержать методы для ввода строк с клавиатуры и вывода строк на экран.*/
 
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <string.h>
#include <windows.h>
using namespace std;
 
HANDLE H = GetStdHandle(STD_OUTPUT_HANDLE);
 
class String
{
private:
    char * string;
public:
    String() //По умолчанию.
    {
        string = new char[80];
    }
    ~String()
    {
        delete [] string;
    }
    String(char * s)
    {
        s = new char[strlen(s) + 1];
    }
    void Initialization()
    {
        cout<<"Введите строку: ";
        cin>>string;
        ShowString();
    }
    void ShowString()
    {
        system("cls");
        OemToAnsi(string,string);
        cout<<"Строка: "<<string<<endl<<endl;
    }
    void Stand(int x, int y, int key, char*str)
    {
        CONSOLE_CURSOR_INFO ci; ci.bVisible=0; ci.dwSize=100; SetConsoleCursorInfo(H,&ci);
        COORD c;
        c.X = x; c.Y = y;
        SetConsoleCursorPosition(H,c);
        SetConsoleTextAttribute(H,key);
        cout<<str<<"\n";
    }
};
 
void main()
{
    system("mode con cols=30 lines=10");
    system("title String");
    setlocale(LC_ALL,"RUS");
    String s;
    s.Stand(5,1,10,"FAQ о задании \"String\"");
    s.Stand(5,3,2,"Произвольная строка");
    s.Stand(5,5,2,"Создать строку");
    s.Stand(5,7,2,"Выход");
 
    int key; 
    int punkt = 1;
 
    while(1)
    {
        key = getch();
        if(key == 80)
        {
            if(punkt < 4)
            {
                punkt++;
                if(punkt == 2)
                {
                    s.Stand(5,1,2,"FAQ о задании \"String\"");
                    s.Stand(5,3,10,"Произвольная строка");
                }
                else if(punkt == 3)
                {
                    s.Stand(5,3,2,"Произвольная строка");
                    s.Stand(5,5,10,"Создать строку");
                }
                else if(punkt == 4)
                {
                    s.Stand(5,5,2,"Создать строку");
                    s.Stand(5,7,10,"Выход");
                }
            }
        }
        else if(key == 72)
        {
            if(punkt > 1)
            {
                punkt--;
                if(punkt == 3)
                {
                    s.Stand(5,5,10,"Создать строку");
                    s.Stand(5,7,2,"Выход");
                }
                else if(punkt == 2)
                {
                    s.Stand(5,3,10,"Произвольная строка");
                    s.Stand(5,5,2,"Создать строку");
                }
                else if(punkt == 1)
                {
                    s.Stand(5,1,10,"FAQ о задании \"String\"");
                    s.Stand(5,3,2,"Произвольная строка");
                }
            }
        }
        else if(key == 13)
        {
            system("cls");
            SetConsoleTextAttribute(H,15);
            if(punkt == 1)
            {
                system("title FAQ о задании \"String\"");
                system("mode con cols=43 lines=23");
                SetConsoleTextAttribute(H,10);
                cout<<"\n  Разработать класс String, который в \n  дальнейшем будет использоваться для \n\t работы со строками.\n\n";
                SetConsoleTextAttribute(H,14);
                cout<<"\tКласс должен содержать:\n\n";
                SetConsoleTextAttribute(H,15);
                cout<<" - конструктор по умолчанию, позволяющий \n   создать строку длиной 80 символов.\n\n"
                    <<"      - конструктор, позволяющий \n  создавать строку произвольного размера.\n\n"
                    <<"  - конструктор, который создаёт строку и \n  инициализирует её строкой, полученной от \t\tпользователя.\n\n"
                    <<"   - методы для ввода строк с клавиатуры \n        и вывода строк на экран.\n\n";
                SetConsoleTextAttribute(H,11);
            }
            else if(punkt == 2) 
            {
                cout<<"Произвольная строка\n\n";
                getch();
            }
            else if(punkt == 3) 
            {
                cout<<"Создать строку!\n\n";
                getch();
            }
            else if(punkt == 4)
            {
                DWORD size=1024;
                char buf[1024];
                GetUserNameA(buf, &size); 
                SetConsoleTextAttribute(H,11);
                system("mode con cols=30 lines=6");
                SetConsoleTextAttribute(H,14);
                system("title До свидания!");
                cout<<"   До свидания ув. "<<buf<<endl<<endl<<"   ";
                SetConsoleTextAttribute(H,11);
            }
            else 
            {
                cout<<"До свидания!\n\n";
                getch();
            }
            exit(0);
        }
    }
 
}
Помогите пожалуйста, поменяйте. Ну чтобы она была объявлена в воиде и всё норм работало...



Цитата Сообщение от I.M. Посмотреть сообщение
20 - надо переименовать переменную, так как это имя уже используется в стандартной библиотеке
если бы так было, то у меня бы она была выделена синим цветом, а так всё в порядке.
Цитата Сообщение от I.M. Посмотреть сообщение
24 - магическое число 80 сделать константой и далее использовать ее
ок.
Цитата Сообщение от I.M. Посмотреть сообщение
35 - опасный ввод. А что если я введу строку длиннее 80 символов? я могу испортить память вашей программы - она может закрешиться в самой неожиданной ситуации. Надо использовать ограничение на длину считываемых символов или считывать данные в std::string
покажите на примере, как это сделать.
Цитата Сообщение от I.M. Посмотреть сообщение
53 - вообще убрать из класса, так как эта функция не использует переменные класса и с ним никак не связан.
а куда его засунуть?

Сейчас к стати буду доделывать задание и скину новый код, посмотрите тоже ?)

Добавлено через 17 минут
Вот код, который у меня на данный момент. Помогите сделать возврат в предыдущее меню кнопкой Esc пожалуйста

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
161
162
163
164
165
166
167
168
/*Разработать класс String, который в дальнейшем будет использоваться для работы со строками.
Класс должен содержать: 
* конструктор по умолчанию, позволяющий создать строку длиной 80 символов; 
* конструктор, позволяющий создавать строку произвольного размера; 
* конструктор, который создаёт строку и инициализирует её строкой, полученной от пользователя. 
класс должен содержать методы для ввода строк с клавиатуры и вывода строк на экран.*/
 
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <string.h>
#include <windows.h>
using namespace std;
 
HANDLE H = GetStdHandle(STD_OUTPUT_HANDLE);
 
class String
{
private:
    char * string;
public:
    String() //По умолчанию.
    {
        string = new char[80];
    }
    ~String()
    {
        delete [] string;
    }
    String(char * s)
    {
        s = new char[strlen(s) + 1];
    }
    void Initialization()
    {
        cout<<"Введите строку: ";
        cin>>string;
        ShowString();
    }
    void ShowString()
    {
        system("cls");
        OemToAnsi(string,string);
        cout<<"Строка: "<<string<<endl<<endl;
    }
    void Stand(int x, int y, int key, char*str)
    {
        CONSOLE_CURSOR_INFO ci; ci.bVisible=0; ci.dwSize=100; SetConsoleCursorInfo(H,&ci);
        COORD c;
        c.X = x; c.Y = y;
        SetConsoleCursorPosition(H,c);
        SetConsoleTextAttribute(H,key);
        cout<<str<<"\n";
    }
};
 
void main()
{
    system("mode con cols=30 lines=10");
    system("title String");
    setlocale(LC_ALL,"RUS");
    String s;
    s.Stand(5,1,10,"FAQ о задании \"String\"");
    s.Stand(5,3,2,"Произвольная строка");
    s.Stand(5,5,2,"Создать строку");
    s.Stand(5,7,2,"Выход");
 
    int key; 
    int punkt = 1;
 
    while(1)
    {
        key = getch();
        if(key == 80)
        {
            if(punkt < 4)
            {
                punkt++;
                if(punkt == 2)
                {
                    s.Stand(5,1,2,"FAQ о задании \"String\"");
                    s.Stand(5,3,10,"Произвольная строка");
                }
                else if(punkt == 3)
                {
                    s.Stand(5,3,2,"Произвольная строка");
                    s.Stand(5,5,10,"Создать строку");
                }
                else if(punkt == 4)
                {
                    s.Stand(5,5,2,"Создать строку");
                    s.Stand(5,7,10,"Выход");
                }
            }
        }
        else if(key == 72)
        {
            if(punkt > 1)
            {
                punkt--;
                if(punkt == 3)
                {
                    s.Stand(5,5,10,"Создать строку");
                    s.Stand(5,7,2,"Выход");
                }
                else if(punkt == 2)
                {
                    s.Stand(5,3,10,"Произвольная строка");
                    s.Stand(5,5,2,"Создать строку");
                }
                else if(punkt == 1)
                {
                    s.Stand(5,1,10,"FAQ о задании \"String\"");
                    s.Stand(5,3,2,"Произвольная строка");
                }
            }
        }
        else if(key == 13)
        {
            system("cls");
            SetConsoleTextAttribute(H,15);
            if(punkt == 1)
            {
                system("title FAQ о задании \"String\"");
                system("mode con cols=43 lines=23");
                SetConsoleTextAttribute(H,10);
                cout<<"\n  Разработать класс String, который в \n  дальнейшем будет использоваться для \n\t работы со строками.\n\n";
                SetConsoleTextAttribute(H,14);
                cout<<"\tКласс должен содержать:\n\n";
                SetConsoleTextAttribute(H,15);
                cout<<" - конструктор по умолчанию, позволяющий \n   создать строку длиной 80 символов.\n\n"
                    <<"      - конструктор, позволяющий \n  создавать строку произвольного размера.\n\n"
                    <<"  - конструктор, который создаёт строку и \n  инициализирует её строкой, полученной от \t\tпользователя.\n\n"
                    <<"   - методы для ввода строк с клавиатуры \n        и вывода строк на экран.\n\n";
                SetConsoleTextAttribute(H,11);
            }
            else if(punkt == 2) 
            {
                cout<<"Произвольная строка\n\n";
                getch();
            }
            else if(punkt == 3) 
            {
                cout<<"Создать строку!\n\n";
                getch();
            }
            else if(punkt == 4)
            {
                DWORD size=1024;
                char buf[1024];
                GetUserNameA(buf, &size); 
                SetConsoleTextAttribute(H,11);
                system("mode con cols=30 lines=6");
                SetConsoleTextAttribute(H,14);
                system("title До свидания!");
                cout<<"   До свидания ув. "<<buf<<endl<<endl<<"   ";
                SetConsoleTextAttribute(H,11);
            }
            else 
            {
                cout<<"До свидания!\n\n";
                getch();
            }
            exit(0);
        }
    }
 
}
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
25.11.2012, 21:49     Меню на C++ #10
Цитата Сообщение от owned Посмотреть сообщение
если бы так было, то у меня бы она была выделена синим цветом, а так всё в порядке.
сейчас все в порядке. Но тем не менее, использование стандартных имен крайне не рекомендуется. Это может привести к ошибке, которую вы будете искать очень долго и может быть не найдете.

По поводу глобальной переменной - переносите всю строку в мейн и передаете ссылку на созданных хедл туда, где он нужен. Насколько я вижу, кроме мена он используется только в Stand

Цитата Сообщение от owned Посмотреть сообщение
покажите на примере, как это сделать.
например так
C++
1
2
3
4
std::string buf;
std::cin >> buf;
char* data = new char[buf.size() + 1];
strcpy(data, buf.c_str());
Цитата Сообщение от owned Посмотреть сообщение
а куда его засунуть?
Просто вынести из класса. Пусть будет над классом или между классом и мейном - как хотите
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2012, 22:57     Меню на C++
Еще ссылки по теме:

Блок меню - выезжающее меню - JavaScript
Доброй ночи подскажите начинающему ,вот у меня есть сайт у меня идет меню услуги новости и так далее,как сделать что бы когда я навожу...

Горизонтальное меню с выпадающим меню - Free Pascal
помогите сделать горизонтальное меню с выпадающим меню. Нужно чтобы при выборе какого нибудь пункта в горизонтальном меню под тем пунктом...

Как для одной страницы отображать одно меню, а для другой страницы другое меню? DLE - DLE
Как для одной страницы отображать одно меню, а для другой страницы другое меню? То есть, есть страница &quot;Товары&quot;, и в меню отображаются...

Программы + меню ( надо 2 программы написать с меню вместе ) - Turbo Pascal
Ребята есть проблема, что бы в задании выдавало определенное решение то есть, надо что бы решение было через средние выбрал их и ответ,...

Меню и саб-меню - PHP БД
есть 2 таблицы category - тут просто категории id, cat_name menu - тут меню которое должно быть в каждой категории id, type,...


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

Или воспользуйтесь поиском по форуму:
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
26.11.2012, 22:57  [ТС]     Меню на C++ #11
I.M., А как сделать возврат в предыдущее меню на кнопку Esc?

Вот код:

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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
/*Разработать класс String, который в дальнейшем будет использоваться для работы со строками.
Класс должен содержать: 
* конструктор по умолчанию, позволяющий создать строку длиной 80 символов; 
* конструктор, позволяющий создавать строку произвольного размера; 
* конструктор, который создаёт строку и инициализирует её строкой, полученной от пользователя. 
класс должен содержать методы для ввода строк с клавиатуры и вывода строк на экран.*/
 
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <string.h>
#include <windows.h>
using namespace std;
 
HANDLE H = GetStdHandle(STD_OUTPUT_HANDLE);
 
class String
{
private:
    char * string;
public:
    String() //По умолчанию.
    {
        const int size = 80;
        string = new char[size];
    }
    ~String()
    {
        delete [] string;
    }
    String(char * s)
    {
        Initialization();
        s = new char[strlen(s) + 1];
    }
    void Initialization()
    {
        cout<<"Введите строку: ";
        gets(string);
        system("cls");
        ChoiseShowString();
    }
    void ChoiseShowString()
    {
        int choiseshowstring;
        cout<<"Показать строку?\n\n"
            <<"1 - Да. \n"
            <<"2 - Выйти.\n\n";
        cout<<"Введите ваш выбор: ";
        cin>>choiseshowstring;
        if(choiseshowstring == 1)
        {
            ShowString();
        }
        else if(choiseshowstring == 2)
        {
            exit(0);
        }
        else
        {
            system("cls");
            cout<<"Не верный ввод, повторите выбор!\n\n";
            ChoiseShowString();
        }
    }
    void ShowString()
    {
        system("cls");
        OemToAnsi(string,string);
        cout<<"Строка: "<<string<<endl<<endl;
    }
};
 
void Stand(int x, int y, int key, char*str)
{
    CONSOLE_CURSOR_INFO ci; ci.bVisible=0; ci.dwSize=100; SetConsoleCursorInfo(H,&ci);
    COORD c;
    c.X = x; c.Y = y;
    SetConsoleCursorPosition(H,c);
    SetConsoleTextAttribute(H,key);
    cout<<str<<"\n";
}
 
void main()
{
    system("mode con cols=30 lines=10");
    system("title String");
    setlocale(LC_ALL,"RUS");
    String s;
    Stand(5,1,10,"FAQ о задании \"String\"");
    Stand(5,3,2,"Произвольная строка");
    Stand(5,5,2,"Создать строку");
    Stand(5,7,2,"Выход");
 
    int key; 
    int punkt = 1;
 
    while(1)
    {
        key = getch();
        if(key == 80)
        {
            if(punkt < 4)
            {
                punkt++;
                if(punkt == 2)
                {
                    Stand(5,1,2,"FAQ о задании \"String\"");
                    Stand(5,3,10,"Произвольная строка");
                }
                else if(punkt == 3)
                {
                    Stand(5,3,2,"Произвольная строка");
                    Stand(5,5,10,"Создать строку");
                }
                else if(punkt == 4)
                {
                    Stand(5,5,2,"Создать строку");
                    Stand(5,7,10,"Выход");
                }
            }
        }
        else if(key == 72)
        {
            if(punkt > 1)
            {
                punkt--;
                if(punkt == 3)
                {
                    Stand(5,5,10,"Создать строку");
                    Stand(5,7,2,"Выход");
                }
                else if(punkt == 2)
                {
                    Stand(5,3,10,"Произвольная строка");
                    Stand(5,5,2,"Создать строку");
                }
                else if(punkt == 1)
                {
                    Stand(5,1,10,"FAQ о задании \"String\"");
                    Stand(5,3,2,"Произвольная строка");
                }
            }
        }
        else if(key == 13)
        {
            system("cls");
            SetConsoleTextAttribute(H,15);
            if(punkt == 1)
            {
                system("title FAQ о задании \"String\"");
                system("mode con cols=43 lines=23");
                SetConsoleTextAttribute(H,10);
                cout<<"\n  Разработать класс String, который в \n  дальнейшем будет использоваться для \n\t работы со строками.\n\n";
                SetConsoleTextAttribute(H,14);
                cout<<"\tКласс должен содержать:\n\n";
                SetConsoleTextAttribute(H,15);
                cout<<" - конструктор по умолчанию, позволяющий \n   создать строку длиной 80 символов.\n\n"
                    <<"      - конструктор, позволяющий \n  создавать строку произвольного размера.\n\n"
                    <<"  - конструктор, который создаёт строку и \n  инициализирует её строкой, полученной от \t\tпользователя.\n\n"
                    <<"   - методы для ввода строк с клавиатуры \n        и вывода строк на экран.\n\n";
                SetConsoleTextAttribute(H,11);
            }
            else if(punkt == 2) 
            {
                system("title String произв. размера");
                system("mode con cols=43 lines=13");
                s.Initialization();
            }
            else if(punkt == 3) 
            {
                cout<<"Создать строку!\n\n";
                getch();
            }
            else if(punkt == 4)
            {
                DWORD size=1024;
                char buf[1024];
                GetUserNameA(buf, &size); 
                SetConsoleTextAttribute(H,11);
                system("mode con cols=30 lines=6");
                SetConsoleTextAttribute(H,14);
                system("title До свидания!");
                cout<<"   До свидания ув. "<<buf<<endl<<endl<<"   ";
                SetConsoleTextAttribute(H,11);
            }
            else 
            {
                cout<<"До свидания!\n\n";
                getch();
            }
            exit(0);
        }
    }
 
}
Добавлено через 3 часа 48 минут
Up. Помогите пожалуйста!

Добавлено через 2 часа 44 минуты
Up. Помогите пожалуйста!

Добавлено через 27 минут
Up. Помогите пожалуйста!

Добавлено через 48 минут
Up. Помогите пожалуйста!
Yandex
Объявления
26.11.2012, 22:57     Меню на C++
Ответ Создать тему
Опции темы

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