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语句判断字符串开头的字母并分别处理。为了使未输入字母时也能正确处理,引入了变量\(\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));
}