杭電OJ——簡単計算機
たんじゅんけいさんき
Problem Description
+、-、*、/のみを含む非負の整数計算式を読み込み、その値を計算します.
Input
テスト入力には、各テスト・インスタンスが1行を占め、各行が200文字を超えず、整数と演算子の間にスペースで区切られたいくつかのテスト・インスタンスが含まれます.不正な式はありません.1行に0しかない場合は入力が終了し、対応する結果は出力されません.
Output
各テストケースに1行、すなわち式の値を小数点以下2桁まで出力します.
Sample Input
Sample Output
問題は難しくない!ただあまりにも奇妙すぎる!長い間REだったので、配列やポインタの境界を越えるようにヒントを与えました!結局私は間違いを探して長い間探していました!すみません.ずっと間違いが見つからなかった!杭電のテストデータがどうなっているのか分からない.お父さん!ヒント越境!どこへ行って間違いを正すんだ?最後に!この話を書くときも、我慢できません!もう間違いを正したくない!私のコードに間違いがないことしか知らない!ACのために、他の人のコードを参考にしました!思想は自分のしたことと基本的に一致します!この問題も人柄次第ですか.しつこい!神様が原因を知っていたら!指を指さしてください.もう我慢できない!
ちょっとした知識点をまとめましょう!
1.scanfで入力すると、スペースに出会って終わり、getsでスペースを入力できます!だからこの問題にはgets関数で入力します!
文章を転載しましょう.http://blog.csdn.net/dtqzlgj/article/details/6959281
最も全入力関数c/c++1:c=getchar()機能:文字の説明を読み込みます:この関数を呼び出す時プログラムの第1行にプリコンパイルコマンドがあることを要求します:#includeがあって、しかしc++をする時
#includeがあっても十分です.変数cは、標準デバイスから読み出された文字コード値を取得する.スレーブキー
ディスクに^z(つまりCTRLとZキーを同時に押す)を入力すると、Cで得られる値は-1であり、^zはファイルの末尾と呼ばれ、プログラム中に
符号定数EOFで表されることが多い.二:文字列入力関数char*s;gets(s); 機能:文字列を読み出し、sが指すメモリに格納します.に遭遇すると文字列の入力が終了し、
文字を"0"(すなわちNULL)に自動的に変換して列の末尾に配置し、文字列を構成します.説明:Sは、取得した文字列の先頭アドレスを指す文字列ポインタです.正常に戻ると、文字列に戻ります.
で行ないます.ファイルの最終品目エラーが発生した場合はNULLに戻ります.NULLの定義形式は「#DEFINE NULL 0」であるstdioに含まれる.hのヘッダファイルにあります.さらにc++で使用するとヘッダファイルincludeがcinに類似する.getline()の一例では、gets()も多次元配列で使用できます:#include#includeusing namespace std;main(){char m[3][20];for(int i=0;i<3;i+){cout<<<第を入力してください<>にも適用可能である.
ああ、ここにスペースが入力されていないので、スペースが入力されている場合、例えば「ks kr jkl[リターン]」が入力されている場合、cinはすでに
3つの文字列、「ks,kr,jkl」が受信された.更に「kskr 1[リターン]kskr 2[リターン]」のように、
「kskr,1,kskr」を受け取る.これは私たちが望んでいる結果ではありません!そしてcin.getline()とgets()はスペースを受信できるので、
だからこの間違いは起こらない.三.cin.get()用法1:cin.get(文字変数名)は、文字#includeusing namespace stdを受信するために使用することができる.int main(){char ch;ch=cin.get();//またはcin.get(ch);cout<using namespace stdを受信することができる.main () { char a[20]; cin.get(a,20); cout<using namespace stdを出力できる文字列を受け入れます.main () { char m[20]; cin.getline(m,5); cout<3番目のパラメータが省略する場合、システムのデフォルトは'0'//例のcin.getline()をcinに変更する.getline(m,5,'a');jlkjkljklが入力されるとjkljが出力され、入力
jkaljkljklの場合、出力jkは多次元配列に用いる場合にcinを用いてもよい.getline(m[i],20)などの使い方:#include#includeusing namespace std;main(){char m[3][20];for(int i=0;i<3;i+){cout<<<第を入力してください<」#include#includeusing namespace std;main () { string str; getline(cin,str); cout<同じ2つの関数
Problem Description
+、-、*、/のみを含む非負の整数計算式を読み込み、その値を計算します.
Input
テスト入力には、各テスト・インスタンスが1行を占め、各行が200文字を超えず、整数と演算子の間にスペースで区切られたいくつかのテスト・インスタンスが含まれます.不正な式はありません.1行に0しかない場合は入力が終了し、対応する結果は出力されません.
Output
各テストケースに1行、すなわち式の値を小数点以下2桁まで出力します.
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36
問題は難しくない!ただあまりにも奇妙すぎる!長い間REだったので、配列やポインタの境界を越えるようにヒントを与えました!結局私は間違いを探して長い間探していました!すみません.ずっと間違いが見つからなかった!杭電のテストデータがどうなっているのか分からない.お父さん!ヒント越境!どこへ行って間違いを正すんだ?最後に!この話を書くときも、我慢できません!もう間違いを正したくない!私のコードに間違いがないことしか知らない!ACのために、他の人のコードを参考にしました!思想は自分のしたことと基本的に一致します!この問題も人柄次第ですか.しつこい!神様が原因を知っていたら!指を指さしてください.もう我慢できない!
ちょっとした知識点をまとめましょう!
1.scanfで入力すると、スペースに出会って終わり、getsでスペースを入力できます!だからこの問題にはgets関数で入力します!
// ‘+’ ‘-’ ‘*’ ‘/’ !
#include<iostream>
#include<cstdio>
#include<string.h>
#include<stack>
using namespace std;
// ! !
int cmp[4][4]={
1,1,0,0,
1,1,0,0,
1,1,1,1,
1,1,1,1};
bool Isnum(char ch)
{
if(ch >= '0' && ch <= '9') return true;
else return false;
}
double Caculate(double a,char b,double c)
{
switch(b)
{
case '+':return a+c;
case '-':return a-c;
case '*':return a*c;
case '/':return a/c;
}
return 0;
}
inline int Compare(char &a,char &b)
{
int m,n;
switch(a)
{
case '+':m=0;break;
case '-':m=1;break;
case '*':m=2;break;
case '/':m=3;break;
}
switch(b)
{
case '+':n=0;break;
case '-':n=1;break;
case '*':n=2;break;
case '/':n=3;break;
}
return cmp[m][n];
}
int main()
{
char str[300];
double a,b;
char theta;
int i,flag;
double s;
while(gets(str))
{
if(strcmp("0",str)==0) break;
stack<char> s1;
stack<double> s2;
/*
for(i=0;i<strlen(str);)
{
switch(str[i])
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
s=str[i]-'0'; i++;
while(str[i]!=' '&& str[i]!='\0')
{
s=s*10+(str[i]-'0');
i++;
}
s2.push(s);
i++; break;
//cout<<sum<<endl;
case '+':
case '-':
if(s1.empty())
s1.push(str[i]);
else
{
while(!s1.empty())
{
theta=s1.top();s1.pop();
b=s2.top();s2.pop();
a=s2.top();s2.pop();
s2.push(Caculate(a,theta,b));
}
s1.push(str[i]);
}
i+=2; break;
case '/':
case '*':
if(s1.empty())
s1.push(str[i]);
else
{
if(s1.top()=='*'||s1.top()=='/')
{
theta=s1.top();s1.pop();
b=s2.top();s2.pop();
a=s2.top();s2.pop();
s2.push(Caculate(a,theta,b));
}
s1.push(str[i]);
}
i+=2; break;
}
}*/
/*
for(i=0;i<strlen(str);)
{
if(str[i]==' ') i++;// ,
else if(Isnum(str[i]))// !
{
s=str[i]-'0'; i++;
while(str[i]!=' '&& str[i]!='\0')// !
{
s=s*10+(str[i]-'0');
i++;
}
s2.push(s);
}
else// !
if(s1.empty()) {s1.push(str[i]);i++;}
else//
{
flag=1;
while(flag)// , ch !
{
if(Compare(str[i],s1.top())==1)
{
s1.push(str[i]); flag=0;// ,
}
else
{
theta=s1.top(); s1.pop();//
b=s2.top(); s2.pop();
a=s2.top(); s2.pop();
s2.push(Caculate(a,theta,b));// !
}
}
i++;
}
}//for !
*/
for(i=0;i<strlen(str);)// , !
{
if(str[i]==' ') i++;
else
if(Isnum(str[i]))
{
s=str[i]-'0'; i++;
while(str[i]!=' '&&str[i]!='\0')
{
s=s*10+(str[i]-'0');
i++;
}
s2.push(s);
i++;
}
else
{
switch(str[i])
{
case '+':
case '-':
if(s1.empty())
s1.push(str[i]);
else
{
while(!s1.empty())
{
theta=s1.top();s1.pop();
b=s2.top();s2.pop();
a=s2.top();s2.pop();
s2.push(Caculate(a,theta,b));
}
s1.push(str[i]);
}
i+=2; break;
case '/':
case '*':
if(s1.empty())
s1.push(str[i]);
else
{
if(s1.top()=='*'||s1.top()=='/')
{
theta=s1.top();s1.pop();
b=s2.top();s2.pop();
a=s2.top();s2.pop();
s2.push(Caculate(a,theta,b));
}
s1.push(str[i]);
}
i+=2; break;
}//switch
}//else
}//for
/*for(i=0;i<strlen(str);)// , !
{
if(str[i]==' ') i++;
else
if(Isnum(str[i]))
{
s=str[i]-'0'; i++;
while(str[i]!=' '&& str[i]!='\0')
{
s=s*10+(str[i]-'0');
i++;
}
s2.push(s);
//i--;
}
else
{
if(s1.empty()) {s1.push(str[i]);i++;}
else//
{
flag=1;
while(flag)// , ch !
{
if(Compare(str[i],s1.top())==1)
{
s1.push(str[i]); flag=0;// ,
}
else
if(!s1.empty())
{
theta=s1.top(); s1.pop();//
b=s2.top(); s2.pop();
a=s2.top(); s2.pop();
s2.push(Caculate(a,theta,b));// !
}
else// s1
{ s1.push(str[i]); flag=0;}// ! s1 ! s1
// ! ! , str[i] , !
}
i++;
}
}//switch
}//else
*/
while(!s1.empty())// , , !
{
theta=s1.top(); s1.pop();
b=s2.top(); s2.pop();
a=s2.top(); s2.pop();
s2.push(Caculate(a,theta,b));
}
s=s2.top();
s2.pop();
printf("%.2lf
",s);// , !
}
return 0;
}
文章を転載しましょう.http://blog.csdn.net/dtqzlgj/article/details/6959281
最も全入力関数c/c++1:c=getchar()機能:文字の説明を読み込みます:この関数を呼び出す時プログラムの第1行にプリコンパイルコマンドがあることを要求します:#include
#include
ディスクに^z(つまりCTRLとZキーを同時に押す)を入力すると、Cで得られる値は-1であり、^zはファイルの末尾と呼ばれ、プログラム中に
符号定数EOFで表されることが多い.二:文字列入力関数char*s;gets(s); 機能:文字列を読み出し、sが指すメモリに格納します.
で行ないます.ファイルの最終品目エラーが発生した場合はNULLに戻ります.NULLの定義形式は「#DEFINE NULL 0」であるstdioに含まれる.hのヘッダファイルにあります.さらにc++で使用するとヘッダファイルinclude
ああ、ここにスペースが入力されていないので、スペースが入力されている場合、例えば「ks kr jkl[リターン]」が入力されている場合、cinはすでに
3つの文字列、「ks,kr,jkl」が受信された.更に「kskr 1[リターン]kskr 2[リターン]」のように、
「kskr,1,kskr」を受け取る.これは私たちが望んでいる結果ではありません!そしてcin.getline()とgets()はスペースを受信できるので、
だからこの間違いは起こらない.三.cin.get()用法1:cin.get(文字変数名)は、文字#include
jkaljkljklの場合、出力jkは多次元配列に用いる場合にcinを用いてもよい.getline(m[i],20)などの使い方:#include