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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
Flying_Man
0 / 0 / 0
Регистрация: 28.01.2011
Сообщений: 28
#1

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

02.02.2011, 21:06. Просмотров 1884. Ответов 12
Метки нет (Все метки)

В общем, я протупил создав эту Чтение строки из файла тему! Нужно было сразу написать условие задачи:
Количество операций

Определить общее количество операций сложения (+), вычитания (-) и умножения (*) в заданном арифметическом выражении.

Технические условия

Входные данные

В единственной строке задано арифметическое выражение, не содержащее скобок и пробелов. Количество символов в выражении не превышает 250.

Выходные данные

Единственное число - количество указанных операций.

Пример входных данных

-1+2*3+a


Пример выходных данных

3

Как можно эту задачу решить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2011, 21:06     Определить общее количество операций
Посмотрите здесь:

Определить общее количество осадков за этот год - C++
Занести из файла в массив сведения о количестве осадков, выпавших за каждый из 12 месяцев одного года. Определить общее количество осадков...

Определить общее количество цифр в положительных элементах массива - C++
дан целочисленный массив А. определить общее количество цифр в числовых значениях всех положительных элементов массива. самый...

Пользовательские функции (Определить общее количество осадков за январь) - C++
В массиве хранятся сведения о количестве осадков, выпавших за каждый день января. Определить общее количество осадков за январь. ...

