Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
daite_dve
0 / 0 / 2
Регистрация: 06.02.2012
Сообщений: 37
1

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

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

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

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

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

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

Оптимизация цикла for
Скажите, пожалуйста, как оптимизируется первый цикл? И чем он отличается от второго? Первый цикл:...

Оптимизация цикла for
Исходные данные: имеется цикл for, прерывание которого невозможно(должен выполнить все итерации)....

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

10
R136a1
143 / 112 / 36
Регистрация: 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
144 / 141 / 11
Регистрация: 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
06.02.2012, 21:56
ValeryS
Модератор
7777 / 5781 / 753
Регистрация: 14.02.2011
Сообщений: 19,785
Завершенные тесты: 1
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
220 / 133 / 19
Регистрация: 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 / 2
Регистрация: 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
Модератор
7777 / 5781 / 753
Регистрация: 14.02.2011
Сообщений: 19,785
Завершенные тесты: 1
07.02.2012, 00:32 8
Цитата Сообщение от daite_dve Посмотреть сообщение
А на что проверять, на символы, на десятеричную или шестнадцатеричную, это мне кажется не суть, запись от этого не сократится.
запись не сократится(может даже увеличится из за кавычек)
но понятно будет что ты имел ввиду
не надо комментировать
а так другой человек с ходу не поймет
да и сам через полгода будешь вспоминать что написал
самодокументированая программа, однако

Добавлено через 2 минуты
Цитата Сообщение от daite_dve Посмотреть сообщение
num1 = num1 * 10 + (ch - 48);
а что будет если я букву нажму ???
0
daite_dve
0 / 0 / 2
Регистрация: 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
Модератор
7777 / 5781 / 753
Регистрация: 14.02.2011
Сообщений: 19,785
Завершенные тесты: 1
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 / 2
Регистрация: 06.02.2012
Сообщений: 37
07.02.2012, 08:56  [ТС] 11
да, спасибо за ответ
P.S.:пошел изучать работу cin))
0
07.02.2012, 08:56
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2012, 08:56

Проверка условия окончания цикла for
Здраствуйте. Проблема заключается в следующем. Есть следующий цикл: for( int i=2;...

Оптимизация цикла по скорости
Помогите пожалуйста оптимизировать данный цикл (изменить его, чтобы он выполнялся быстрее): ...

Завершение внешнего цикла из внутреннего условия
Подскажите, как в функции set() завершить цикл for при выполнении условия цикла if? Компилятор...


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

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

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