题意:给出一段字符串,其中包含P、U、I中两个变量的值,通过公式P=U*I的转换,求出第三个变量的值。
通过以下步骤解决该问题:
1、查找到第一个“=”字符,该字符的左边为变量名,右边为变量的值;
2、用字符变量a来记录第一个“=”左边的变量名,用整型变量A记录“=”右边的数值;
3、“=”右边每取一个整数,加到A上之前,A都要先乘以10;
4、如果遇到小数点“.”,小数点右边每取一个整数,加到A上之前,该整数要先除以(10^j),j为该整数距离小数点的位数;
5、判断数值A后面的单位,如果为m,A = A / 1000 ; 如果为k,A = A * 1000 ; 如果为M,A = A * 1000000 ;
6、用相同的方法查找第二个“=”字符,记录该字符左边的变量名及右边的数值;
7、判断变量名称,计算出第三个变量的值;
相应代码如下:
#include <iostream> #include <stdio.h> #include <string.h> #include <string> using namespace std ; int main() { int n , t = 1 ; cin >> n ; getchar() ; while(n--) { char s[1000] ; gets(s) ; char a , b ; double A = 0.0 , B = 0.0 ; int temp = 0 ; for(int i = 0 ; s[i+1] ; i++) { if(temp == 0 && s[i] == '=') { a = s[i-1] ; i++ ; while(s[i] >= '0' && s[i] <= '9') { A *= 10 ; A += (s[i]-'0') ; i++ ; } if(s[i]=='.') { i++ ; int j = 10 ; while(s[i] >= '0' && s[i] <= '9') { A += (double)((s[i]-'0')/j); j *= 10 ; i++ ; } } if(s[i] == 'm') A /= 1000 ; else if(s[i] == 'k') A *= 1000 ; else if(s[i] == 'M') A *= 1000000 ; temp = 1 ; } else if(temp == 1 && s[i] == '=') { b = s[i-1] ; i++ ; while(s[i] >= '0' && s[i] <= '9') { B *= 10 ; B += (s[i]-'0') ; i++ ; } if(s[i]=='.') { i++ ; int j = 10 ; while(s[i] >= '0' && s[i] <= '9') { B += (double)((s[i]-'0')/(1.0*j)); j *= 10 ; i++ ; } } if(s[i] == 'm') B /= 1000 ; else if(s[i] == 'k') B *= 1000 ; else if(s[i] == 'M') B *= 1000000 ; break ; } } printf ("Problem #%d ",t++); if(a=='U'&&b=='I') printf("P=%.2fW ",A*B) ; else if(a=='I'&&b=='U') printf("P=%.2fW ",A*B) ; else if(a=='P'&&b=='U') printf("I=%.2fA ",A/B) ; else if(a=='U'&&b=='P') printf("I=%.2fA ",B/A) ; else if(a=='P'&&b=='I') printf("U=%.2fV ",A/B) ; else if(a=='I'&&b=='P') printf("U=%.2fV ",B/A) ; printf(" ") ; } return 0 ; }
下面介绍另外一种解法,利用find函数进行查找,atof进行转换:
1、利用find函数,查找第一个字符“=”的位置;
2、记录”=”左边的字符;
3、记录”=“右边数字字符和字符”.“;
4、判断数据的单位;
5、利用c_str()函数和atof函数进行相应转换,将字符串转换成float类型数据;
6、通过相应计算输出所需结果;
相应代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <string> #include <cctype> #include <iostream> using namespace std; #define MAXN 105 string buf; bool p ; double getValue(int loc){ int i; string val; double c = 1; for(i=loc+1; i<buf.length(); i++){ if(isdigit(buf[i]) || buf[i]=='.'){ val += buf[i]; } else if(buf[i] == 'm'){ c = 1e-3; } else if(buf[i] == 'k'){ c = 1e3; } else if(buf[i] == 'M'){ c = 1e6; } else{ break; } } double ret = atof(val.c_str())*c; //val.c_str(),将val从string类型转化为字符数组类型,atof把字符串转化成浮点数 if(ret == 0){ ret = 0; } return ret; } void play(){ int loc1 = buf.find("="); //查找第一个字符"="的位置 int loc2 = buf.find("=", loc1+1); //查找第二个字符"="的位置 bool useU = false, useI = false, useP = false; double U = 0, I = 0, P = 0; switch (buf[loc1-1]) { case 'U': U = getValue(loc1); useU = true; break; case 'I': I = getValue(loc1); useI = true; break; case 'P': P = getValue(loc1); useP = true; break; } switch (buf[loc2-1]) { case 'U': U = getValue(loc2); useU = true; break; case 'I': I = getValue(loc2); useI = true; break; case 'P': P = getValue(loc2); useP = true; break; } if(!useU){ printf("U=%.2lfV ", (P/I)); } else if(!useI){ printf("I=%.2lfA ", (P/U)); } else if(!useP){ printf("P=%.2lfW ", (U*I)); } printf(" "); } int main(){ int n; scanf("%d", &n); getchar(); for(int i=0; i<n; i++){ getline(cin, buf); printf("Problem #%d ", i+1); play(); p = true; } } /* #include<iostream> #include<stdio.h> #include<string.h> #include<stdlib.h> using namespace std ; int main() { string s = "1.234566" ; float f ; char c_s[20] ; strcpy(c_s , s.c_str()) ; printf("%s ",c_s) ; return 0 ; } */ /* #include<iostream> #include<stdio.h> #include<string.h> #include<stdlib.h> using namespace std ; int main() { string s = "1.234566.9999" ; int loc = s.find(".") ; int locc = s.find(".",loc+1) ; printf("%d ",locc) ; return 0 ; } */