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

Как упростить меню? - C++

Восстановить пароль Регистрация
 
Мартиника
0 / 0 / 0
Регистрация: 29.09.2010
Сообщений: 43
10.10.2011, 20:32     Как упростить меню? #1
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
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
#include <stdio.h> 
#include <conio.h> // для _getch()
#include <windows.h>
#include <iostream>
using namespace std; 
 
.
.
.
 
 
 
HANDLE hConsole, hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
 
int m_pos = 0;          // позиция меню
int max_pos = 9;        // максимальная позиция меню
 
void SetColor(int text, int background) // устанавливаем цвет
{
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));
}
 
void GotoXY(int X, int Y) // позиция курсора
{
    COORD coord = { X, Y };
    SetConsoleCursorPosition(hStdOut, coord);
}
 
 
void choice();
 
void menu(){
{setlocale(LC_ALL, "");
system("cls"); // очистить экран
if(m_pos==0){ 
  SetColor(13,0); 
  cout<<" > Замена максимума и минимума в одномерном массиве\n"; 
  SetColor(15,0);
  cout<<"   Шесть задач на диагонали\n";
  cout<<"   Поменять местами максимумы под и над главной диагональю двумерного массива\n";
  cout<<"   Подсчитать суммы элементов двумерного массива по столбцам\n";
  cout<<"   Длина строки\n";
  cout<<"   Слипание двух строк\n";
  cout<<"   Сортировка одномерного массива от максимума к минимуму\n";
  cout<<"   Сортировка одномерного массива от минимума к максимуму\n";
  cout<<"   Выход\n";
  choice();
}
if(m_pos==1){ 
  cout<<"   Замена максимума и минимума в одномерном массиве\n"; 
  SetColor(13,0); 
  cout<<" > Шесть задач на диагонали\n"; 
  SetColor(15,0);
  cout<<"   Поменять местами максимумы под и над главной диагональю двумерного массива\n";
  cout<<"   Подсчитать суммы элементов двумерного массива по столбцам\n";
  cout<<"   Длина строки\n";
  cout<<"   Слипание двух строк\n";
  cout<<"   Сортировка одномерного массива от максимума к минимуму\n";
  cout<<"   Сортировка одномерного массива от минимума к максимуму\n";
  cout<<"   Выход\n"; 
  choice(); 
}
if(m_pos==2){ 
  cout<<"   Замена максимума и минимума в одномерном массиве\n";
  cout<<"   Шесть задач на диагонали\n";
  SetColor(13,0); 
  cout<<" > Поменять местами максимумы под и над главной диагональю двумерного массива\n";
  SetColor(15,0);
  cout<<"   Подсчитать суммы элементов двумерного массива по столбцам\n";
  cout<<"   Длина строки\n";
  cout<<"   Слипание двух строк\n";
  cout<<"   Сортировка одномерного массива от максимума к минимуму\n";
  cout<<"   Сортировка одномерного массива от минимума к максимуму\n";
  cout<<"   Выход\n"; 
  choice();
}
if(m_pos==3){ 
  cout<<"   Замена максимума и минимума в одномерном массиве\n";
  cout<<"   Шесть задач на диагонали\n";
  cout<<"   Поменять местами максимумы под и над главной диагональю двумерного массива\n";
  SetColor(13,0);
  cout<<" > Подсчитать суммы элементов двумерного массива по столбцам\n";
  SetColor(15,0);
  cout<<"   Длина строки\n";
  cout<<"   Слипание двух строк\n";
  cout<<"   Сортировка одномерного массива от максимума к минимуму\n";
  cout<<"   Сортировка одномерного массива от минимума к максимуму\n";
  cout<<"   Выход\n"; 
  choice();
}
if(m_pos==4){ 
  cout<<"   Замена максимума и минимума в одномерном массиве\n";
  cout<<"   Шесть задач на диагонали\n";
  cout<<"   Поменять местами максимумы под и над главной диагональю двумерного массива\n";
  cout<<"   Подсчитать суммы элементов двумерного массива по столбцам\n";
  SetColor(13,0);
  cout<<" > Длина строки\n";
  SetColor(15,0);
  cout<<"   Слипание двух строк\n";
  cout<<"   Сортировка одномерного массива от максимума к минимуму\n";
  cout<<"   Сортировка одномерного массива от минимума к максимуму\n";
  cout<<"   Выход\n"; 
  choice();
}
if(m_pos==5){ 
  cout<<"   Замена максимума и минимума в одномерном массиве\n";
  cout<<"   Шесть задач на диагонали\n";
  cout<<"   Поменять местами максимумы под и над главной диагональю двумерного массива\n";
  cout<<"   Подсчитать суммы элементов двумерного массива по столбцам\n";
  cout<<"   Длина строки\n";
  SetColor(13,0); 
  cout<<" > Слипание двух строк\n";
  SetColor(15,0);
  cout<<"   Сортировка одномерного массива от максимума к минимуму\n";
  cout<<"   Сортировка одномерного массива от минимума к максимуму\n";
  cout<<"   Выход\n"; 
  choice();
}
if(m_pos==6){ 
  cout<<"   Замена максимума и минимума в одномерном массиве\n";
  cout<<"   Шесть задач на диагонали\n";
  cout<<"   Поменять местами максимумы под и над главной диагональю двумерного массива\n";
  cout<<"   Подсчитать суммы элементов двумерного массива по столбцам\n";
  cout<<"   Длина строки\n";
  cout<<"   Слипание двух строк\n";
  SetColor(13,0);
  cout<<" > Сортировка одномерного массива от максимума к минимуму\n";
  SetColor(15,0);
  cout<<"   Сортировка одномерного массива от минимума к максимуму\n";
  cout<<"   Выход\n";;
  choice();
}
if(m_pos==7){ 
  cout<<"   Замена максимума и минимума в одномерном массиве\n";
  cout<<"   Шесть задач на диагонали\n";
  cout<<"   Поменять местами максимумы под и над главной диагональю двумерного массива\n";
  cout<<"   Подсчитать суммы элементов двумерного массива по столбцам\n";
  cout<<"   Длина строки\n";
  cout<<"   Слипание двух строк\n";
  cout<<"   Сортировка одномерного массива от максимума к минимуму\n";
  SetColor(13,0);
  cout<<" > Сортировка одномерного массива от минимума к максимуму\n";
  SetColor(15,0);
  cout<<"   Выход\n";
  choice();
}
if(m_pos==8){ 
  cout<<"   Замена максимума и минимума в одномерном массиве\n";
  cout<<"   Шесть задач на диагонали\n";
  cout<<"   Поменять местами максимумы под и над главной диагональю двумерного массива\n";
  cout<<"   Подсчитать суммы элементов двумерного массива по столбцам\n";
  cout<<"   Длина строки\n";
  cout<<"   Слипание двух строк\n";
  cout<<"   Сортировка одномерного массива от максимума к минимуму\n";
  cout<<"   Сортировка одномерного массива от минимума к максимуму\n";
  SetColor(13,0);       
  cout<<" > Выход\n"; 
  SetColor(15,0);
  choice();
}
}
}
 
