Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Case ' + ' почему не работает?


Автор: egorletov 28.2.2006, 19:44
(11.00+i*5.00) + (11.00+i*5.00) исходный файл (несколько комплексных чисел )


почему не работает такая фенька ? Case ' + ' ? хочется что бы он различал + перед числом или перед скобкой , для етого я их хочу различть .. '+' и ' + ' ..
Почему ето не рабоает, если так нельзя то подскажите как можно


ето в майне
Код

for(int bo=0; bo<(str.size()); bo++){
        
        switch(str[bo]){
            case ' + ':
                cout<<"beeeeeeeeeeeeeeeee"<<endl;
                sa.sum(y,&imm[1],&ree[1]);
                flag=1;
                break;
             default:
                temp+=str[bo];
                break;
 
        }







са.сумм
Код

double Double_Complex::sum(int &kol,double im[1],double re[1])
{

    char zna='+';
char ii='i';
char mu='*';

int r=0;
int e=0;
int g=0;
int ti=0;
int w=1;
int log=0;

double Real[50];
double Imaginer[50];
Imaginer[r]=0.0;
Real[r]=0.0;
indif(g,&re[0],&im[0]);
//cout<<"\n"<<"kolitestvo kompleksnix tisel = "<<g<<"\n"<<endl;
     
do{

        Real[ti]=Real[ti]+re[e];
        cout<<e<<")"<<Real[ti]<<zna<<ii<<mu<<Imaginer[ti]<<endl;
        Imaginer[ti]=Imaginer[ti]+im[e];
 e++;
 }
 while (e!=g-1);
 cout<<r<<"\n Symma = "<<Real[ti]<<zna<<ii<<mu<<Imaginer[ti]<<endl ;


                    return Real[ti],Imaginer[ti];

}




са.индиф

Код

double Double_Complex::indif(int &kol,double operand_1[1],double operand_2[1])
{
    ifstream f;
    f.open("file.txt");

    if(!f){
        cout<<"Error 1:open input file,imposseble"<<endl;
        exit(1);
    }
    

char    sk1,sk2,znak,i, mul;
int      g=0;
    do{
    
f>>sk1>>operand_1[g]>>znak>>i>>mul>>operand_2[g]>>sk2;

//if (znak!='+')
//cout<<("Kompleksnoe thislo izmenino pod tip: a+i*b, !")<<endl;
//if(znak=='-')
  //  znak='+';

//cout<<g<<")"<<operand_1[g]<<znak<<i<<mul<<operand_2[g]<<endl  ;
g++;
} 
    while(!( f.eof()));
kol=g;
return kol,operand_1[g],operand_2[g];
}


Автор: Daevaorn 28.2.2006, 20:08
egorletov, если '+' это ещё символ, то ' + ' уже строка, которая в операторе case не может работать

Автор: Void 28.2.2006, 20:11
egorletov, сам посуди, ты делаешь switch по одному символу, а хочешь распознавать последовательность из нескольких.
Кроме того, ' + ' — это совсем не то, что ты думаешь. Это не строка, а целочисленная константа.

Автор: sergejzr 28.2.2006, 20:12
Потому что switch case работают только для целых чисел. (char - одна из их разновидностей)
Происходит прямое вырешивание адреса.
В твоих обрывках кода не разберёшься кстати.
И что тебе нужно тоже непонятно. При чём там пробелы?

Автор: Void 28.2.2006, 20:13
+, как правильно заметил Daevaorn, строки в switch участвовать не могут.

Методы разбора подобных строк на форуме давали. Можно использовать конечный автомат, можно врукопашную написать ту же самую логику — ничего сложного нет, просто подумать, какие символы и в какой последовательности могут встречаться.

Это я к предыдщему своему сообщению подклеить хотел smile

Автор: egorletov 28.2.2006, 20:23
тут в чем вопрос .. насчёт пробелов , я подозревал что _+_ ето уже строка , поету спросил,правдо кривавато ))

а как мне сделать так что , когда он идёт по страке он делал что такое

...

case '+' :
//symiry (zapusk metoda classa)
break;

case'-':
//vititay
break;

case'*':
//ymnozay

ny i t.d

но проблема в том что у меня в строке урав-ие из комплексных чисел, поетому там есть т.называемые ненужные знаки + и * ... как ето обойти..?



Автор: sergejzr 28.2.2006, 20:34
Запоминать, что было до знака. и потму ориентироваться. Только напрямую действия выполнять всё равно не получится, там же ещё скобки есть и прядок умножение/сложение надо соблюдать итд.

тебе нужен стек куда будешь складывать выражения, которые не можешь сразу решить. Вообще я бы сперва сделал класс для комплексного числа и с ним бы работал. Гдето эту тему уже проходили..
Добавлено @ 20:36
http://forum.vingrad.ru/index.php?act=ST&f=142&t=74234&st=0

Автор: egorletov 1.3.2006, 12:55
sergej.z, да я тот топик излазил с ног до головы , но чаго там всё раскидано .. Если тот человек который поднимал форум , выложил бы что то скомпанованое.Но он что-то утих...
..
..
..
Про СКОБки-


Скобки это моя придумка чтобы , что бы он первый опратор не делал отрицательным. но если этого можно избежать ето было бы хорошо конечно.



Цитата

