洛谷-P1957-口算练习题

口算练习题 - 洛谷


解题思路:

1.分析题意,有50%的数据时每行都有三个输入数据的,意思为可以去定义一个字符变量和两个整数变量,每行输入三个变量,然后根据输入的两个数和字符类型计算出结果,打印出来,如何判断长度,只需要创建一个数位分离的函数判断每个数的长度即可求出来整行的长度,这是50分的做法

2.如果是满分做法,需要利用sscanf和sprintf函数的功能,sscanf可以从一个字符串中读取固定格式的信息并存储下来,而sprintf能把一个信息按照固定的格式打印到某个字符串中(需要注意:这两个函数只能对字符数组进行操作)

sscanf的用法:

sscanf(字符串,占位符类型,&变量名)

      例如:char a[100]="023";  int num;

                  sscanf(a,"%d",&num);//将字符串a以整数的形式读取并将结果存到num中,此时num为23,有自动去除前导0的功能

                  int num2=45;

                  sprintf(a,"%d",num2)//将num2中的整数打印到字符串a中

3.理解了这个函数后,我们便可以先输入一个字符串s,然后对s[0]进行判断,如果是字符,说明是操作符,将这个字符串赋值给一个字符变量ans,然后再读入两个数,根据字符变量的值对这两个数进行操作,然后按照固定格式把他们计算的结果打印到字符数组b中,打印,并输出长度strlen(b)即可

4.如果输入的第一个s[0]是数字,那么将这个字符数组打印到整型数字中,再输入一个整数,进行操作,此时字符变量ans还是保留着上一个操作符的值,也就完美实现了与上一题运算符类型相同的问题。


#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,num1,num2,num3;//存放两个数字还有计算结果 
	char ans;//存放第一个作为运算符的字母 
	char a[100],b[100];
	cin>>n;

	for(int i=1;i<=n;i++)//执行n次循环 
	{
		cin>>a;//输入第一个字符数组 

		if(a[0]>='a'&&a[0]<='c')//如果首个字符是字母 
		{
			ans=a[0];
			cin>>num1>>num2;//再输入两个操作数 
		}
		else//如果首个字符不是字母的话 
		{
			sscanf(a,"%d",&num1);//将a以整数的形式读入num1 
			cin>>num2;//再输入一个数字 
		}

		memset(b,0,sizeof(b)); //每次都清空数组b 

		if(ans=='a')//当字符为a时,表示加法运算 
		{
			num3=num1+num2;//计算两数相加的结果 
			sprintf(b,"%d+%d=%d",num1,num2,num3);//按照固定格式打印到数组b中 
		}
		else if(ans=='b')//当字符为b时,表示减法运算 
		{
			num3=num1-num2;//计算两数相减的结果 
			sprintf(b,"%d-%d=%d",num1,num2,num3);//按照固定格式打印到数组b中 
		}
		else//如果字符是c时,表示乘法运算 
		{
			num3=num1*num2;//计算两数相乘的结果 
			sprintf(b,"%d*%d=%d",num1,num2,num3);//按照固定格式打印到数组b中 
		}

		cout<<b<<endl;//输出字符串b 
		cout<<strlen(b)<<endl; //输出字符串b的长度 
	}
	return 0;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值