题解 P1957 【口算练习题】

· · 题解

作为一个蒟蒻,我之前仿佛没有看见有用字符串函数做的…

----------------------------------------------------我假装这是条分割线---------------------------------------------------------

在此隆重推出

#include <cctype>

这是一个拥有许多字符串处理函数声明的头文件,这些函数可以用来对单独字符串进行分类和转换;

例如:

isalpha():检查这个字符是否为字母,真返回1,假返回0;

isalnum():检查这个字符是否为字母或数字数字,同上;

isdigit():检查这个字符是否为十进制数字,同上;

islower():检查这个字符是否为小写字母,同上;

剩下自己百度去吧~~逃……

----------------------------------------------------我假装这还是条分割线------------------------------------------------------

现在来看一下这道题:

1.输入

因为这道题输入要求为“接着的i行为需要输入的算式,每行可能有三个数据或两个数据。” 因为不确定第一个数据的类型,所以要用

字符串!字符串!字符串!

为了快一点 我用了scanf:

for(int i=1; i<=n; i++) {
        scanf("%s",&ss);}

2.处理

已经输入了之后,第一步要判断是“三个数据”还是“两个数据”;

而它的标志是什么呢,就是输入的字符串的第一个字符!

一定记住是ss[0]!! 因为这个,样例卡了一刻钟……

判断它是否是个字母,cctype就可以派上用场了:

if(isalpha(ss[0])) {
    k=ss[0];
    scanf("%d%d",&x,&y);
}

如果不是呢,之前的许多大佬都用过:

atoi ((表示 ascii to integer)是把字符串转换成整型数的一个函数)

直接将输入的字符串转成整数,再输入第二个数就可以啦:

else {
    x=atoi(ss);
    scanf("%d",&y);
}

3.输出

题目要求我们输出这个输出的算式的长度,怎么办呢?

在此向大家推出:

sprintf()

或许看起来很像printf?实际上,他只比printf多一个参数,一个字符串!

没错,他就是一个将数据输入字符串的函数!

那长度直接输出ans的长度就可以啦。

代码:

if(k=='a')
    sprintf(ans,"%d+%d=%d",x,y,x+y);
else if(k=='b')
    sprintf(ans,"%d-%d=%d",x,y,x-y);
else
    sprintf(ans,"%d*%d=%d",x,y,x*y);
printf("%s\n%d\n",ans,strlen(ans));

4.代码


//具体细节前面都有讲
#include <cctype>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
int n,x,y;
char ss[20],ans[100],k;
int main() {
    scanf("%d",&n);
    for(int i=1; i<=n; i++) {
        scanf("%s",&ss);
        if(isalpha(ss[0])) {
            k=ss[0];
            scanf("%d%d",&x,&y);
        } else {
            x=atoi(ss);
            scanf("%d",&y);
        }
        if(k=='a')
            sprintf(ans,"%d+%d=%d",x,y,x+y);
        else if(k=='b')
            sprintf(ans,"%d-%d=%d",x,y,x-y);
        else
            sprintf(ans,"%d*%d=%d",x,y,x*y);
        printf("%s\n%d\n",ans,strlen(ans));
    }
    return 0;//完美结束!
}```

逃……