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

оптимизация кода! - C++

Восстановить пароль Регистрация
 
Ferk
 Аватар для Ferk
3 / 3 / 1
Регистрация: 28.07.2011
Сообщений: 105
29.08.2011, 18:35     оптимизация кода! #1
Народ я тут написал простенькую программу которая вычесляет x из уровнения вида
a+x=b
x+a=b
a+b=x

Тоесть пишешь например: 245+x=500
а программа выводит: x=500-245
x=255

Но мне кажеться я ее както примитивно написал... можно ли этот код как нить упростить?



Вод листинг:

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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
#include <iostream>            
#include <string>
#include <sstream>
using namespace std;
int main ()
{
    string s(""),zn(""),str1(""),str2("");
    int i,ix,izn,ial,iravno;
    float a,b,x;
    cout<<"vvedi yrovnenie vida a+x=b"<<endl;
    cin>>s;
    
                               //__________________________________________
    for(i=0;i<s.length();i++)    
    {
    if(s[i]=='x')                      
    {
               ix=i;                       //нахождение индекса неизвестного элемента!
               }
               }
               
                               //____________________________________________
        
        
                             //________________________________________________    
    for(i=0;i<s.length();i++)
    {
       if(s[i]=='+')
       {
                    zn+="+";
                    izn=i;
                    break;
                    }
                                                   
        if(s[i]=='-')
       {
                    zn+="-";
                    izn=i;
                    break;
                    }                  //нахождение знака и его индекса!
        if(s[i]=='*')
       {
                    zn+="*";
                    izn=i;
                    break;
                    }                   
         if(s[i]=='/')
       {
                    zn+="/";
                    izn=i;
                    break;
                    }      
                    }
               //____________________________________________________________
         
         
         
 
               //____________________________________________________________
               
         for(i=0;i<s.length();i++)
         {
                    if(s[i]=='=') 
                    {                                 //нахождения индекса знака равенства!!  
                         iravno=i;
                         break;
                         }
                         }            
            ///______________________________________________________________
            
            
            
              
              
               
               //_____________________________________________________________
    if(ix==0)
        {
        ial=1;
        } 
    if(s[ix+1]=='=')
        {
        ial=2;         //нахождение каким из 3 элиментов уровнения является X!
        }
    if(s[ix-1]=='=')
        {
        ial=3;
        }              
               //_____________________________________________________________
               
               
               
               //____________________________________________________________
               
        if(ial==1)
        {
            for(i=izn+1;i<iravno;i++)
            {
                 str1+=s[i];
                 }
             for (i=iravno+1;i<=s.length();i++)
             {
             str2+=s[i];
             }
             }   
             
             
                 
               
           if(ial==2)
        {
            for(i=0;i<izn;i++)
            {
                 str1+=s[i];
                 }
             for (i=iravno+1;i<=s.length();i++)          //Записываем известные
             {                                                     //элементы в str1 и str2
             str2+=s[i];
             }
             }
             
             
                         
           if(ial==3)
        {
            for(i=0;i<izn;i++)
            {
                 str1+=s[i];
                 }
             for (i=izn+1;i<iravno;i++)
             {
             str2+=s[i];
             }
             }            
               //______________________________________________________________________________
               
               
               //____________________________________________________________________________
             istringstream ss1(str1); 
             ss1>>a;                                   //переводим str1 и str2 в float;
             istringstream ss2(str2);
             ss2>>b;  
              //______________________________________________________________________________ 
               
               
               
               
              //__________________________________________________________________________________
               
               if(ial==1)
               {
               if(zn=="+")
               {
                          x=b-a;
                          cout<<"x="<<b<<"-"<<a<<endl;
                          }
             
               if(zn=="-")
               {
                          x=a+b;
                          cout<<"x="<<a<<"+"<<b<<endl;
                          }
             
               if(zn=="*")
               {
                          x=b/a;
                          cout<<"x="<<b<<"/"<<a<<endl;
                          }
             
               if(zn=="/")
               {
                          x=a*b;
                          cout<<"x="<<a<<"*"<<b<<endl;
                          }
                          }
             
               
               //
               
               if(ial==2)
               {
               if(zn=="+")
               {
                          x=b-a;
                          cout<<"x="<<b<<"-"<<a<<endl;
                          }                                                    //Нахожим X!
                   
               if(zn=="-")
               {
                          x=a-b;
                          cout<<"x="<<a<<"-"<<b<<endl;
                          }
             
               if(zn=="*")
               {
                          x=b/a;
                          cout<<"x="<<b<<"/"<<a<<endl;
                          }
             
               if(zn=="/")
               {
                          x=a/b;
                          cout<<"x="<<a<<"/"<<b<<endl;
                          }
                          }
                          
                          
                       //   
                          
                           if(ial==3)
                           {
               if(zn=="+")
               {
                          x=b+a;
                          cout<<"x="<<b<<"+"<<a<<endl;
                          }
             
               if(zn=="-")
               {
                          x=a-b;
                          cout<<"x="<<a<<"-"<<b<<endl;
                          }
             
               if(zn=="*")
               {
                          x=b*a;
                          cout<<"x="<<a<<"*"<<b<<endl;
                          }
             
               if(zn=="/")
               {
                          x=a/b;
                          cout<<"x="<<a<<"/"<<b<<endl;
                          }
                          }
                          //________________________________________________________________________
                          
 cout<<"x="<<
 x<<endl;           
 system("pause");  
    return 0;
}
Добавлено через 33 минуты
нарооод?))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2011, 18:35     оптимизация кода!
Посмотрите здесь:

