华为机试——实现一个简单的计算器

题目描述

* 题目:实现一个科学计算器完成基本的计算功能
* 输入描述:加减乘除的输入数据
* 输出描述:计算结果
* 示例:输入:-1*6    输出:-6

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STR_SIZE        2048            /* 定义运算式的最大长度 */
#define STACK_SIZE      512				/* 定义最大运算数字数量 */
#define NUM_SIZE		256

#define FLOAT_CALC						/* 宏开关:是否以浮点形式打印 */

/* 获取运算符后面的数字,以完成当前运算 */
float get_next_num(char* src)
{
    char tmp[NUM_SIZE];
    char* src_tmp = src;
	
    if(NULL == src)
    {
        printf("[Error]:input is error!!!!func:%s line:%d.\n\r",__FUNCTION__,__LINE__);
    }

    memset(tmp,0,sizeof(tmp));
    
    while( (*src_tmp >= '0' && *src_tmp <= '9') || ('.' == *src_tmp))
    {
        src_tmp ++;
    }
    
    memcpy( tmp, src, sizeof(char)*(src_tmp - src+1) );
    return atof(tmp);
}

void calc_func(char* src)
{
    int stack_point = 0;
    float calc_stack[STACK_SIZE];
    float tmp_number = 0;
    int sign_flag = 0;
    
    memset(calc_stack,0,sizeof(calc_stack));
    
    if(NULL == src)
    {
        printf("[Error]:input error!!!func:%s line:%d.\n\r",__FUNCTION__,__LINE__);
        return;
    }
    
    while(*src)
    {
        switch(*src)
        {
            case '*':
                    if(stack_point > 0)
                    {
                        calc_stack[stack_point-1] = calc_stack[stack_point-1]*get_next_num(src+1);
                    }
                    else
                        printf("[Error]:invalid!\n");
        
                    src++;
                    while( (*src <= '9' && *src >= '0') || ('.' == *src))                   
                    /* 跳过下一个数据,从左到右计算高优先级运算符 */
                        src++;
        
                    break;
            case '/':
                    if(stack_point >= 0)
                    calc_stack[stack_point-1] = calc_stack[stack_point-1]/get_next_num(src+1);
        
                    src++;
                    while(*src <= '9' && *src >= '0') 
                   /* 跳过下一个数据,从左到右计算高优先级运算符 */
                            src++;
        
                    break;
            case '-':                       /* 包含两个数字中间的减号和负号 */
                    sign_flag = 1;
                    src++;
                    break;
            case '+':                       /* 加号直接跳过 */
                    src++;
                    break;
            default:
                    if( (*src <= '9' && *src >= '0')||('.'==*src))
                    {
                        char tmp_float_cov[NUM_SIZE];
                        char* src_start = src; 
        
                        while((*src<='9' && *src >= '0')|| '.' == *src)
                                src ++;
        
                        memset(tmp_float_cov,0,sizeof(tmp_float_cov));
                        memcpy(tmp_float_cov,src_start,sizeof(char)*(src-src_start));
                         /* 拷贝长度:数字长度,src_start指向运算符,src指向最后一个数字 */
                        tmp_number = atof(tmp_float_cov);
        
                        if(-1 == tmp_number)
                                printf("[Error]:atof convert error!!\n\r");
                        else
                        {
                            if(sign_flag)
                            {
                                calc_stack[stack_point] = (-1) * tmp_number;
                                sign_flag = 0;
                            }
                            else
                            {
                                calc_stack[stack_point] = tmp_number;
                            }
                            stack_point++;
                        }
                    }
                    else
                    {
                            src++;
                    }
                    break;
        }
    }

    /* 将堆栈所有数据加起来求和 */
    if(stack_point >= 0)
    {
        int i=0;
        tmp_number = 0;
        for(i=0;i<stack_point;i++)
        {
            tmp_number += calc_stack[i];
        }
    }
#ifdef FLOAT_CALC
    printf("%4.6f\n",tmp_number);
#else
	printf("%d\n",(int)tmp_number);
#endif

}

int main(int argc,char *argv[])
{
    char  input[STR_SIZE];

    memset(input,0,sizeof(input));

    scanf("%s",input);

    calc_func(input);

    return 0;
}

代码测试

注意事项:

               计算机的float运算小数最后一位会出错,有运算误差,和手算的不同。

OpenVINO计算视觉—实例实战

11-02
手把手讲授如何搭建成功OpenVINO框架,并且使用预训练模型快速开发超分辨率、道路分割、汽车识别、人脸识别、人体姿态和行人车辆分析。得益于OpenVINO框架的强大能力,这些例子都能够基于CPU达到实时帧率。 课程的亮点在于在调通Demo的基础上更进一步:一是在讲Demo的时候,对相关领域问题进行分析(比如介绍什么是超分辨率,有什么作用)、预训练模型的来龙去脉(来自那篇论文,用什么训练的)、如何去查看不同模型的输入输出参数、如何编写对应的接口参数进行详细讲解;二是基本上对所有的代码进行重构,也就是能够让例子独立出来,并且给出了带有较详细注释的代码;三是注重实际运用,将Demo进一步和实时视频处理框架融合,形成能够独立运行的程序,方便模型落地部署;四是重难点突出、注重总结归纳,对OpenVINO基本框架,特别是能够提高视频处理速度的异步制和能够直接部署解决实际问题的骨骼模型着重讲解,帮助学习理解;五是整个课程准备精细,每一课都避免千篇一律,前一课有对后一课的预告,后一课有对前一课的难点回顾,避免学习过程中出现突兀;六是在适当的时候拓展衍生,不仅讲OpenVINO解决图像处理问题,而且还补充图像处理的软硬选择、如何在手上开发图像处理程序等内容,帮助拓展视野,增强对行业现状的了解。 基本提纲: 1、课程综述、环境配置 2、OpenVINO范例-超分辨率(super_resolution_demo) 3、OpenVINO范例-道路分割(segmentation_demo) 4、OpenVINO范例-汽车识别(security_barrier_camera_demo) 5、OpenVINO范例-人脸识别(interactive_face_detection_demo) 6、OpenVINO范例-人体姿态分析(human_pose_estimation_demo) 7、OpenVINO范例-行人车辆分析(pedestrian_tracker_demo) 8、NCS和GOMFCTEMPLATE 9、课程小结,资源分享
©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值