[問題] 程式碼跑不出來...

看板C_and_CPP (C/C++)作者 (淡藍的憂傷)時間16年前 (2010/01/23 01:03), 編輯推噓0(0016)
留言16則, 4人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 我寫了一個要求用overload作加減乘除運算的式子 但是他輸入完我要求計算的東西以後就完全沒動靜 希望得到的正確結果: 輸入兩個多項式以後正確的計算結果 程式跑出來的錯誤結果: 沒在動= =" 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) dev-c++ 4.9.9.2 有問題的code: (請善用置底文標色功能) //polynomial.h #include<iostream> #include<cstdlib> #include<cstring> #include <math.h> using namespace std; #ifndef POLYNOMIAL_H #define POLYNOMIAL_H class polynomial { friend void getpolynomial(const polynomial &); public: polynomial(); ~polynomial(); void setpolynomial(const char*); polynomial operator+(const polynomial &); polynomial operator-(const polynomial &); polynomial operator*(const polynomial &); polynomial operator=(const polynomial &); polynomial operator+=(const polynomial &); polynomial operator-=(const polynomial &); polynomial operator*=(const polynomial &); void combinesame(); void degdown(); private: int *exp,*co,*jdg; int num; }; #endif //polynomial.cpp polynomial::polynomial() { num=0; char *p=new char[strlen(p)+10]; cout<<"請輸入您想計算的多項式:"<<endl; cin.getline(p,(strlen(p)+10)); for(int a=0;a<strlen(p)+10;a++) { if(p[a]=='x') num=num+1; } if(p[0]!='-') { char *p1=new char[strlen(p)+2]; p1[0]='+'; for(int p2=1;p2<strlen(p)+1;p2++) {p1[p2]=p[p2-1]; } for(int p3=0;p3<strlen(p)+1;p3++) {p[p3]=p1[p3]; } } for(int ch1=0;ch1<strlen(p)+1;ch1++) {if((p[ch1]=='x')&&((p[ch1+1]=='+')||(p[ch1+1]=='-')||(p[ch1+1]=='*')||(p[ch1+1]=='\0'))) {char *p3=new char[strlen(p)+3]; for(int ch2=0;ch2<strlen(p)+1;ch2++) {p3[ch2]=p[ch2]; } for(int ch3=0;ch3<strlen(p)+2;ch3++) { if(ch3<ch1) p[ch3]=p3[ch3]; if(ch3==ch1) {p[ch3]='x'; p[ch3+1]='^'; p[ch3+2]='1'; } if(ch3>ch1) {p[ch3]=p3[ch3-2]; } } delete []p3; } if((p[ch1]=='+')||(p[ch1]=='-')||(p[ch1]=='*')) { int ch4; for(ch4=1;ch4<strlen(p);ch4++) {if((p[ch1+ch4]=='+')||(p[ch1+ch4]=='-')||(p[ch1+ch4]=='*')||(p[ch1+ch4]=='x')||(p[ch1+ch4]=='\0')) break; } if(p[ch1+ch4]!='x') {char *p4=new char[strlen(p)+4]; for(int ch5=0;ch5<strlen(p)+1;ch5++) {p4[ch5]=p[ch5]; } for(int ch6=0;ch6<strlen(p)+3;ch6++) {if(ch6<=(ch1+ch4)) p[ch6]=p4[ch6]; if(ch6=(ch1+ch4)) {p[ch6]='x'; p[ch6+1]='^'; p[ch6+2]='0'; } if(ch6>=(ch1+ch4+3)) { p[ch6]=p4[ch6-3]; } } delete []p4; } } } exp=new int[num]; co=new int[num]; for(int i=0;i<strlen(p);i++) { exp[i]=0; co[i]=0; jdg[i]=0; } setpolynomial(p); } polynomial::~polynomial() { } void polynomial::setpolynomial(const char *set) { char *s1,*s2,*s3,*s4; char *s= new char[num+1]; strcpy(s,set); int a=0; for(int i=0;i<num;i++) { if(s[i]=='^') {int j=1; while(j!=0) { if((s[i+j]=='+')||(s[i+j]=='-')||(s[i+j]=='*')||(s[i+j]=='\0')) {*s1=s[i+1]; for(int k=2;k<j;k++) {*s2=s[i+k]; strcat(s1,s2); exp[a]=atoi(s1); } break; } else j++; } } if((s[i]=='+')||(s[i]=='-')||(s[i]=='*')) {int l=1; while(l!=0) {if(s[i+l]=='x') {*s3=s[i+1]; for(int m=2;m<l;m++) {*s4=s[i+m]; strcat(s3,s4); co[a]=atoi(s3); } break; } else l++; } } a++; if(s[i]=='-') {jdg[i]=1; } if(s[i]=='*') {jdg[i]=2; } } } void getpolynomial(const polynomial&A) { for(int pt1=0;pt1<A.num;pt1++) {if(A.co[pt1]>0) {cout<<"+"; } if(((A.exp[pt1]!=1)||(A.exp[pt1]!=0))&&(A.co[pt1]!=0)) {cout<<A.co[pt1]<<"x^"<<A.exp[pt1]; } if((A.exp[pt1]==1)&&(A.co[pt1]!=0)) {cout<<A.co[pt1]<<"x"; } if((A.exp[pt1]==0)&&(A.co[pt1]!=0)) {cout<<A.co[pt1]; } } cout<<endl; } polynomial polynomial::operator+(const polynomial &plus) { polynomial temp1; temp1=*this; for(int p1=0;p1<temp1.num;p1++) for(int p2=0;p2<plus.num;p2++) {if(temp1.exp[p1]==plus.exp[p2]) temp1.co[p1]+=plus.exp[p1]; } return temp1; } polynomial polynomial::operator-(const polynomial &minus) { polynomial temp2; temp2=*this; for(int m1=0;m1<temp2.num;m1++) for(int m2=0;m2<minus.num;m2++) {if(temp2.exp[m1]==minus.exp[m2]) temp2.co[m1]-=minus.exp[m1]; } return temp2; } polynomial polynomial::operator*(const polynomial &multiply) { polynomial temp3; temp3=*this; for(int mu1=0;mu1<temp3.num;mu1++) for(int mu2=0;mu2<multiply.num;mu2++) {temp3.exp[mu1]+=multiply.exp[mu2]; temp3.co[mu1]*=multiply.co[mu2]; } combinesame(); return temp3; } polynomial polynomial::operator=(const polynomial &equal) { polynomial temp4; temp4=*this; for(int eq=0;eq<equal.num;eq++) {temp4.exp[eq]=equal.exp[eq]; temp4.co[eq]=equal.co[eq]; } return temp4; } polynomial polynomial::operator+=(const polynomial &pluseq) { polynomial temp5; temp5=*this; for(int peq=0;peq<pluseq.num;peq++) {if(temp5.exp[peq]==pluseq.exp[peq]) temp5.co[peq]+=pluseq.co[peq]; } return temp5; } polynomial polynomial::operator-=(const polynomial &minuseq) { polynomial temp6; temp6=*this; for(int meq=0;meq<minuseq.num;meq++) {if(temp6.exp[meq]==minuseq.exp[meq]) temp6.co[meq]-=minuseq.co[meq]; } return temp6; } polynomial polynomial::operator*=(const polynomial &multieq) { polynomial temp7; temp7=*this; for(int mueq=0;mueq<multieq.num;mueq++) {temp7.exp[mueq]+=multieq.exp[mueq]; temp7.co[mueq]*=multieq.co[mueq]; } combinesame(); return temp7; } void polynomial::combinesame() { for(int c1=0;c1<num;c1++) for(int c2=0;c2<num;c2++) {if((exp[c1]==exp[c2])&&(jdg[c2]==0)) {co[c1]+=co[c2]; exp[c2]=0; co[c2]=0; } if((exp[c1]==exp[c2])&&(jdg[c2]==1)) {co[c1]-=co[c2]; exp[c2]=0; co[c2]=0; } if((jdg[c2]==2)&&(c2==(c1+1))) {exp[c1]+=exp[c2]; co[c1]*=co[c2]; exp[c2]=0; co[c2]=0; } for(int c3=0;c3<num;c3++) {if((exp[c3]==0)&&(co[c3]==0)) {co[c3]=co[c3+1]; exp[c3]=exp[c3+1]; exp[c3+1]=0; co[c3+1]=0; } } } degdown(); } void polynomial::degdown() { int tdeg; for(int de1=0;de1<num;de1++) for(int de2=num-1;de2>de1;de2--) { if((exp[de2]==0)&&(co[de2]!=0)) if((exp[de2-1]==0)&&(co[de2-1]==0)) { co[de2-1]=co[de2]; co[de2]=0; } if(fabs(exp[de2])>fabs(exp[de2-1])) { tdeg=exp[de2-1]; exp[de2-1]=exp[de2]; exp[de2]=tdeg; tdeg=co[de2-1]; co[de2-1]=co[de2]; co[de2]=tdeg; } } } //test.cpp int main() { polynomial F,G; cout<<"F+G"<<endl; getpolynomial(F+G); cout<<"F-G"<<endl; getpolynomial(F-G); cout<<"F*G"<<endl; getpolynomial(F*G); cout<<"F+=G"<<endl; getpolynomial(F+=G); cout<<"F-=G"<<endl; getpolynomial(F-=G); cout<<"F*=G"<<endl; getpolynomial(F*=G); getchar(); return 0; } 補充說明: 我的想法是 分別輸入兩組多項式存入陣列當作字串 然後如果多項式的最前面項不是負的 就加上"+" 如果多項式有一次項 就加上"^1" 如果多項式有常數 在常數後面加上"x^0" 然後宣告兩個private的陣列exp[]和co[] 分別儲存指數項和係數項 指數像是用"^"和加減乘或是結束字元中間的東西轉成int 係數像是用加減乘到x中間的字元轉成int 然後整理多項式,同類項合併 再按照降冪排列方式排下來 然後就overload運算 輸出結果 但是不知道問題在哪才輸入一個東西就完全沒動靜了... p.s.原來應該是分成三個檔案 分別是polynomial.h polynomial.cpp test.cpp -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.4.181 ※ 編輯: ps0204 來自: 140.112.4.181 (01/23 01:06)