Определить общее количество выиграшей и ничьих данной команды - C++
В массиве записаны результаты 20 игр футбольной команды (если игра окончилась выграшем данной команды, то записано число 3, проигрышем - 0,...

Найти общее количество учеников школы в каждой параллели; определить самую малочисленную параллель - C++
В двумерном масссиве храниться инфо учеников, в каждом классе, в каждой параллели наальной школы В каждой параллели по 4 класса найти...

Определить общее число и общее время удалений за время матча - C++
В ходе хоккейного матча игроки обеих команд удалялись в общей сложности 24 раза. По каждому удалению известен номер команды удаленного...

Вычислить общее количество символов в строке и количество букв "а" - C++
Доброго времени суток, граждане программисты. У меня вот задание:"Ввести фамилию, имя, отчество, как одно данное. Вычислить общее...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
igorrr37
1644 / 1272 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
02.02.2011, 21:41     Определить общее количество операций #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
#include<algorithm>
#include<fstream>
using namespace std;
 
int main(){
    string s;
    ifstream fin("input.txt");
    if(!fin){cerr<<"File not found"; return 1;}
    getline(fin, s, '\n');
    cout<<s<<"\n";
    cout<<count_if(s.begin()+1, s.end(), [](char c){return c=='+'||c=='-'||c=='*';});
    fin.close();
}
_масяня_
28 / 28 / 2
Регистрация: 18.12.2010
Сообщений: 158
02.02.2011, 21:50     Определить общее количество операций #3
вот простенький пример этого задания
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
#include<conio.h>
#include<string.h>
 
main()
{
      char str[512]="";
      int i, flag=0;
      int d;
      printf("VVedite stroky");
      scanf("%s", & str);
      
      d=strlen(str);
       
       for(i=0; i<d; i++)
       if(str[i]=='*'|| str[i]=='-' || str[i]==':' ||str[i]=='+')
       flag++;
      printf("Flag=%d", flag);
      
 getch();     
}
Flying_Man
0 / 0 / 0
Регистрация: 28.01.2011
Сообщений: 28
02.02.2011, 21:52  [ТС]     Определить общее количество операций #4
igorrr37, компилятор пишет:
45.cpp: In function `int main()':
45.cpp:12: error: syntax error before `[' token
45.cpp: At global scope:
45.cpp:13: error: syntax error before `.' token
g++: 45.o: No such file or directory
g++: no input files

(((---Compile ERROR!!!---)))
Для продолжения нажмите любую клавишу . . .

Добавлено через 2 минуты
_масяня_, Выдает 4 хотя должно 3.
_масяня_
28 / 28 / 2
Регистрация: 18.12.2010
Сообщений: 158
02.02.2011, 22:39     Определить общее количество операций #5
Странно у меня Dev-c++ все нормально компилиться и выдает верные результаты
Миниатюры
Определить общее количество операций  
_масяня_
28 / 28 / 2
Регистрация: 18.12.2010
Сообщений: 158
02.02.2011, 22:42     Определить общее количество операций #6
хотя по сути знак перед тройкой можно убрать... ведь это не арифметическая операция
Flying_Man
0 / 0 / 0
Регистрация: 28.01.2011
Сообщений: 28
02.02.2011, 22:46  [ТС]     Определить общее количество операций #7
_масяня_, в том все и дело что минус в начале не есть операцией и по этому выдавать должно 3 там я попробовал немного "доделать" но застрял... Что точно означает "||"???
_масяня_
28 / 28 / 2
Регистрация: 18.12.2010
Сообщений: 158
02.02.2011, 22:55     Определить общее количество операций #8
вот теперь если первое число отрицательное то выведет нормальный ответ. думаю можно еще обработать два минуса подряд если надо
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
#include<stdio.h>
#include<conio.h>
#include<string.h>
 
main()
{
      char str[250]="";
      int i, flag=0;
      int d;
      printf("VVedite stroky");
      scanf("%s", & str);
      
      d=strlen(str);
       
       for(i=0; i<d; i++)
       
       {
       if(str[i]=='*'|| str[i]=='-' || str[i]==':' ||str[i]=='+')
       {flag++;}
        
        }
     if (str[0]=='-') {flag-=1;}
      printf("Flag=%d", flag);
      
 getch();     
}
Добавлено через 1 минуту
знак || это логическое "или"
Алексaндр
131 / 108 / 5
Регистрация: 04.12.2010
Сообщений: 313
02.02.2011, 23:14     Определить общее количество операций #9
нет... нужно ещё отследить скобки... например,

-2+4*3-5*(-3)+а

Добавлено через 4 минуты
_масяня_,
C++
1
2
3
4
5
6
7
8
  for(i=0; i<d; i++)
           
           {
           if(str[i]=='*'|| str[i]=='-' || str[i]==':' ||str[i]=='+')
           {flag++;}
                
                }
         if (str[0]=='-') {flag-=1;}
за4ем же так? )) просто всегда на4инать проверку с 1-го эллемента... так проще :

C++
1
2
  for(i=1; i<d; i++)
           if(str[i]=='*'|| str[i]=='-' || str[i]==':' ||str[i]=='+') flag++;
Flying_Man
0 / 0 / 0
Регистрация: 28.01.2011
Сообщений: 28
03.02.2011, 15:45  [ТС]     Определить общее количество операций #10
Алексaндр,
Цитата Сообщение от Flying_Man Посмотреть сообщение
В единственной строке задано арифметическое выражение, не содержащее скобок и пробелов. Количество символов в выражении не превышает 250.
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
04.02.2011, 05:30     Определить общее количество операций #11
Нижеприведенная программа правильно обрабатывает все допустимые выражения и сообщает о некорректности всех недопустимых.
Так как конкретно не сказано, я сделал допустимыми числа из нескольких цифр и имена переменных из нескольких латинских букв.
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;
    }
}
4ikapikadesi
Сообщений: n/a
21.04.2011, 22:50     Определить общее количество операций #12
пусть тема и старая
но мне одно непонятно.. почему мы не можем считать арифметическим действием (если отвлеченно думать) знак минус перед первым числом... ведь всегда не трудно представить в начале любых действий "0+(или же 0-, когда знак + можем опустить).......ваши действия".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2011, 23:00     Определить общее количество операций
Еще ссылки по теме:

Не подсчитывает общее количество - C++
При разборе простейшей программы возникли затруднения. Код программы: #include &lt;iostream.h&gt; main () { int passes = 0,...

количество операций сравнения 2 - C++
как определить количество операций сравнения в это алгоритме? сортировка методом двухпутевых вставок int main() { const int...

Месса. Подсчитать общее количество рукопожатий. - C++
Хорошей частью Римской католической мессы является обряд мира, когда люди обмениваются рукопожатием со своими соседями и говорят: &quot;мир...

Подсчитать общее количество «счастливых» билетов - C++
Подсчитать общее количество «счастливых» билетов. Билет имеет шестизначный номер и является счастливым, если сумма первых трех цифр равна...

Вычислить общее количество строчных букв - C++
Вычислить общее количество строчных английских и строчных букв. Не получается это вычислить, после пробела не высчитывает буквы. Еще ...


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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
21.04.2011, 23:00     Определить общее количество операций #13
Цитата Сообщение от 4ikapikadesi Посмотреть сообщение
почему мы не можем считать арифметическим действием (если отвлеченно думать) знак минус перед первым числом...
Потому что в задании требуется подсчитать в выражении количество бинарных операторов, а минус перед первым числом - оператор унарный.
Yandex
Объявления
21.04.2011, 23:00     Определить общее количество операций
Ответ Создать тему
Опции темы

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