怎么搞才能让计算的精度提高了

weixin_47641951 2021-03-04 08:04:43
#include <stdio.h>#include<string.h>#include <math.h>#include <stdlib.h>、void start(); /*定义各函数*/void main(){ void a(); void b(); void c(); void d(); void e(); int n; while(n!=6) //界面 { printf (" 请选择你要计算的方法: \n"); printf (" 加法请按_1 \n"); printf (" 减法请按_2 \n"); printf (" 乘法请按_3 \n"); printf (" 除法请按_4 \n"); printf (" 进制转换_5 \n"); printf (" 退出_6 \n"); printf("输入选项代码:"); { // 输入的选项不对 printf(" 请输入正确的数字。\n\n"); } scanf("%d",&n); switch(n) { case 1:a();break; case 2:b();break; case 3:c();break; case 4:d();break; case 5:e();break; case 6:printf("\n*******************谢谢使用!*******************\n");break; break; } } getchar();} /*子函数*/ void a() { // 加法 double x, y, Result; printf (" 请输入被加数:"); scanf ("%lf",&x); printf (" 请输入加数:"); scanf ("%lf",&y); Result = x + y; printf (" 结果是: %lf\n\n",Result); { // 求出结果 printf(" 结果以得。\n\n"); } system ("pause"); //按任意键继续 system ("cls"); //清屏 } /*子函数*/ void b() { // 减法 double x, y, Result; printf (" 请输入被减数:"); scanf ("%lf",&x); printf (" 请输入减数:"); scanf ("%lf",&y); Result =x -y; printf (" 结果是: %lf\n\n",Result); { // 求出结果 printf(" 结果以得。\n\n"); } system ("pause"); //按任意键继续 system ("cls"); //清屏 } /*子函数*/ void c() { // 乘法 double x, y, Result; printf (" 请输入被乘数:"); scanf ("%lf",&x); printf (" 请输入乘数:"); scanf ("%lf",&y); Result =x * y; printf (" 结果是: %lf\n\n",Result); { // 求出结果 printf(" 结果以得。\n\n"); } system ("pause"); //按任意键继续 system ("cls"); //清屏 } /*子函数*/ void d() { // 除法 double x, y, Result; printf (" 请输入被除数:"); scanf ("%lf",&x); printf (" 请输入除数:"); scanf ("%lf",&y); Result =x/ y; printf (" 结果是: %lf\n\n",Result); { // 求出结果 printf(" 结果以得。\n\n"); } system ("pause"); //按任意键继续 system ("cls"); //清屏 } /*子函数*/ void e() { //进制转换的代码 int Ary_10; //定义进制的变量 char string[32]; //二进制变量定义 printf("请输入需要转换的十进制数:"); scanf("%d", &Ary_10); itoa (Ary_10, string ,2); printf("二进制: %s\n", &string); printf("八进制: %o\n", &Ary_10); printf("十六进制: %x\n", &Ary_10); { // 求出结果 printf(" 结果以得。\n\n"); } system ("pause"); //按任意键继续 system ("cls"); //清屏 }
...全文
136 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
源代码大师 2021-05-06
  • 打赏
  • 举报
回复
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html
赵4老师 2021-03-05
  • 打赏
  • 举报
