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

Определить общее количество операций - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Структуры, объединения и определяемые пользователем типы. Массивы структур http://www.cyberforum.ru/cpp-beginners/thread237376.html
Здравтсвуйте! Помогите, пожалуйста, разобраться с одной задачкой! Условие следующее: Разработать программу обработки данных железнодорожного расписания. Известно расписание поездов, проходящих через станцию: номер поез¬да, назначение (откуда куда, например, Москва—Омск), часы и мину¬ты прибытия, часы и минуты отправления. Значения часов и минут це¬лые, положительные числа; число часов не...
C++ Сортировка. Доброе время суток. Разработать алгоритм сортировки методом простых вставок на основе сортировки таблицы адресов. Должны сортироваться записи типа record Key: integer; Info: <любой другой тип>; … end; Сортировку проводить по ключевому полю Key. http://www.cyberforum.ru/cpp-beginners/thread237372.html
C++ Массив с русс буквами.
Пишу программу в линуксе. int main() { char slova = { 'в',' д',' й',' х',' ч',' я',' т',' к',' д',' ж' }; return 0; }
C++ Написать программу, которая выводит содержимое массива наоборот
//1. Написать программу, которая выводит содержимое массива наоборот. // Пример: массив 23 11 6 превращается в 6 23 11. #include <iostream> using namespace std; void main(){ const int size=5; int array ={0}; for(int i=0;i<size;i++) { cout << i+1 << ")->";
C++ Нарушение прав доступа при чтении http://www.cyberforum.ru/cpp-beginners/thread237325.html
Имею функцию такого плана: void RenameOldLabels() { USES_CONVERSION; string path, pathAfterRename, pathToDelFile, pathToDelDir, copyCom; wchar_t* DesktopFolder = new wchar_t; wchar_t* StartPrograms = DesktopFolder; try { SHGetSpecialFolderPathW(0, DesktopFolder, CSIDL_COMMON_DESKTOPDIRECTORY, false);
C++ Найти сумму элементов массива от первого до последнего нулевого Собственно, проблема с тем, как определить этот самый последний элемент и запомнить его. Вот что у меня получилось, но постоянно сумма=0 #include <iostream.h> #include <conio.h> int main() { int n; int s; int i; подробнее

Показать сообщение отдельно
Mr.X
Эксперт С++
3042 / 1687 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
04.02.2011, 05:30     Определить общее количество операций
Нижеприведенная программа правильно обрабатывает все допустимые выражения и сообщает о некорректности всех недопустимых.
Так как конкретно не сказано, я сделал допустимыми числа из нескольких цифр и имена переменных из нескольких латинских букв.
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
/////////////////////////////////////////////////////////////////////////////////////////
//КОЛИЧЕСТВО ОПЕРАЦИЙ
//Определить общее количество операций сложения (+), вычитания (-) и умножения (*) 
//в заданном арифметическом выражении.
//
//ТЕХНИЧЕСКИЕ УСЛОВИЯ
 
//=========================
//  Входные данные
//=========================
//В единственной строке задано арифметическое выражение, не содержащее скобок и пробелов. 
//Количество символов в выражении не превышает 250.
 
//=========================
//  Выходные данные
//=========================
//Единственное число - количество указанных операций.
 
//=========================
//  Пример входных данных
//=========================
//-1+2*3+a
 
//=========================
//  Пример выходных данных
//=========================
//3
/////////////////////////////////////////////////////////////////////////////////////////
#include <cctype>
#include <iostream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string  T_str;
/////////////////////////////////////////////////////////////////////////////////////////
enum T_state
{
    SIGNUMS_STATE,
    NUM_STATE,
    VAR_STATE,
    BAD_STATE
};
/////////////////////////////////////////////////////////////////////////////////////////
T_state  state_cur;
/////////////////////////////////////////////////////////////////////////////////////////
void  SIGNUMS_STATE_parse(char symb)
{
    if(   symb == '+'
       || symb == '-')
    {
        ;
    }
    else if(isdigit(symb))
    {
        state_cur = NUM_STATE;
    }
    else if(isalpha(symb))
    {
        state_cur = VAR_STATE;
    }
    else
    {
        state_cur = BAD_STATE;
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
void  DIGIT_STATE_parse
    (
        char  symb,
        int&  operators_count
    )
{
    if(isdigit(symb))       
    {
        ;
    }
    else if(   symb == '+'
            || symb == '-'
            || symb == '*'
           )
    {
        ++operators_count;
        state_cur = SIGNUMS_STATE;
    }
    else
    {
        state_cur = BAD_STATE;
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
void  VAR_STATE_parse
    (
        char  symb,
        int&  operators_count
    )
{
    if(isalpha(symb))       
    {
        ;
    }
    else if(   symb == '+'
            || symb == '-'
            || symb == '*'
           )
    {
        ++operators_count;
        state_cur = SIGNUMS_STATE;
    }
    else
    {
        state_cur = BAD_STATE;
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  get_operators_count
    (
        const T_str&  s, 
        int&          operators_count
    )
{
    for(T_str::const_iterator  symb_it = s.begin();
        symb_it != s.end(); ++symb_it)
    {
        switch(state_cur)
        {
        case SIGNUMS_STATE:
            SIGNUMS_STATE_parse(*symb_it);
            break;
 
        case NUM_STATE:
            DIGIT_STATE_parse(*symb_it, operators_count);
            break;
 
        case VAR_STATE:
            VAR_STATE_parse(*symb_it, operators_count);
            break;
 
        case BAD_STATE:
            return  false;          
 
        default:
            ;
        }
    }
    return    state_cur == NUM_STATE
           || state_cur == VAR_STATE;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    for(;;)
    {
        std::cout << std::endl
                  << std::endl
                  << std::endl
                  << std::endl
                  << "Введите арифметическое выражение, "
                  << "содержащее операции \"+\", \"-\" и \"*\""
                  << std::endl
                  << "и не содержащее скобок и пробелов:"
                  << std::endl
                  << "-> ";
 
        T_str  s;
        getline(std::cin, s);
        if(s.empty()) break;
        state_cur = SIGNUMS_STATE;
        int  operators_count = 0;
        if(get_operators_count(s, operators_count))
        {
            std::cout << "Выражение содержит "
                      << operators_count
                      << " операций."
                      << std::endl;
        }
        else
        {
            std::cout << "Выражение некорректно."
                      << std::endl;
        }
    }
}
Добавлено через 9 часов 19 минут
Если же предположить, что на вход всегда подается корректное выражение, то можно так сделать:
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
/////////////////////////////////////////////////////////////////////////////////////////
//КОЛИЧЕСТВО ОПЕРАЦИЙ
//Определить общее количество операций сложения (+), вычитания (-) и умножения (*) 
//в заданном арифметическом выражении.
//
//ТЕХНИЧЕСКИЕ УСЛОВИЯ
 
//=========================
//  Входные данные
//=========================
//В единственной строке задано арифметическое выражение, не содержащее скобок и пробелов. 
//Количество символов в выражении не превышает 250.
 
//=========================
//  Выходные данные
//=========================
//Единственное число - количество указанных операций.
 
//=========================
//  Пример входных данных
//=========================
//-1+2*3+a
 
//=========================
//  Пример выходных данных
//=========================
//3
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string  T_str;
/////////////////////////////////////////////////////////////////////////////////////////
int  get_operators_count(const T_str&  s)
{
    struct  T_second_is_op
    {
        bool  operator() (char A, char B)
        {            
            return    isalnum(A) 
                   && (T_str("+-*").find(B) != T_str::npos);
        }
    };
    
    int  res = 0;
    for(T_str::const_iterator  find_it = s.begin();;)
    {
        find_it = std::adjacent_find(find_it, s.end(), T_second_is_op());    
        if(find_it != s.end())
        {
            ++res;
            find_it += 2;
        }
        else
        {
            break;
        }
    }
    return  res;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    for(;;)
    {
        std::cout << std::endl
                  << std::endl
                  << std::endl
                  << std::endl
                  << "Введите арифметическое выражение, "
                  << "содержащее операции \"+\", \"-\" и \"*\""
                  << std::endl
                  << "и не содержащее скобок и пробелов:"
                  << std::endl
                  << "-> ";
 
        T_str  s;
        getline(std::cin, s);
        if(s.empty()) break;       
        std::cout << "Если выражение корректно, то оно содержит "
                  << get_operators_count(s)
                  << " операций."
                  << std::endl;
    }
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru