字符串提取

题意:给出一段字符串,其中包含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 ;
}
*/

原文地址:https://www.cnblogs.com/NYNU-ACM/p/4236882.html