回复
#pragma warning(disable:4996)
/*---------------------------------------
函数型计算器(VC++6.0,Win32 Console)
功能:
目前提供了10多个常用数学函数:
⑴正弦sin
⑵余弦cos
⑶正切tan
⑷开平方sqrt
⑸反正弦arcsin
⑹反余弦arccos
⑺反正切arctan
⑻常用对数lg
⑼自然对数ln
⑽e指数exp
⑾乘幂函数^
⑿向上取整ceil
⒀向下取整floor
⒁四舍五入取整round
⒂取符号sign
⒃取绝对值abs
用法:
如果要求2的32次幂,可以打入2^32<回车>
如果要求30度角的正切可键入tan(Pi/6)<回车>
注意不能打入:tan(30)<Enter>
如果要求1.23弧度的正弦,有几种方法都有效:
sin(1.23)<Enter>
sin 1.23 <Enter>
sin1.23  <Enter>
如果验证正余弦的平方和公式,可打入sin(1.23)^2+cos(1.23)^2 <Enter>或sin1.23^2+cos1.23^2 <Enter>
此外两函数表达式连在一起,自动理解为相乘如:sin1.23cos0.77+cos1.23sin0.77就等价于sin(1.23)*cos(0.77)+cos(1.23)*sin(0.77)
当然你还可以依据三角变换,再用sin(1.23+0.77)也即sin2验证一下。
本计算器充分考虑了运算符的优先级因此诸如:2+3*4^2 实际上相当于:2+(3*(4*4))
另外函数名前面如果是数字,那么自动认为二者相乘.
同理,如果某数的右侧是左括号,则自动认为该数与括弧项之间隐含一乘号。
如:3sin1.2^2+5cos2.1^2 相当于3*sin2(1.2)+5*cos2(2.1)
又如:4(3-2(sqrt5-1)+ln2)+lg5 相当于4*(3-2*(√5 -1)+loge(2))+log10(5)
此外,本计算器提供了圆周率Pi键入字母时不区分大小写,以方便使用。
16进制整数以0x或0X开头。
----------------------------------------*/
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <stdio.h>
#include <string.h>
#include <windows.h>
using namespace std;
const char Tab = 0x9;
const int  DIGIT = 1;
const int MAXLEN = 16384;
char s[MAXLEN], *endss;
int pcs = 15;
double sign(double dVal) {
         if (dVal>0.0) return  1.0;
    else if (dVal<0.0) return -1.0;
    else               return  0.0;
}
double round(double dVal, short iPlaces) {//iPlaces>=0
    char s[30];
    double dRetval;

    sprintf(s, "%.*lf", iPlaces, dVal);
    sscanf(s, "%lf", &dRetval);
    return (dRetval);
}
double fun(double x, char op[], int *iop) {
    while (op[*iop - 1]<32) //本行使得函数嵌套调用时不必加括号,如 arc sin(sin(1.234)) 只需键入arc sin sin 1.234<Enter>
        switch (op[*iop - 1]) {
        case  7: x = sin(x);    (*iop)--; break;
        case  8: x = cos(x);    (*iop)--; break;
        case  9: x = tan(x);    (*iop)--; break;
        case 10: x = sqrt(x);   (*iop)--; break;
        case 11: x = asin(x);   (*iop)--; break;
        case 12: x = acos(x);   (*iop)--; break;
        case 13: x = atan(x);   (*iop)--; break;
        case 14: x = log10(x);  (*iop)--; break;
        case 15: x = log(x);    (*iop)--; break;
        case 16: x = exp(x);    (*iop)--; break;
        case 17: x = ceil(x);   (*iop)--; break;
        case 18: x = floor(x);  (*iop)--; break;
        case 19: x = round(x,0);(*iop)--; break;
        case 20: x = sign(x);   (*iop)--; break;
        case 21: x = fabs(x);   (*iop)--; break;
        }
    return x;
}
double calc(char *expr, char **addr) {
    static int deep; //递归深度
    static char *fname[] = { "sin","cos","tan","sqrt","arcsin","arccos","arctan","lg","ln","exp","ceil","floor","round","sign","abs",NULL };
    double ST[10] = { 0.0 }; //数字栈
    char op[10] = { '+' }; //运算符栈
    char c, *rexp, *pp, *pf;
    int ist = 1, iop = 1, last, i, n;
    __int64 i64;

    if (!deep) {
        pp = pf = expr;
        do {
            c = *pp++;
            if (c != ' '&& c != Tab)
                *pf++ = c;
        } while (c != '\0');
    }
    pp = expr;
    if ((c = *pp) == '-' || c == '+') {
        op[0] = c;
        pp++;
    }
    last = !DIGIT;
    while ((c = *pp) != '\0') {
        if (c == '(') {//左圆括弧
            deep++;
            ST[ist++] = calc(++pp, addr);
            deep--;
            ST[ist - 1] = fun(ST[ist - 1], op, &iop);
            pp = *addr;
            last = DIGIT;
            if (*pp == '(' || isalpha(*pp) && strnicmp(pp, "Pi", 2)) {//目的是:当右圆括弧的右恻为左圆括弧或函数名字时,默认其为乘法
                op[iop++] = '*';
                last = !DIGIT;
                c = op[--iop];
                goto operate;
            }
        }
        else if (c == ')') {//右圆括弧
            pp++;
            break;
        }
        else if (isalpha(c)) {
            if (!strnicmp(pp, "Pi", 2)) {
                if (last == DIGIT) {
                    wcout <<    L"π左侧遇)" << endl; exit(1);
                }
                ST[ist++] = 3.14159265358979323846264338328;
                ST[ist - 1] = fun(ST[ist - 1], op, &iop);
                pp += 2;
                last = DIGIT;
                if (!strnicmp(pp, "Pi", 2)) {
                    wcout <<    L"两个π相连" << endl; exit(2);
                }
                if (*pp == '(') {
                    wcout <<    L"π右侧遇(" << endl; exit(3);
                }
            }
            else {
                for (i = 0; (pf = fname[i]) != NULL; i++)
                    if (!strnicmp(pp, pf, strlen(pf))) break;
                if (pf != NULL) {
                    op[iop++] = 07 + i;
                    pp += strlen(pf);
                }
                else {
                    wcout <<    L"陌生函数名" << endl; exit(4);
                }
            }
        }
        else if (c == '+' || c == '-' || c == '*' || c == '/' || c == '%' || c == '^') {
            char cc;
            if (last != DIGIT) {
                wcout <<    L"运算符粘连" << endl; exit(5);
            }
            pp++;
            if (c == '+' || c == '-') {
                do {
                    cc = op[--iop];
                    --ist;
                    switch (cc) {
                    case '+':  ST[ist - 1] += ST[ist]; break;
                    case '-':  ST[ist - 1] -= ST[ist]; break;
                    case '*':  ST[ist - 1] *= ST[ist]; break;
                    case '/':  ST[ist - 1] /= ST[ist]; break;
                    case '%':  ST[ist - 1] = fmod(ST[ist - 1], ST[ist]); break;
                    case '^':  ST[ist - 1] = pow(ST[ist - 1], ST[ist]); break;
                    }
                } while (iop);
                op[iop++] = c;
            }
            else if (c == '*' || c == '/' || c == '%') {
            operate:        cc = op[iop - 1];
                if (cc == '+' || cc == '-') {
                    op[iop++] = c;
                }
                else {
                    --ist;
                    op[iop - 1] = c;
                    switch (cc) {
                    case '*':  ST[ist - 1] *= ST[ist]; break;
                    case '/':  ST[ist - 1] /= ST[ist]; break;
                    case '%':  ST[ist - 1] = fmod(ST[ist - 1], ST[ist]); break;
                    case '^':  ST[ist - 1] = pow(ST[ist - 1], ST[ist]); break;
                    }
                }
            }
            else {
                cc = op[iop - 1];
                if (cc == '^') {
                    wcout <<    L"乘幂符连用" << endl; exit(6);
                }
                op[iop++] = c;
            }
            last = !DIGIT;
        }
        else {
            if (last == DIGIT) {
                wcout <<    L"两数字粘连" << endl; exit(7);
            }
            if (pp[0] == '0' && (pp[1] == 'x' || pp[1] == 'X')) {
                sscanf(pp + 2, "%I64x%n", &i64, &n);
                rexp = pp + 2 + n;
                ST[ist++] = (double)i64;
            }
            else ST[ist++] = strtod(pp, &rexp);
            ST[ist - 1] = fun(ST[ist - 1], op, &iop);
            if (pp == rexp) {
                wcout <<    L"非法字符" << endl; exit(8);
            }
            pp = rexp;
            last = DIGIT;
            if (*pp == '(' || isalpha(*pp)) {
                op[iop++] = '*';
                last = !DIGIT;
                c = op[--iop];
                goto operate;
            }
        }
    }
    *addr = pp;
    if (iop >= ist) {
        wcout <<    L"表达式有误" << endl; exit(9);
    }
    while (iop) {
        --ist;
        switch (op[--iop]) {
        case '+':  ST[ist - 1] += ST[ist]; break;
        case '-':  ST[ist - 1] -= ST[ist]; break;
        case '*':  ST[ist - 1] *= ST[ist]; break;
        case '/':  ST[ist - 1] /= ST[ist]; break;
        case '%':  ST[ist - 1] = fmod(ST[ist - 1], ST[ist]); break;
        case '^':  ST[ist - 1] = pow(ST[ist - 1], ST[ist]); break;
        }
    }
    return ST[0];
}
int main(int argc, char **argv) {
    int a;

    wcout.imbue(locale("chs"));
    if (argc<2) {
        //if (GetConsoleOutputCP() != 936) system("chcp 936>NUL");//中文代码页
        wcout <<    L"计算函数表达式的值。" << endl << L"支持(),+,-,*,/,%,^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp,ceil,floor,round,sign,abs" << endl;
        while (1) {
            wcout <<    L"请输入表达式:";
            fgets(s,16384,stdin);
            if ('\n' == s[strlen(s)-1]) s[strlen(s) - 1] = 0;
            if (s[0] == 0) break;//
            cout << s << "=";
            cout << setprecision(15) << calc(s, &endss) << endl;
        }
    }
    else if (argc == 2 && 0 == strcmp(argv[1], "/?")) {
        //if (GetConsoleOutputCP() != 936) system("chcp 936>NUL");//中文代码页
        wcout <<    L"计算由≥1个命令行参数给出的函数表达式的值。\n"
            "最后一个参数是.0~.15表示将计算结果保留小数0~15位\n"
            "最后一个参数是x表示将计算结果以16进制正整数格式输出\n"
            "支持(),+,-,*,/,%,^^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp,ceil,floor,round,sign,abs\n"
            "16进制整数以0x或0X开头\n";
    }
    else {
        strncpy(s, argv[1], MAXLEN - 1); s[MAXLEN - 1] = 0;
        if (argc>2) {
            for (a = 2; a<argc - 1; a++) strncat(s, argv[a], MAXLEN - 1);//将空格间隔的各参数连接到s
            if (1 == sscanf(argv[a], ".%d", &pcs) && 0 <= pcs && pcs <= 15) {//最后一个参数是.0~.15表示将计算结果保留小数0~15位
                printf("%.*lf\n", pcs, calc(s, &endss));
            }
            else if (argv[a][0] == 'x' || argv[a][0] == 'X') {//最后一个参数是x表示将计算结果以16进制正整数格式输出
                printf("0x%016I64x\n", (__int64)calc(s, &endss));
            }
            else {
                strncat(s, argv[a], MAXLEN - 1);
                printf("%.15lg\n", calc(s, &endss));
            }
        }
        else {
            printf("%.15lg\n", calc(s, &endss));
        }
    }
    return 0;
}

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