【九度oj】1019简单计算器

来源:互联网 发布:淘宝十大男模特 编辑:程序博客网 时间:2024/04/30 07:30

字符串的题目一直做不好,一些知识点掌握不熟练。在1019的坑里绕了一天,终于AC!


整理一下关于字符串的点~~(持续更新)


一、输入问题

1,最简单的一种:事先输入n,规定了用例组数;输入字符串中间没有空格或者空格是可预知的。这时对字符串通常用字符数组char [],操作比string类型方便:

    int n;    cin >> n;    while(n--){        char str[N] = " "; //最好初始化,否则循环时可能对以后的数据有影响,不知道为什么        cin >> str;    }

比如九度1013,开门人关门人,输入为

EE301218 08:05:35 20:56:35

2,输入多组字符串,输入字符串中间有空格,直到遇到规定结尾。这时不能用字符数组char [],只能用string 和getline:

    string str;    while(getline(cin, str)){        if(str == "规定结尾") break;            }

比如1019,简单计算器,输入为

1 + 24 + 2 * 5 - 7 / 110

3,其他,不是正常情况,只列出代码和运行结果:

int main(){    char str[N];    while(scanf(" %s", str) != EOF){        cout << str;    }    return 0;}

结果:

输入:12 34 hhh aaa, b 

输出:1234hhhaaa,b

二、字符数组char []常用方法

1,长度 strlen(str)


三、字符串string常用方法

1,长度 str.size()或str.length()


四、vector<type>常用方法

1,添加到末尾str.push_back()

2,弹出末尾元素str.pop_back()

3,清空str.clear()


五、字符和数字转化(整型或浮点型)

字符转数字

1,单个数字:str[i] - '0'

2,字符串(参数为const char *,不能是string哦):atoi(str)(头文件<stdlib.h>)

数字转字符

3,snprintf(str, "%d", 123)


六、切分,以空格或其他字符(可以多个)切分字符串,并加入vector<string>

#include <cstdio>#include <cstring>#include <vector>#include <iostream>#define N 100using namespace std;int main(){    string str;    char str0[N];    vector<string> ans;        getline(cin, str);    for(int i = 0; i < str.size(); i++){        str0[i] = str[i];    }    char *sep = " "; //如果以多个符号切分,直接加入即可,如",+"    char *p;    p = strtok(str0, sep); //char * strtok(char *s, const char *delim)    while(p){        ans.push_back(p);        p = strtok(NULL, sep);//strtok固定用法,第一次p = strtok(str0, sep);第二次 p = strtok(NULL, sep);    }    for(int i = 0; i < ans.size(); i++){        cout << "ans[" << i << "] = " << ans[i] << endl;    }    return 0;}

结果:

输入:abc de 123

输出:
ans[0] = abc
ans[1] = de
ans[2] = 123

最后,贴一下1019的题目和自己的做法,已AC,欢迎批评指正~


题目描述:
    读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入:
    测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出:
    对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
样例输入:
1 + 24 + 2 * 5 - 7 / 110
样例输出:
3.0013.36
#include <cstdio>#include <iostream>#include <cstring>#include <vector>#include <stdlib.h>#define N 201using namespace std; main(){    string str;    while(getline(cin, str)){        if(str == "0") break;        char str0[N] = " ";        for(int i = 0; i < str.size(); i++){ //将string转移到char[]中            str0[i] = str[i];        }                vector<double> num;  //num中存放数字        vector<char> sf;     //sf中存放+、-号, * 和 / 在遍历时就直接计算出来        double ans;        double a, b;        char *sep = " ";     //以空格切分字符串,同时计算乘除        char *p;        p = strtok(str0, sep);        while(p){            if(p[0] == '+' || p[0] == '-'){                sf.push_back(p[0]);            }else if(strcmp(p, "*") == 0){                a = num[num.size() - 1];                num.pop_back();                p = strtok(NULL, sep);                num.push_back(a * atof(p));            }else if(strcmp(p, "/") == 0){                a = num[num.size() - 1];                num.pop_back();                p = strtok(NULL, sep);                num.push_back(a / atof(p));            }else{                num.push_back(atof(p));            }            p = strtok(NULL, sep);        }        ans = num[0];        int k = 0;        for(int i = 1; i < num.size(); i++){ //再遍历num和sf,此时只要顺序计算加减法            if(sf[k] == '+'){                ans = ans + num[i];            }else if(sf[k] == '-'){                ans = ans - num[i];            }            k++;        }        printf("%.2f\n", ans);    }    return 0;}



0 0
原创粉丝点击