P1957 口算练习题

发布时间 2023-08-03 10:14:02作者: sleepwind

分析

这道题乍一看好像很复杂,但其实主要难点只在于处理读入的字符串。
我们不妨先忽略处理的详细过程,分别以函数\(a1,a2,a3\)代替加,减,乘,先把总体过程写出来。

点击查看代码
char cf[100];
int kd, i, a, b, c;
void a1(), a2(), a3();
int main() {
    scanf("%d\n", &i);
    for (int j=0; j<i; j++) {
        fgets(cf, sizeof(cf), stdin);
        switch (cf[0]) {
        case 'a':
            kd=1;
            a1();
            break;
        case 'b':
            kd=2;
            a2();
            break;
        case 'c':
            kd=3;
            a3();
            break;
        default:
            if (kd==1) a1();
            if (kd==2) a2();
            if (kd==3) a3();
            break;
        }
    }
    return 0;
}

这里使用fgets()读入一行字符串,通过switch语句判断字符串开头的字母并分别处理。为了使未输入字母时也能正确处理,引入了变量\(\textup{kd}\)记录上一次的运算方法。

接下来就是处理字符串了。

处理字符串需要用到<cstring>库中的两个函数:

ssacnf()	//从字符串中读入信息,类似scanf()
sprintf()	//向字符串中输出信息,类似printf()

如果输入的字符串都是数字,可以使用sscanf()函数从字符串中读入数字:

sscanf(cf, "%d%d", &a, &b);

当字符串中有字母时,就要将字母变为”空“,这样scanf()读入时就会自动忽略。
得到了数字,就方便求得算式了。但题目又要求输出算式长度。这时可以利用sprintf()函数将算式输入到字符串中,再用strcpy()得到长度

对于加法,代码如下:

void a1() {//加法处理函数
    if (cf[0]=='a') cf[0]=' ';
    sscanf(cf, "%d%d", &a, &b);
    sprintf(cf, "%d+%d=%d", a, b, a+b);
    printf("%s\n%d\n", cf, strlen(cf));
}

代码

#include <iostream>
#include <cstring>

char cf[100];
int kd, i, a, b, c;
void a1(), a2(), a3();
int main() {
    scanf("%d\n", &i);
    for (int j=0; j<i; j++) {
        fgets(cf, sizeof(cf), stdin);
        switch (cf[0]) {
        case 'a':
            kd=1;
            a1();
            break;
        case 'b':
            kd=2;
            a2();
            break;
        case 'c':
            kd=3;
            a3();
            break;
        default:
            if (kd==1) a1();
            if (kd==2) a2();
            if (kd==3) a3();
            break;
        }
    }
    return 0;
}

void a1() {
    if (cf[0]=='a') cf[0]=' ';
    sscanf(cf, "%d%d", &a, &b);
    sprintf(cf, "%d+%d=%d", a, b, a+b);
    printf("%s\n%d\n", cf, strlen(cf));
}

void a2() {
    if (cf[0]=='b') cf[0]=' ';
    sscanf(cf, "%d%d", &a, &b);
    sprintf(cf, "%d-%d=%d", a, b, a-b);
    printf("%s\n%d\n", cf, strlen(cf));
}

void a3() {
    if (cf[0]=='c') cf[0]=' ';
    sscanf(cf, "%d%d", &a, &b);
    sprintf(cf, "%d*%d=%d", a, b, a*b);
    printf("%s\n%d\n", cf, strlen(cf));
}