.net上機第一題 - 簡單的字符串運算



其實這道題不難,但很多同學空着只寫了個main(),讓我感到很驚訝!

步驟:首先得定義一個去空格的函數,再有一個判斷格式錯誤的函數,然後纔是計算。
計算已經很簡單,去掉了除(/)這種情況,而且將操作數定義爲1~9的正整數。
難點:istringstream字符串輸入流用法
剛開始想利用char轉int來做,但發現時間複雜度會超時。使用istringstream可以解決這個問題,再定義兩個vector分別存放操作數和符號


PS: zjut1034題很像,只是多了去除空格,和格式判斷

鏈接:http://cpp.zjut.edu.cn/ShowProblem.aspx?ShowID=1034


附上源代碼(C++):

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
string Space_Remove(string str){  // 去除空格
	string re_str;
	for(int i=0;i<str.length();i++){
		if(str[i] != ' '){re_str += str[i];}
	}
	return re_str;
}
bool Format_Check(string str){   // 檢查輸入格式
	bool flag = true;
	for(int i=0;i<str.length();i=i+2){
		if(str[i]<'1' || str[i]>'9'){flag = false;break;}
	}
	for(int i=1;i<str.length()-1;i=i+2){
		if(str[i]!='*' && str[i]!='-' && str[i]!='+' && str[i]!='/'){flag = false;break;}
	}
	return flag;
}
void main(){
	string str;
	while(getline(cin,str)){
		str = Space_Remove(str);
		cout<<str<<endl;
		if(!Format_Check(str)){cout<<"#\n";}
		else {
			istringstream sin(str);   // 定義一個istringstream(字符串輸入流)對象sin,並將str的值存儲在sin中
			vector<int> num;
			vector<char> sign;
			char ch;
			int a;
			sin>>a;  // 字符串的讀取,只讀取整數,遇到符號停止讀取
			num.push_back(a);
			while(sin>>ch>>a){  // 先計算"*" 和 "/"
				if(ch=='*'){
					num.back() *= a;
				}
				else if(ch=='/'){
					if(a!=0){num.back() /= a;}   // 因爲a取1~9,所以被除數爲0不用考慮
					else {cout<<"error!\n";exit(0);}
				}
				else {
					num.push_back(a);
					sign.push_back(ch);
				}
			}
			int sum = num[0];
			for(int i=0;i<sign.size();i++){   // 後計算"+" 和 "-"
				if(sign[i]=='+'){sum += num[i+1]; }
				else {sum -= num[i+1];}
			}
			cout<<sum<<endl;
		}
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章