В твоих обрывках кода не разберёшься кстати.



Код

//Main.cpp

#include <iostream>

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include "Complex.h"

#include <fstream>
using namespace std;

ifstream f;
Double_Complex sa;
main ()
{

   f.open("file.txt");
double ima[50];
double rea[50];
int h=50;
int t=1;
int y=1;
double imm[50];
double ree[50];

sa.indif(t,&ima[1],&rea[1]);

string str="";
string temp="";
f >>str;
bool flag=0;

for(int bo=0; bo<(str.size()); bo++){
        //cout<<"i hate this fucking world"<<endl;
        switch(str[bo]){
            case '+':
                cout<<str.size()<<endl;
                sa.sum(y,&imm[1],&ree[1]);
                flag=1;
                break;
                                    case '-':
                cout<<str.size()<<endl;
                sa.vit(y,&imm[1],&ree[1]);
                flag=1;
                break;
             default:
                temp+=str[bo];
                break;
 
        }

} 


cout<<"fgh "<<endl;

getch();





Код

//complex.cpp
#include <math.h>
#include "Complex.h"
#include <conio.h>
#include <string>
#include <vector>
#include <fstream>
using namespace std;


 
double Double_Complex::indif(int &kol,double operand_1[1],double operand_2[1])
{
    ifstream f;
    f.open("file.txt");

    if(!f){
        cout<<"Error 1:open input file,imposseble"<<endl;
        exit(1);
    }
    

char  znak,i, mul,sk1,sk2;
int      g=0;
    do{
    
f>>sk1>>operand_1[g]>>znak>>i>>mul>>operand_2[g]>>sk2;

//if (znak!='+')
//cout<<("Kompleksnoe thislo izmenino pod tip: a+i*b, !")<<endl;
//if(znak=='-')
  //  znak='+';

//cout<<g<<")"<<operand_1[g]<<znak<<i<<mul<<operand_2[g]<<endl  ;
g++;
} 
    while(!( f.eof()));
kol=g;
return kol,operand_1[g],operand_2[g];
}



double Double_Complex::sum(int &kol,double im[1],double re[1])
{

    char zna='+';
char ii='i';
char mu='*';

int r=0;
int e=0;
int g=0;
int ti=0;
int w=1;
int log=0;

double Real[50];
double Imaginer[50];
Imaginer[r]=0.0;
Real[r]=0.0;
indif(g,&re[0],&im[0]);
//cout<<"\n"<<"kolitestvo kompleksnix tisel = "<<g<<"\n"<<endl;
     
do{

        Real[ti]=Real[ti]+re[e];
        cout<<e<<")"<<Real[ti]<<zna<<ii<<mu<<Imaginer[ti]<<endl;
        Imaginer[ti]=Imaginer[ti]+im[e];
 e++;
 }
 while (e!=g-1);
 cout<<r<<"\n Symma = "<<Real[ti]<<zna<<ii<<mu<<Imaginer[ti]<<endl ;


                    return Real[ti],Imaginer[ti];

}


double Double_Complex::vit(int &kol,double im[1],double re[1])
{

    char zna='+';
char ii='i';
char mu='*';

int r=0;
int e=0;
int g=0;
int ti=0;
int w=1;
int log=0;

double Real[50];
double Imaginer[50];
Imaginer[r]=0.0;
Real[r]=0.0;
indif(g,&re[0],&im[0]);
//cout<<"\n"<<"kolitestvo kompleksnix tisel = "<<g<<"\n"<<endl;
     
do{

        Real[ti]=Real[ti]-re[e];
        cout<<e<<")"<<Real[ti]<<zna<<ii<<mu<<Imaginer[ti]<<endl;
        Imaginer[ti]=Imaginer[ti]-im[e];
 e++;
 }
 while (e!=g-1);
 cout<<r<<"\n Symma = "<<Real[ti]<<zna<<ii<<mu<<Imaginer[ti]<<endl ;


                    return Real[ti],Imaginer[ti];

}



Код

//complex.h
#ifndef __Complex_H
#define __Complex_H

#include <iostream>
#include <string>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

#include <fstream>
using namespace std;

class Double_Complex
{
private: 
     
      double Im;
      double Re;
public:
double Double_Complex::indif(int &kol,double operand_1[50],double operand_2[50]);
double Double_Complex::sum(int &kol,double im[1],double re[1]);
double Double_Complex::vit(int &kol,double im[1],double re[1]);
   
 
};


#endif



file.txt:




(11.20+i*5.00)+(141.40+i*5.00)-(11.00+i*5.00)+(12.00+i*8.00)+(11.00+i*5.00)-(123.00+i*5.00)



ну вот, в моих снах она дложна сумировть потов вычетать . далее опеть прибавлять приба ну и т.д.

в чём Ошибка кода?

Автор: Lotrex 3.3.2006, 10:17
Цитата(egorletov @ 28.2.2006, 19:44 Найти цитируемый пост)
(11.00+i*5.00) + (11.00+i*5.00) исходный файл (несколько комплексных чисел )

Имхо, Вам тут выражения в скобках надо выделять, опосля то, что в скобках - преобразовывать в комплексное число (класс complex). А дальше - уж те знаки анализируйте, что между скобок.

Автор: egorletov 4.3.2006, 15:09
Lotrex, smile smile

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


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)