zoukankan      html  css  js  c++  java
  • 字符串提取

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

  • 相关阅读:
    客户端及服务端_终端模拟
    安装-homebrew
    客户端及服务端_网页访问
    python server搭建
    ping不通localhost但是可以ping通ip地址
    CentOS7 修改Jenkins以root用户运行
    tomcat配置外部静态资源映射路径(windows和Linux部署)
    Centos 6.10 安装 Jenkins
    axios ios 微信浏览器session问题
    微信公众号 分享接口 签名通过 分享无效果(JSSDK自定义分享接口的策略调整)
  • 原文地址:https://www.cnblogs.com/NYNU-ACM/p/4236882.html
Copyright © 2011-2022 走看看