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

Оптимизация условия цикла while - C++

Восстановить пароль Регистрация
 
daite_dve
0 / 0 / 0
Регистрация: 06.02.2012
Сообщений: 37
06.02.2012, 21:01     Оптимизация условия цикла while #1
Доброго времени суток, друзья! Я еще совсем новичок в С++. Подскажите плз как оптимизировать следующее условие выхода из цикла while. Уж очень громоздко выглядит, и что-то внутри меня подсказывает что это можно как-то сократить

char ch = 'a';
while (ch != 42 && ch != 43 && ch != 45 && ch != 47)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2012, 21:01     Оптимизация условия цикла while
Посмотрите здесь:

Условия остановки цикла C++
Оптимизация цикла (перебор 5000000 элементов) C++
Используя одну переменную цикла укажите возможные способы объявления заголовка счетного цикла. C++
При выполнении условия не выходит из цикла C++
C++ Как задать два условия для цикла
C++ Нахождение отрицательного цикла в графе и вывод цикла
Условия цикла for, числа double C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
R136a1
 Аватар для R136a1
142 / 111 / 15
Регистрация: 14.04.2011
Сообщений: 261
06.02.2012, 21:42     Оптимизация условия цикла while #2
так например?
C++
1
while(ch < 42 && ch > 47)
ITDeveloper
 Аватар для ITDeveloper
85 / 85 / 5
Регистрация: 14.01.2011
Сообщений: 263
06.02.2012, 21:46     Оптимизация условия цикла while #3
Цитата Сообщение от R136a1 Посмотреть сообщение
так например?
C++
1
while(ch < 42 && ch > 47)

а как же значения 44 и 46
KristopherRobin
 Аватар для KristopherRobin
137 / 133 / 6
Регистрация: 11.09.2011
Сообщений: 407
06.02.2012, 21:56     Оптимизация условия цикла while #4
по мне так нормальное условие. для удобного чтения можешь так написать:

C++
1
2
3
4
while ( ch != 42 && 
    ch != 43 && 
    ch != 45 && 
    ch != 47)
ValeryS
Модератор
6402 / 4868 / 447
Регистрация: 14.02.2011
Сообщений: 16,157
06.02.2012, 21:59     Оптимизация условия цикла while #5
Цитата Сообщение от daite_dve Посмотреть сообщение
char ch = 'a';
while (ch != 42 && ch != 43 && ch != 45 && ch != 47)
а че объявление символьное а проверка числовая
а значения точно десятичные???(шеснадцетиричные пишут так 0x42)
упростить не получится а проще записать так
C
1
2
char ch = 'a';
 while (ch != '*' && ch != '+' && ch != '-' && ch != '/')
это если ты написал правильно и то символы это десятичные значения
если имел ввиду шеснадцетиричное
то
C++
1
2
char ch = 'a';
 while (ch != 'B' && ch !='C' && ch !='E' && ch !='G')
x1Mike7x
 Аватар для x1Mike7x
214 / 127 / 6
Регистрация: 06.11.2010
Сообщений: 234
06.02.2012, 22:38     Оптимизация условия цикла while #6
Если всяких значений ch может быть очень много, то можно все "нежелательные" символы завести в строку и искать в ней или ch не равняется какому-то символу.
C++
1
2
3
4
5
6
#include <string>
.....................................................
std::string ololo = "+-*/";
while ( ololo.find( ch ) == std::string::npos )
{
}
daite_dve
0 / 0 / 0
Регистрация: 06.02.2012
Сообщений: 37
06.02.2012, 23:34  [ТС]     Оптимизация условия цикла while #7
да, видимо ничего красивее чем
C++
1
2
3
4
while ( ch != 42 && 
          ch != 43 && 
          ch != 45 && 
          ch != 47)
не используя
C++
1
#include <string>
нельзя...
А на что проверять, на символы, на десятеричную или шестнадцатеричную, это мне кажется не суть, запись от этого не сократится.

Спасибо всем за ответы! Если что, то писал калькулятор:

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
#include <iostream>
#include <conio.h>
using namespace std;
 