Оптимизация кода C++
Оптимизация кода C++
Оптимизация кода C++
C++ Оптимизация кода
C++ оптимизация кода
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Drum and C++
12 / 14 / 0
Регистрация: 03.08.2011
Сообщений: 213
29.08.2011, 18:49     оптимизация кода! #2
я даже до конца читать не стал зачем это все
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "stdafx.h"
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
double s , a;
cout<<"vvedi yrovnenie vida a+x=b"<<endl;
cin>>s;
cout<<"+x=";
cin>>a;
cout<<"x="<<a<<"-"<<s<<endl;
cout<<"x="<<a-s;
system("PAUSE");
return 0;
}
код для Visual express

Добавлено через 1 минуту
Ferk тебе подходит
Ferk
 Аватар для Ferk
3 / 3 / 1
Регистрация: 28.07.2011
Сообщений: 105
29.08.2011, 18:56  [ТС]     оптимизация кода! #3
дело в том что сдесь надо чтобы программа в строке сама находила где x где переменные и какой знак!!!!

Добавлено через 5 минут
там не обезательно знак плюс и не обезательно x стоит на позиции второй переменной!
Drum and C++
12 / 14 / 0
Регистрация: 03.08.2011
Сообщений: 213
29.08.2011, 18:57     оптимизация кода! #4
Цитата Сообщение от Ferk Посмотреть сообщение
дело в том что сдесь надо чтобы программа в строке сама находила где x где переменные и какой знак!!!!
так для этого нужны проверки типа если следующий знак в строке + или - или * или / соответственно свой алгорим решения if и for в помощь

Добавлено через 58 секунд
если пока для тебя это очень очень трудно учись дальше
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
29.08.2011, 18:59     оптимизация кода! #5
Цитата Сообщение от Drum and C++ Посмотреть сообщение
так для этого нужны проверки типа если следующий знак в строке + или - или * или / соответственно свой алгорим решения if и for в помощь

Добавлено через 58 секунд
если пока для тебя это очень очень трудно учись дальше
Будьте внимательнее.
Еще раз о чем топик:
Цитата Сообщение от Ferk Посмотреть сообщение
можно ли этот код как нить упростить?
Drum and C++
12 / 14 / 0
Регистрация: 03.08.2011
Сообщений: 213
29.08.2011, 19:02     оптимизация кода! #6
Цитата Сообщение от Chelioss Посмотреть сообщение
Будьте внимательнее.
Еще раз о чем топик:
так я о чем систему поиска переменных и знаков полностью переделать
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
29.08.2011, 19:20     оптимизация кода! #7
Цитата Сообщение от Drum and C++ Посмотреть сообщение
так я о чем систему поиска переменных и знаков полностью переделать
Дык ТС и спрашивает, что можно переделать.
Ferk
 Аватар для Ferk
3 / 3 / 1
Регистрация: 28.07.2011
Сообщений: 105
29.08.2011, 20:16  [ТС]     оптимизация кода! #8
Цитата Сообщение от Drum and C++ Посмотреть сообщение
так для этого нужны проверки типа если следующий знак в строке + или - или * или / соответственно свой алгорим решения if и for в помощь

Добавлено через 58 секунд
если пока для тебя это очень очень трудно учись дальше

а в моем коде типо не так...

Добавлено через 1 минуту
Цитата Сообщение от Drum and C++ Посмотреть сообщение
так я о чем систему поиска переменных и знаков полностью переделать
так ты скажи че переделать и чем моя система поиска плоха..
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
29.08.2011, 20:35     оптимизация кода! #9
первое что попалось... если тебе нужно использовать переменную в качестве "флага", то используй enum. это гораздо информативнее. и, конечно, гораздо экономнее, чем использование int (в случае с ial), а уж тем более string (в случае zn).
и еще первые два цикла можно объединить.
дальше не разбирался.
Ferk
 Аватар для Ferk