void go(int x){ // Если нажали Enter
  setlocale(LC_ALL, "");
  if(x==0) {exch(); menu();}
  if(x==1) {diagon(); menu();}
  if(x==2) {exch_max(); menu();}
  if(x==3) {summa_st(); menu();}
  if(x==4) { length(); menu();}
  if(x==5) { concat1(); menu();}
  if(x==6) {sort(); menu();}
  if(x==7) {sort1(); menu();}
  cout<<"\n   Нажмите любую\n клавишу";
  SetColor(0,0); 
  GotoXY(35,24);
  exit(0);
}
 
 
void choice(){ // функция выбора
l:
    int ch=_getch(); // считываем значение нажатой клавиши
    if(ch==224){ // 224 - это стрелочки
      switch(ch){
      case 80:  if(m_pos+1<max_pos) // вниз
                  ++m_pos;
                menu();
                break;
      case 72:  if(m_pos-1>=0)// вверх 
                  --m_pos;
                menu();
                break;
      case 13:  go(m_pos);// Enter 
                break;
    default:
    goto l;}
    }
   switch(ch){
      case 80:  if(m_pos+1<max_pos) // вниз 
                ++m_pos;
              menu();
              break;
      case 72:  if(m_pos-1>=0)// вверх
                  --m_pos;
                menu();
                break;
     case 13:  go(m_pos);// Enter
               break;
    default:
    goto l;}
 }
 
