7,指针用法,计算器代码

#define _STDC_WANT_LIB_EXT1_ 1
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
#define BUF_LEN 256

int main(void)
{
    char buf[BUF_LEN];
    //char number_string[30];
    char op = 0; //操作符
    size_t index = 0;
    size_t to =0;
    size_t buf_length = 0;
    //unsigned int number_length = 0;
    double result = 0.0;
    double number =0.0;
    char *endptr = NULL;
    printf("To use this calculator, enter any expression with"
                                          " or without spaces.");
    printf("\nAn expression may include the operators");
    printf(" +, -, *, /, %%, or ^(raise to a power).");
    printf("\nUse = at the beginning of a line to operate on ");
    printf("\nthe result of the previous calculation.");
    printf("\nEnter quit to stop the calculator.\n\n");

    //1.读入用户输入的字符串,是quit,就退出
    char *ptr =NULL;
    while(true)
    {
        ptr = fgets(buf,BUF_LEN,stdin);
        if(ptr == false)//测试
        {
            printf("Error reading input.\n");
            return 1;
        }

        if(strcmp(buf,"quit\n")==0) break;
        buf_length = strnlen_s(buf,BUF_LEN);
        buf[--buf_length] = ‘\0‘;
        //2.从输入字符串中删除空格
        for(to = 0,index = 0;index<=buf_length;++index)
        {
            if(*(buf+index)!=‘ ‘)
                *(buf+ to++) = *(buf+index);
        }

        buf_length = strnlen_s(buf,BUF_LEN);

        //3.在输入字符串中的开头检查 = 运算符,
        //如果有一个=运算符就把上一个输入字符串的结果作为下一个算数操作的左操作数。查找第一个操作数
        index = 0;
        if(buf[index]==‘=‘)
            index++;
        else
        {
        //4.给下一个算数操作的左操作数提取相应的输入字符,把该字符串转换为double类型
            result = strtod(buf+index,&endptr);//转换并存储数字
            printf("%s\n",endptr);
            index = endptr-buf; //获取下一个字符的索引
        }
        //5.提取算数运算符,记录它。
        while(index < buf_length)
        {
            op = *(buf+index++);
            //6.给右操作数提取相应的输入字符,把该子字符串转换为double类型
            number = strtod(buf+index,&endptr);
            index = endptr - buf;
            //7.执行运算,把结果存储为下一个左操作数
            switch(op)
            {
                case ‘+‘:
                    result += number;
                    break;
                case ‘-‘:
                    result -= number;
                    break;
                case ‘*‘:
                    result *= number;
                    break;
                case ‘/‘:
                    if(number == 0) printf("\n\n\aDivision by zero error!\n");
                    else
                        result /= number;
                    break;
                case ‘%‘:
                    if((long long)number == 0LL) printf("\n\n\aDivision by zero error!\n");
                    else
                        result = (double)((long long)result % (long long)number);
                    break;
                case ‘^‘:
                    result = pow(result,number);
                    break;
                default:
                    printf("\n\n\aIllegal operation!\n");
                    break;
            }
        }

        //8.如果不是字符串的末尾,就返回第6步,如果在字符串的末尾,就返回第一步
        printf("= %f\n",result);
    }
    return 0;
}
时间: 2024-10-10 18:21:07

7,指针用法,计算器代码的相关文章

十进制四则运算计算器代码,输入为字符串

转发个严蔚敏老师的<数据结构及应用算法教程>里的十进制四则运算计算器代码,实习生笔试遇到过不会写,特此做个记录. ************************** 文件:calculator.c ************************** #define NonEmpty 0#define PLUS -1 // '+'#define MINUS -2 // '-'#define ASTERISK -3 // '*' #define SLANT -4 // '/'#define M

C# this指针用法

this指针是什么: 这里有一些面向对象编程的概念需要说明:类(Class)的概念和对象(Object)的概念类是对事物概括,也是C#编码时所有代码归属的基本单位:而对象是对类的实例化,也就是C#里new方法的返回值.写代码是不能直接用操作类,而只能先实例化类,然后我们用这个类被实例化后的对象.通俗一些的说明是,“类”好比是“人”的概念,而我们把类实例化后,就成为单个人的“对象”,例如:“张三”.this就是你的代码所归属的“类”的实例化后的“对象”,也叫当前对象. this指针的几种用法: 1

javascript简单计算器代码分析

javascript简单计算器代码分析:也许网页中需要一个简单的计算器功能,这个时候就要掌握如何编写,起码应该会修改,下面就通过一个简单的实例介绍一下如何实现简单的计算器效果,代码实例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/&

C/C++函数指针用法总结

 C++函数指针 一函数指针介绍 函数指针指向某种特定类型,函数的类型由其参数及返回类型共同决定,与函数名无关.举例如下: int add(int nLeft,int nRight);//函数定义 该函数类型为int(int,int),要想声明一个指向该类函数的指针,只需用指针替换函数名即可: int (*pf)(int,int);//未初始化 则pf可指向int(int,int)类型的函数.pf前面有*,说明pf是指针,右侧是形参列表,表示pf指向的是函数,左侧为int,说明pf指向的函数

&lt;input type="range"&gt;标签用法实例代码

<input type="range">标签用法实例代码: 在HTML5中,又新增许多新<input>控件类型,比较实用的一个就是<input type="range">,以滑竿的方式来调整value值,在这以前需要通过模拟才能够实现,下面就通过代码实例介绍一下它的作用. 代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf

js加减乘除在线计算器代码

js加减乘除在线计算器代码 在线演示本地下载 原文地址:https://www.cnblogs.com/wwhhq/p/8338136.html

C++智能指针用法详解

一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见. 用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法.包括:std::auto_ptr.boost::scoped_ptr.boost::shared_ptr.boost::scoped_array.boost::shared_array.boost:

剑指offer_面试题14_调整数组顺序使奇数位于偶数前面(函数指针用法)

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 1.一般想法,不考虑时间复杂度: 每次遍历数组,碰到一个偶数就拿出来,将后面所有数字向前挪动一位,在将该偶数放到最后. 2.利用冒泡排序的思想,两个指针,一前以后,如果前为偶数,后为奇数,就交换. 算法如下: void Reorder_array(int p[],int length) { if(NULL == p || length <= 0) return; int i

一个比较好的Java写的计算器代码 (转)

1 import java.awt.BorderLayout; 2 import java.awt.Color; 3 import java.awt.GridLayout; 4 import java.awt.event.ActionEvent; 5 import java.awt.event.ActionListener; 6 7 import javax.swing.JButton; 8 import javax.swing.JFrame; 9 import javax.swing.JPan