Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
daite_dve
0 / 0 / 0
Регистрация: 06.02.2012
Сообщений: 37
#1

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

06.02.2012, 21:01. Просмотров 1092. Ответов 10
Метки нет (Все метки)

Доброго времени суток, друзья! Я еще совсем новичок в С++. Подскажите плз как оптимизировать следующее условие выхода из цикла while. Уж очень громоздко выглядит, и что-то внутри меня подсказывает что это можно как-то сократить

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

Оптимизация цикла for - C++
Скажите, пожалуйста, как оптимизируется первый цикл? И чем он отличается от второго? Первый цикл: int a = 2; for (int i = 0; i < 5;...

Оптимизация цикла for - C++
Исходные данные: имеется цикл for, прерывание которого невозможно(должен выполнить все итерации). #include <iostream> int main() {...

Условия остановки цикла - C++
А как задать условие для: 1) Допустим идет цикл вычислений. Необходимо прервать вычисления при условии, что 3 последних вычислений будут...

Условия цикла в функции - C++
int reverse_number(int number) { int n = 0; while(number) { n = 10*n + number%10; number /= 10; ...

Оптимизация цикла по скорости - C++
Помогите пожалуйста оптимизировать данный цикл (изменить его, чтобы он выполнялся быстрее): int a = new int; int b = new int; ...

Условия цикла for, числа double - C++
День добрый. Решал недавно задачку с одного сайта, задачка простая была, но после решения и подглядывания решения от авторов наткнулся на...

10
R136a1
143 / 112 / 15
Регистрация: 14.04.2011
Сообщений: 261
06.02.2012, 21:42 #2
так например?
C++
1
while(ch < 42 && ch > 47)
0
ITDeveloper
85 / 85 / 5
Регистрация: 14.01.2011
Сообщений: 265
06.02.2012, 21:46 #3
Цитата Сообщение от R136a1 Посмотреть сообщение
так например?
C++
1
while(ch < 42 && ch > 47)

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

C++
1
2
3
4
while ( ch != 42 && 
    ch != 43 && 
    ch != 45 && 
    ch != 47)
1
ValeryS
Модератор
7023 / 5361 / 531
Регистрация: 14.02.2011
Сообщений: 18,086
06.02.2012, 21:59 #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')
1
x1Mike7x
218 / 131 / 6
Регистрация: 06.11.2010
Сообщений: 234
06.02.2012, 22:38 #6
Если всяких значений ch может быть очень много, то можно все "нежелательные" символы завести в строку и искать в ней или ch не равняется какому-то символу.
C++
1
2
3
4
5
6
#include <string>
.....................................................
std::string ololo = "+-*/";
while ( ololo.find( ch ) == std::string::npos )
{
}
2
daite_dve
0 / 0 / 0
Регистрация: 06.02.2012
Сообщений: 37
06.02.2012, 23:34  [ТС] #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;
}
0
ValeryS
Модератор
7023 / 5361 / 531
Регистрация: 14.02.2011
Сообщений: 18,086
07.02.2012, 00:32 #8
Цитата Сообщение от daite_dve Посмотреть сообщение
А на что проверять, на символы, на десятеричную или шестнадцатеричную, это мне кажется не суть, запись от этого не сократится.
запись не сократится(может даже увеличится из за кавычек)
но понятно будет что ты имел ввиду
не надо комментировать
а так другой человек с ходу не поймет
да и сам через полгода будешь вспоминать что написал
самодокументированая программа, однако

Добавлено через 2 минуты
Цитата Сообщение от daite_dve Посмотреть сообщение
num1 = num1 * 10 + (ch - 48);
а что будет если я букву нажму ???
0
daite_dve
0 / 0 / 0
Регистрация: 06.02.2012
Сообщений: 37
07.02.2012, 01:55  [ТС] #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;
 
}
Получается все мои старания по придумыванию как вытащить из потока ввода нужные символы оказались напрасны...
0
ValeryS
Модератор
7023 / 5361 / 531
Регистрация: 14.02.2011
Сообщений: 18,086
07.02.2012, 06:31 #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";
0
daite_dve
0 / 0 / 0
Регистрация: 06.02.2012
Сообщений: 37
07.02.2012, 08:56  [ТС] #11
да, спасибо за ответ
P.S.:пошел изучать работу cin))
0
07.02.2012, 08:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2012, 08:56
Привет! Вот еще темы с ответами:

Проверка условия окончания цикла for - C++
Здраствуйте. Проблема заключается в следующем. Есть следующий цикл: for( int i=2; !((n%i||d%i)&amp;&amp;!(n%i&amp;&amp;d%i))==0 ; i++){ ...

При выполнении условия не выходит из цикла - C++
При выполнении условия не выходит из цикла а продолжается и выходит за границы #include &lt;iostream&gt; #include &lt;conio.h&gt; #include...

Оптимизация цикла (перебор 5000000 элементов) - C++
Можно ли как-то оптимизировать данный цикл? for (i=10000000; i&lt;15000000; i++) { for (k = i, j = 0; j &lt; 8; j++, k /= 10) ...

Повторение цикла при наступлении определенного условия - C++
Добрый день! Я пишу игру и пытаюсь сделать разыгровку первого хода. Загвоздка в следующем: мне нужно, чтобы при условии &quot;ничья&quot; цикл...


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

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

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