gotoを使わずに2
やっぱり全体がないとわかりませんよね・・・
とりあえず、コピーします。見にくいとおもいますが・・
中置法を逆ポーランドに変換するプログラムです。
void CPorandoView::OnButton1()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
CString ss;
char st[30],z[30],tai,ap; CEdit* myED1=(CEdit*)GetDlgItem(IDC_EDIT1); //EDIT1のアドレスをmyED1の代入
CEdit* myED2=(CEdit*)GetDlgItem(IDC_EDIT2); //EDIT2のアドレスをmyED2の代入
CEdit* myED3=(CEdit*)GetDlgItem(IDC_EDIT3); //EDIT3のアドレスをmyED3の代入
myED1->GetWindowText(ss); //入力された中置法式を作業領域ssに代入
int np=0,stp=0,zp=0,a=999,i=0,sw=0; char ka[30],s=0,kp=0; float st2[30]; float x=0;
char p[100]="" ;
char *N = new char[ss.GetLength()+1]; //ダイアログ(中置法入力枠)に入力された式をNに入れ込む
strcpy( N, ss );
myED1->SetWindowText("");
myED2->SetWindowText(""); myED3->SetWindowText("");
if(N[0]==NULL){
int ret;
ret=AfxMessageBox("入力がありません。",MB_OK|MB_ICONEXCLAMATION);
goto end;
}
if(30<strlen(N)){
int ret;
ret=AfxMessageBox("入力文字数オーバーです。",MB_OK|MB_ICONEXCLAMATION);
goto end;
}
for(;a!='\0';np++){ a=N[np];
tai=0;
if( a>0x003a){
if(a<0x007e ){
if(a!='*' && a!='/' && a!='+' && a!='-' && a!='(' && a!=')'){
int ret;
ret=AfxMessageBox("指定外文字が入力されています。",MB_OK|MB_ICONEXCLAMATION);
goto end;
}
}
}
if(a==0x0030){
int ret;
ret=AfxMessageBox("0は入力不可です。",MB_OK|MB_ICONEXCLAMATION);//入力が0の場合エラーを表示
goto end;
}
if(a>'0' && a<='9'){
if(z[zp-1]>='0' && z[zp-1]<='10'){ z[zp]=',';
zp++;
}
z[zp]=a; zp++;
z[zp]='\0'; sw--;
}else if(a!='(' && a!=')'){
if(stp==0){
st[stp]=a;
stp++;
st[stp]='\0';
sw++;
}else if(st[stp-1]!='('){
if(st[stp-1]=='*' || st[stp-1]=='/'){
tai=2;
}else{
tai=1;
}
}else{
st[stp]=a;
stp++;
}
if(a=='*' || a=='/'){
ap=2; sw++;
}else{
ap=1;
sw++;
}
if(sw>1){
int ret; ret=AfxMessageBox("演算子が連続しているか、\n先頭、または最後尾に演算子が入力されています。",MB_OK|MB_ICONEXCLAMATION);
goto end;
}
if(tai!=0){
if(ap<=tai){
z[zp]=st[stp-1]; st[stp-1]=a;
zp++;
z[zp]='\0';
st[stp]='\0';
if(a==st[stp-2]){ z[zp]=st[stp-2];
zp++; st[stp-2]=st[stp-1];
z[zp]='\0';
st[stp-1]='\0';
stp--;
}
}else{
st[stp]=a;
stp++;
st[stp]='\0';
}
}
}else if(a=='('){
st[stp]='('; stp++;
st[stp]='\0';
}else {
while(st[stp]!='('){、
stp--;
if(st[stp]!='('){
z[zp]=st[stp];
zp++;
}
}
}
}
if(stp>=0){
stp--;
while(stp>=1){
z[zp]=st[stp-1];
zp++;
z[zp]='\0';
stp--;
}
}
if(sw<=0){
int ret;
ret=AfxMessageBox("数値は1~9までです。",MB_OK|MB_ICONEXCLAMATION);//演算子がないとエラー処理
goto end;
}
z[zp+1]='\0'; myED2->SetWindowText(z); end:
;
}