3 / 3 / 1
Регистрация: 28.07.2011
Сообщений: 105
29.08.2011, 20:53  [ТС]     оптимизация кода! #10
а народ давно в голове вертится такой вопрос... можно ли как нить сделать чтобы например после того как программа выполнилась она запросила повторить программу или нет.. вводишь y и она повторяеться! вводишь n и она завершаеться... была мысль всю программу в цикл взять и потом в конце условный оператор if оставить.. но чета у мя ошибак понавылазело))) помогите плиз.... можно ли так сделать и если да то как?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.08.2011, 20:59     оптимизация кода! #11
Ferk,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    std::string name;
    char ans = 'y';
    while (tolower(ans) != 'n')
    {
        std::cout << "Enter name" << '\n';
        std::getline(std::cin, name);
        std::cout << "Name is: " << name;
        std::cout << "Repeat? (y/n)" << '\n';
        std::cin >> ans;
    }
    return 0;
}
Drum and C++
12 / 14 / 0
Регистрация: 03.08.2011
Сообщений: 213
31.08.2011, 16:20     оптимизация кода! #12
Цитата Сообщение от Ferk Посмотреть сообщение
а народ давно в голове вертится такой вопрос... можно ли как нить сделать чтобы например после того как программа выполнилась она запросила повторить программу или нет.. вводишь y и она повторяеться! вводишь n и она завершаеться... была мысль всю программу в цикл взять и потом в конце условный оператор if оставить.. но чета у мя ошибак понавылазело))) помогите плиз.... можно ли так сделать и если да то как?
тоесть надо написать все в цикле и в самом конце if если например string=="n" break если равно y continue
тупой пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
using namespace std;
 
int main(int nNumberofArgs , char* pszArgs)
{
    string repeat;
    cout<<"Repeat Demo\n";
    for(;;)
    {
        cout<<"repeat ?? :";
        cin>>repeat;
        cout<<endl;
        if(repeat=="n" || repeat=="N"){break;}
        if(repeat=="y" || repeat=="Y"){continue;}
    }
    system("PAUSE");
    return 0;
}
Добавлено через 47 секунд
ошибок нет проверял (делал в CodeBlocs)
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
01.09.2011, 11:36     оптимизация кода! #13
Решение этой задачи:
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
#include <fstream>
#include <string>
 
int resh (const std:: string s)
{
    if (s[0]=='x') 
     {
        if (s[1]=='+') return (s[4]-'0')-(s[2]-'0');
        else return (s[4]-'0')+(s[2]-'0');
     }
     
     else if (s[2]=='x') 
     {
        if (s[1]=='+') return (s[4]-'0')-(s[0]-'0');
        else return (s[0]-'0')-(s[4]-'0');
     }
     
     else
     {
         if (s[1]=='+') return (s[0]-'0')+(s[2]-'0');
         else return (s[0]-'0')-(s[2]-'0');
     }
}
 
int main()
{
    std:: string s;
    int res;
    std:: ifstream ifs ("input.txt");
    ifs >> s;
    ifs.close();
    std:: ofstream ofs ("output.txt");
    ofs << resh (s);
    ofs.close();
    return 0;
}
Всё просто, просто ифы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2011, 10:02     оптимизация кода!
Еще ссылки по теме:

оптимизация кода C++
Оптимизация кода C++
C++ Оптимизация кода (C++)

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

Или воспользуйтесь поиском по форуму:
Ferk
 Аватар для Ferk
3 / 3 / 1
Регистрация: 28.07.2011
Сообщений: 105
12.09.2011, 10:02  [ТС]     оптимизация кода! #14
Цитата Сообщение от Dani Посмотреть сообщение
Решение этой задачи:
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
#include <fstream>
#include <string>
 
int resh (const std:: string s)
{
    if (s[0]=='x') 
     {
        if (s[1]=='+') return (s[4]-'0')-(s[2]-'0');
        else return (s[4]-'0')+(s[2]-'0');
     }
     
     else if (s[2]=='x') 
     {
        if (s[1]=='+') return (s[4]-'0')-(s[0]-'0');
        else return (s[0]-'0')-(s[4]-'0');
     }
     
     else
     {
         if (s[1]=='+') return (s[0]-'0')+(s[2]-'0');
         else return (s[0]-'0')-(s[2]-'0');
     }
}
 
int main()
{
    std:: string s;
    int res;
    std:: ifstream ifs ("input.txt");
    ifs >> s;
    ifs.close();
    std:: ofstream ofs ("output.txt");
    ofs << resh (s);
    ofs.close();
    return 0;
}
Всё просто, просто ифы.


Да я когда писал этот код исходил из этой задачи) но там понятно скока длина строки и извесно под каким индексом находятся переменные...
там могут быть тока однозначные числа! А в моем коде хоть 5 значные
Yandex
Объявления
12.09.2011, 10:02     оптимизация кода!
Ответ Создать тему
Опции темы

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