01/23 01:06, , 1F
char *p=new char[strlen(p)+10]; ←這行好怪
01/23 01:06, 1F

01/23 01:09, , 2F
因為要再加東西怕說會超過 所以在多加10上去
01/23 01:09, 2F

01/23 01:14, , 3F
p 是個還沒配置空間的指標 你怎麼就用strlen(p)?
01/23 01:14, 3F

01/23 01:21, , 4F
在你的p所指向的空間沒有實際被填入字元之前
01/23 01:21, 4F

01/23 01:21, , 5F
你用strlen()拿不到你真正想要的東西的
01/23 01:21, 5F

01/23 02:14, , 6F
可是因為我字串陣列的長度在輸入之前並不知道有多少
01/23 02:14, 6F

01/23 02:15, , 7F
有沒有別的方法可以宣告呢?
01/23 02:15, 7F

01/23 02:17, , 8F
把buffer的長度固定,譬如說256
01/23 02:17, 8F

01/23 02:18, , 9F
然後寫迴圈一直收字元收到沒得收
01/23 02:18, 9F

01/23 02:19, , 10F
每一圈當你還有得收 你就知道你原本的長度不夠用
01/23 02:19, 10F

01/23 02:20, , 11F
就再生一條更長的空間出來
01/23 02:20, 11F

01/23 23:08, , 12F
realloc
01/23 23:08, 12F

01/23 23:25, , 13F
所以用迴圈的方式摟?謝謝樓樓上大大~
01/23 23:25, 13F

01/23 23:25, , 14F
and realloc是什麼呀?
01/23 23:25, 14F

01/24 00:16, , 15F
可以指定起始位置要一塊記憶體, 這樣你舊的部份保留
01/24 00:16, 15F

01/24 00:17, , 16F
不用再一一賦值
01/24 00:17, 16F
文章代碼(AID): #1BMTfD70 (C_and_CPP)
文章代碼(AID): #1BMTfD70 (C_and_CPP)