【九度oj】1019简单计算器

字符串的题目一直做不好,一些知识点掌握不熟练。在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 + 2
4 + 2 * 5 - 7 / 11
0

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 100

using 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 + 2
4 + 2 * 5 - 7 / 11
0
样例输出:
3.00
13.36
#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <stdlib.h>
#define N 201

using 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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值