int main()
{
    char con = 'a';
    do
    {
    char ch = 'a';
    char act = 'a';
    double num1 = 0;
    double num2 = 0;
    double res = 0;
    cout << "Enter the first number, an action and the second number: ";
    while (ch != 42 && 
               ch != 43 && 
               ch != 45 && 
               ch != 47)
    {
    ch = getche();
    if (ch != 42 && 
            ch != 43 && 
            ch != 45 && 
            ch != 47)
    {
        num1 = num1 * 10 + (ch - 48);
    }
    else
    {
        act = ch;
    }
    }
    cin >> num2;
    switch(act)
    {
    case 42:
        res = num1 * num2;
        break;
    case 43:
        res = num1 + num2;
        break;
    case 45:
        res = num1 - num2;
        break;
    case 47:
        res = num1 / num2;
        break;
    }
    cout << "Result: " << num1 << act << num2 << "=" << res << endl << "Continue? (y/n): ";
    cin >> con;
    }
    while (con != 'n');
    return 0;
}
ValeryS
Модератор
6402 / 4868 / 447
Регистрация: 14.02.2011
Сообщений: 16,157
07.02.2012, 00:32     Оптимизация условия цикла while #8
Цитата Сообщение от daite_dve Посмотреть сообщение
А на что проверять, на символы, на десятеричную или шестнадцатеричную, это мне кажется не суть, запись от этого не сократится.
запись не сократится(может даже увеличится из за кавычек)
но понятно будет что ты имел ввиду
не надо комментировать
а так другой человек с ходу не поймет
да и сам через полгода будешь вспоминать что написал
самодокументированая программа, однако

Добавлено через 2 минуты
Цитата Сообщение от daite_dve Посмотреть сообщение
num1 = num1 * 10 + (ch - 48);
а что будет если я букву нажму ???
daite_dve
0 / 0 / 0
Регистрация: 06.02.2012
Сообщений: 37
07.02.2012, 01:55  [ТС]     Оптимизация условия цикла while #9
Цитата Сообщение от ValeryS Посмотреть сообщение
а что будет если я букву нажму ???
ХА! сейчас проверю))

P.S.: насчет понятности ты прав.. реально же потом сходу не пойму что это математические действия.

Добавлено через 8 минут
Выдает:

Enter the first number, an action and the second number: b-50
Result: 50-50=0
Continue? (y/n):

Оно и понятно, у 'b' аски код 98, потом я вычитаю из него 48, и остается 50. И вот результат. Можно конечно вставить условие чтобы num1 и num2 содержали только символы от 0 до 9. Но сейчас такой цели не стоит, так что не буду заморачиваться)

Добавлено через 1 час 6 минут
Я только что открыл для себя магию дэвида блэйна! Друзья, как так? Т.е. оператор
C++
1
cin >> n1 >> oper >> n2;
сам распознает все что нужно? Например: ввожу 3/2, нажимаю энтэр, и вуаля: n1 = 3, n2 = 2, oper - '/'.

Вот написание моего калькулятора (ответ из книжки):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
 
int main()
{
    double num1,num2,res;
    char act,ch;
    do{
        cout << "Input a number, an action and another number: ";
        cin >> num1 >> act >> num2;
        switch (act){
            case '+': res = n1 + n2; break;
            case '-': res = n1 - n2; break;
            case '*': res = n1 * n2; break;
            case '/': res = n1 / n2; break;}
    cout << "Result: " << res;
    cout << "\nContinue? (y/n)";
    cin >> ch;
    }while (ch != 'n');
    return 0;
 
}
Получается все мои старания по придумыванию как вытащить из потока ввода нужные символы оказались напрасны...
ValeryS
Модератор
6402 / 4868 / 447
Регистрация: 14.02.2011
Сообщений: 16,157
07.02.2012, 06:31     Оптимизация условия цикла while #10
Цитата Сообщение от daite_dve Посмотреть сообщение
}while (ch != 'n');
вот здесь можно добавить проверку на большую букву
C++
1
while ((ch != 'n' )&&( ch != 'N') )
Добавлено через 7 минут
Цитата Сообщение от daite_dve Посмотреть сообщение
switch (act){
case '+': res = n1 + n2; break;
case '-': res = n1 - n2; break;
case '*': res = n1 * n2; break;
case '/': res = n1 / n2; break;}
вот здесь добавить еще одну ветку (по умолчанию) если будет введен не правильный act
C++
1
2
deafault:
cout << "Error operation";
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2012, 08:56     Оптимизация условия цикла while
Еще ссылки по теме:

C++ Оптимизация цикла for
Оптимизация цикла for C++
C++ Повторение цикла при наступлении определенного условия
Выполните, пожалуйста, задание, при этом вместо оператора цикла while используйте оператора цикла do_while C++
оптимизация C++

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

Или воспользуйтесь поиском по форуму:
daite_dve
0 / 0 / 0
Регистрация: 06.02.2012
Сообщений: 37
07.02.2012, 08:56  [ТС]     Оптимизация условия цикла while #11
да, спасибо за ответ
P.S.:пошел изучать работу cin))
Yandex
Объявления
07.02.2012, 08:56     Оптимизация условия цикла while
Ответ Создать тему
Опции темы

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