int main(){
    menu();
}
Помогите упростить, а то восемь раз повторять такую громоздкую надпись мне не нравится, а как избавится от этих повторов, ума не приложу. так все работает.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2011, 20:32     Как упростить меню?
Посмотрите здесь:

Как упростить работу с case C++
как бы упростить C++
C++ Как упростить программу на С++
Как упростить строчки cin>>a; raz.n = a;? C++
C++ как упростить программу ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zago-vlad
13 / 8 / 1
Регистрация: 12.01.2010
Сообщений: 106
10.10.2011, 20:42     Как упростить меню? #2
Когда приводишь листинг программы на форуме, используй теги кода.
Ztrel
 Аватар для Ztrel
441 / 215 / 14
Регистрация: 14.11.2009
Сообщений: 371
10.10.2011, 20:55     Как упростить меню? #3
Посмотри, может понравится =)

Набор констант для менюшки.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Массив для вывода менюшки.
const char* menu[] = 
{" ---------------------------------------- \n",
"\n",
"0. Quit.\n"
"1. Create Test List of strings. \n",
"2. Input strings from CLI. \n"
"3. Print Arrays. '\n",
"4. Form new Array. \n",
"\n",
" ---------------------------------------- \n"};
 
// Количество пунктов в меню = размер типа menu, деленный на размер указателя на тип char.
const size_t menulen = sizeof(menu) / sizeof(char*);

Метод Menu()

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
/* -- Вывод менюшки на экран -- */
size_t Menu()
{
    size_t choice = 0; // Объявляем целую беззнаковую переменную для будущего выбора пользователя.
    const char *error = ""; // А так же объявляем указатель на символьную константу - для текста ошибки, если таковая возникнет.
 
    do // Организуем цикл с постусловием.
    {
        cout << error << endl; // Выводим на экран текст ошибки; если ее нет - на экране ничего не изменится.
        error = "Error choice, repeat your choice!\n"; // но если мы попадем в цикл во второй раз - значит ошибка была ==> пишем ее текст.      
        cout << "Please, enter value from 0 to " << menulen - 3 << " " << endl; // Выведем просьбу о вводе числа от 0 до количества строчек в меню.
        cout << endl; // пропускаем строчку для красивости.
        // Цикл вывода на экран массива менюшки.
        for ( size_t tmpcnt = 0; tmpcnt < menulen; ++tmpcnt )
            cout << menu[tmpcnt];
        cout << "Your choice:  "; // вся для красивости =)
        cout << endl; // пропуск строчки.
    }
    /* И этот цикл с постусловием будет выполняться до тех пор, пока:
       введенное пользователем число будет больше, чем количество строчек в меню или меньше нуля. */
    while ( ( !InputCLI(choice) ) && ( choice > menulen - 3 ) ); 
    cout << endl; // пропуск строчки.
 
    return choice; // На выход функции подается выбор пользователя.
}
Метод InputCLI

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* -- Обработка ошибок ввода с консоли целого беззнакового числа -- */
int InputCLI ( size_t &x )
{
    while ( cin >> x, cin.fail() ) // Пока при вводе числа X мы получаем какую-нибудь ошибку ( это и есть cin.fail() ), делаем...
    {
        if ( cin.bad() || cin.eof() ) // Если ошибка связана с системой, или же пользователь предпочел прервать ввод (символ конца ввода)
            return -1; // Выходим из функции, с кодом ошибки = -1.
 
        cin.clear(); // после этого сбрасываем в ноль все флаги объекта cin.
        cin.ignore(); // и игнорируем один введенный символ (на случай, если ввели " а6 ", к примеру).
    }
 
    return 0; // Если же ввод прошел успешно, возвращаем введенную переменную и код успешного завершения = 0.
}

