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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
Flying_Man
 Аватар для Flying_Man
0 / 0 / 0
Регистрация: 28.01.2011
Сообщений: 28
02.02.2011, 21:06     Определить общее количество операций #1
В общем, я протупил создав эту Чтение строки из файла тему! Нужно было сразу написать условие задачи:
Количество операций

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

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

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

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

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

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

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

-1+2*3+a


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

3

Как можно эту задачу решить?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 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
 Аватар для 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
 Аватар для 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ндр
 Аватар для Алекс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
 Аватар для Flying_Man
0 / 0 / 0
Регистрация: 28.01.2011
Сообщений: 28
03.02.2011, 15:45  [ТС]     Определить общее количество операций #10
Алексaндр,
Цитата Сообщение от Flying_Man Посмотреть сообщение
В единственной строке задано арифметическое выражение, не содержащее скобок и пробелов. Количество символов в выражении не превышает 250.
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,667
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трока: Найти общее количество символов «+» и «*» C++
Определить общее число и общее время удалений за время матча C++
Определить общее количество выиграшей и ничьих данной команды C++

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

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

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