三做一年级算术题-吐槽挖雷

本文介绍了如何使用C语言处理复杂输入,包括一位正整数、运算符和等号,以找到最大值和最小值并进行运算。作者分享了使用cin.get()读取输入,遍历字符串并处理数字和运算符的思路,同时提供了错误检查和数值运算的实现。代码中包含了查找最大值和最小值的函数,以及处理除法和取模时的错误情况。
摘要由CSDN通过智能技术生成

        我已经骂不动这题了,不论是这一年级就会做的取模还有隐藏案例里面的无脑示例,不得不说,这道题算是比较恶心的题目了。(主要使用C语言)

题目如下:

        两个一年级小朋友在一起玩游戏,小明给出一堆一位的正整数和运算要求(+、-、*、/、%),小丽要找出这些整数中的最大值和最小值,然后按照小明的要求算出最大数与最小数进行算术运算的结果。

输入:
    用逗号分隔的一位正整数序列,及其运算符和等号

输出:
    最大数 op 最小数=结果   

并且题目给出的示例的输入只使用一次回车,所以只允许读入一次数据

例:5,1,1,2,0,3,+,=↵        5+0=5↵

        首先是我做这道题的大思路:关于数据的读入,scanf无法满足这道题的输入量,走投无路,我也想不到更好的、更简单的方法,我只能用C++的库函数,如果有大佬们有更好的方法,欢迎在评论区告诉我和其他人。

        我选择的是 cin.get 函数,可以读取输入流中的数据,然后写入到指定的数组中。

char a[60]={0};
cin.get(a,60);

        这句话的意思就是:读取六十个字符写入到创建的数组 a 中去。

对于这个字符串 a,遍历每一个字符,将数字读入数组中,将运算符单独存储,后面switch即可

关于遍历字符串:

有几个点必须要说明,特别是学C不久的同学们:

        (1)isdigit函数:判断一个字符是否是十进制数,即是否是0~9,如果是的话就直接将他从ASCII码转成数字存到数组中去

        (2)如果是两位数,则需要判断上后一位,然后相应的乘十调整,理论上还需要考虑三位数等更多位,由于题目的案例中没有,我直接偷懒。(正常的话需要一个while一直读入isdight为真的数值)

        (3)current这一个标志的使用,算是给固定数组的元素个数做铺垫,由于是不定的数组输入,所以需要在数组中找值的范围也是变化的,于是就需要这个变量来固定查找范围。

    while(a[i]!='\0'&&a[i]!='=')
    {
    	if(a[i]==',')  // 逗号跳过
    	{
    		i++;
    		continue;
		}
    	else if(isdigit(a[i])&&(!isdigit(a[i+1])))
    	{
    		b[current]=a[i]-'0';    //调整数据类型至整型数字
    		current++;
			i++;
		}
		else if(isdigit(a[i])&&(isdigit(a[i+1])))
		{
			b[current]=(a[i]-'0')*10+(a[i+1]-'0');   // 两位数的数字读取
			current++;
			i+=2;
		}
		else if(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'||a[i]=='%')
		{
			signal=a[i];     // 操作符的读取
			i++;
		}
	}

查找数组最大值和最小值,我设置了两个函数,其中就用到了刚才的current:

        正常的一次遍历,然后在固定范围内查找最大(小)值,这里的size均会调用刚才的current变量的值。然后b就是数组,传址调用。

int findmax(int*b,int size)   // 找最大数
{
	int i=0;
	int max=b[0];
	for(i=1;i<size;i++)
	{
		if(b[i]>max)
		{
			max=b[i];
		}
	}
	return max;
}

int findmin(int*b,int size)   // 找最小数
{
	int i=0;
	int min=b[0];
	for(i=1;i<size;i++)
	{
		if(b[i]<min)
		{
			min=b[i];
		}
	}
	return min;
}

最后就是数值运算:

        在这里需要注意两个点:取模和除的第二个操作数都不能是0,显然案例没有考虑前者,但是在做题的时候,不能忘记讨论。

	if(current<2)   // 理论上输入数少于两个也需要报错
	{
		printf("Error!\n");
		goto end;
	}
	if((signal=='/'||signal=='%')&&b1==0)
	{
		printf("Error!\n");
		goto end;
	}

顺带吐槽一下雷点:这第五个案例卡我半天,竟是输入了大于等于八个数字,难蚌

在这里附上完整的代码,仅供参考:

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
#include<math.h>
#include <iostream>
using namespace std;
int findmax(int*b,int size)
{
	int i=0;
	int max=b[0];
	for(i=1;i<size;i++)
	{
		if(b[i]>max)
		{
			max=b[i];
		}
	}
	return max;
}
int findmin(int*b,int size)
{
	int i=0;
	int min=b[0];
	for(i=1;i<size;i++)
	{
		if(b[i]<min)
		{
			min=b[i];
		}
	}
	return min;
}
int main()
{ 
    char a[60]={0};
    int current=0;
    int b[20]={0};
    int i=0;
    cin.get(a,60);
    char signal='?';
    int a1=0;
    int b1=0;
    while(a[i]!='\0'&&a[i]!='=')
    {
    	if(a[i]==',')
    	{
    		i++;
    		continue;
		}
    	else if(isdigit(a[i])&&(!isdigit(a[i+1])))
    	{
    		b[current]=a[i]-'0';
    		current++;
			i++;
		}
		else if(isdigit(a[i])&&(isdigit(a[i+1])))
		{
			b[current]=(a[i]-'0')*10+(a[i+1]-'0');
			current++;
			i+=2;
		}
		else if(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'||a[i]=='%')
		{
			signal=a[i];
			i++;
		}
	}
	int sz=current;
	a1=findmax(b,current);
	b1=findmin(b,current);
	if(current<2)
	{
		printf("Error!\n");
		goto end;
	}
	if((signal=='/'||signal=='%')&&b1==0)
	{
		printf("Error!\n");
		goto end;
	}
	switch (signal)
	{
		case '+':printf("%d+%d=%d\n",a1,b1,a1+b1);break;  
        case '-':printf("%d-%d=%d\n",a1,b1,a1-b1);break;  
        case '*':printf("%d*%d=%d\n",a1,b1,a1*b1);break;  
        case '/':printf("%d/%d=%d\n",a1,b1,a1/b1);break; 
		case '%':printf("%d%%%d=%d\n",a1,b1,a1%b1);break;
		default:
			printf("Error!\n");
	}
	end:
    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值