И наконец, главный метод - main()

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
int main()
{
    // Объявляем переменные.
 
    Stroka* HeadList = 0; // ссылка на первый элемент изначального списка - сразу обнуляем.
    Stroka* EndList = 0; // ссылка на последний элемент изначального списка - сразу обнуляем.
 
    int choice = 0; // переменная выбора пользователя.
 
    Stroka* HeadIzmList = 0; // ссылка на первый элемент сформированного списка.
    Stroka* EndIzmList = 0; // ссылка на последний элемент сформированного списка.
 
    while ( choice = Menu() ) // До тех пор, пока пользователь не введет нолик (чтобы выйти), делаем..
    {
        switch (choice) // идет анализ выбора пользователя.
        {
                case 1: // Если выбрал пункт № 1.
            {
                cout << "----------------------------------------------------" << endl;
                DestroyList(HeadList); // на всякий случай очищаем список.
                cout << "\tCreating test List in process..." << endl;
                HeadList = CreateTest(EndList); // создаем тестовый массив.
                cout << "\tCreating test List complete!" << endl;
                cout << "----------------------------------------------------" << endl;
                break; // выходим.
            }
 
                case 2:  // если выбрал пункт № 2.
            {
                cout << "----------------------------------------------------" << endl;
                DestroyList(HeadList); // уничтожаем список.
                InputStrCLI (&HeadList, &EndList); // запускаем процедуру ввода строчек.
                cout << "----------------------------------------------------" << endl;
                // Ввели строчки и радуемся =)).
                break; // выходим.
            }
 
                case 3: // если выбрал пункт № 3.
            {
                cout << "----------------------------------------------------" << endl;
                cout << "\tPrinting arrays to CLI in process..." << endl;
                cout << "\tOld array:  " << endl << endl;
 
                PrintList(HeadList); // вывели старый список.
 
                cout << endl << "\tFormed array:   " << endl << endl;
 
                PrintList(HeadIzmList); // вывели новый список.
 
                cout << endl << "\tPrinting arrays to CLI complete!" << endl;
                cout << endl << "----------------------------------------------------" << endl;
                break; // выходим.
            }
 
                case 4:
            {
                cout << "----------------------------------------------------" << endl;
                cout << "\tForming new array in process..." << endl;
                // FormingArray (Head.next, Formed.next); // формируем новый массив.
 
                // Уничтожаем мусор.
                DestroyList(HeadIzmList); // уничтожаем сформированный список.
                // И формируем новый список.
                HeadIzmList = FormingList ( HeadList );
 
                cout << "\tForming new array complete!" << endl;
                cout << "----------------------------------------------------" << endl;
            }
        }
    }
 
    DestroyList(HeadList); // уничтожаем изначальный список.
    DestroyList(HeadIzmList); // уничтожаем сформированный список.
    
    return 0;
 
}

P.S. - Кидал тебе кусочки своей программы - поэтому надо смотреть просто на оформление, а не на названия функций =)
Мартиника
0 / 0 / 0
Регистрация: 29.09.2010
Сообщений: 43
10.10.2011, 23:00  [ТС]     Как упростить меню? #4
а как мне сохранить переключение стрелочками?
Yandex
Объявления
10.10.2011, 23:00     Как упростить меню?
Ответ Создать тему
Опции темы

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