P1957 口算练习题

分析

这道题乍一看好像很复杂,但其实主要难点只在于处理读入的字符串。
我们不妨先忽略处理的详细过程,分别以函数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语句判断字符串开头的字母并分别处理。为了使未输入字母时也能正确处理,引入了变量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));
}
posted @   sleepwind  阅读(105)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示