【问题标题】:C Calculator with a lot of functions in functions in functions函数中函数有很多函数的C计算器
【发布时间】:2014-08-20 08:46:21
【问题描述】:

我首先编写了一个简单的计算器。现在我想将 Functions 中的各个程序组件外包出去。问题是开关部分。程序总是给我默认消息:坏操作员。请看一下,给我一些提示。指针和双指针有问题吗?

这是我的代码:

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>

void newcalc(char*,double*,char*,double*);
double switchfunk(double**, char**, double**);
double readcalc(double**,char**,double**);
double addition(double,double);
double subtraction(double,double);
double multiplication(double,double);
double division(double,double);

int main()
{
    double a=0, b=0;
    char op='R', restart = 'Y';
    newcalc(&restart,&a,&op,&b);
    fflush(stdin);
    getchar();
    return 0;
}

double switchfunk(double** x, char** opp, double** y)
{
    printf("\n ---CALCULATOR--- \n\n\n");
    switch (**opp)
    {
        case '+':printf("%lf + %lf = %lf\n", **x, **y, addition(**x, **y)); break;
        case '-':printf("%lf - %lf = %lf\n", **x, **y, subtraction(**x, **y)); break;
        case '*':printf("%lf * %lf = %lf\n", **x, **y, multiplication(**x, **y)); break;
        case '/':printf("%lf / %lf = %lf\n", **x, **y, division(**x, **y)); break;
        default:printf("bad operator!");
    }
    return 0;
}

void newcalc(char* restart,double* x, char* opp, double* y)
{
    while (restart != (char*)'N')
    {
        readcalc(&x, &opp, &y);
        switchfunk(&x, &opp, &y);
        printf("New Calc? (Y,N) \n");
        fflush(stdin);
        scanf("%c", &restart);
        if (restart != (char*)'Y'&&restart != (char*)'N')
        {
            printf("Bad input!");
        }
    }
}

double readcalc(double** x,char** opp,double** y)
{
    printf("\n Type your calculation!(z.B.4+7)\n");
    scanf("%lf%c%lf",x,opp,y);
    return 0;
}

double addition(double a,double b)
{
    double c = 0;
    c = a + b;
    return c;
}

double subtraction(double a, double b)
{
    double c = 0;
    c = a - b;
    return c;
}

double multiplication(double a, double b)
{
    double c = 0;
    c = a*b;
    return c;
}

double division(double a, double b)
{
    double c = 0;
    c = a / b;
    return c;
}

最好的问候!

【问题讨论】:

  • 为什么要传递指针和指针以及指针和...这么多指针。只通过char 也足够了。它也会让你感到困惑。
  • 技术上在stdin 上调用fflush 是未定义的行为。一些平台定义了这种行为,但如果您希望您的代码具有可移植性,请不要这样做。
  • 那么为什么要在main函数中本地声明变量,并将它们作为指针传递给newcalc函数,而不是仅仅在需要它们的地方声明变量(即在本地newcalc函数)?
  • 使用一些函数指针数组。
  • 编译所有警告和调试信息(例如gcc -Wall -g)。了解如何使用调试器(例如gdb

标签: c function pointers function-pointers calculator


【解决方案1】:

您的代码中有很多问题,其中大部分与您对指针的使用有关。这是一个问题:

newcalc 函数中,您在循环中有以下条件:

restart != (char*)'N'

不会按你预期的那样工作,事实上它总是是真的并且给你一个无限循环。

原因是restart 是一个指针,它指向main 函数中局部restart 变量的位置。它永远不会(char *) 'N'(指向地址78的指针)相同。

如何解决这个具体问题?首先,不要将其作为参数,将其声明为本地(非指针!)变量:

char restart = 'y';

然后在循环条件下正常使用

while (restart == 'y' || restart == 'Y') { ... }

为了提示更多指针问题,还记得scanf 想要一个指向存储值的变量的指针吗?

但是在例如readcalc 函数中的变量 xoppy 是指向数据存储位置的指针,但您将这些指向指针的指针传递给 scanf

scanf("%lf%c%lf",x,opp,y);

在这里,您应该使用指针作为readcalc 函数的参数,而不是指向指针的指针。

也就是说,应该声明为

double readcalc(double*,char*,double*);

在(不必要的)使用指针和指向指针的过程中,您很可能还有许多其他问题,但这些才是真正突出的问题。

【讨论】:

  • restart 是指向 char 的指针。他正在使用该地址,而他应该取消引用它*restart 以使用它。
  • restart 函数内newcalc()
  • @CroCo 我质疑 需要 它是一个指针,根本没有。就像不需要将它作为参数传递给函数一样。
【解决方案2】:

我认为您在滥用指针并使用地址而不是值本身。此外,您正在使用指向指针的指针,而您不需要这样做。看看下面的代码。

#include <stdio.h>
#include <stdlib.h>
void newcalc (char*,double*,char*,double*);
double switchfunk(double*, char*, double*);
double readcalc(double*,char*,double*);
double addition(double,double);
double subtraction(double,double);
double multiplication(double,double);
double division(double,double);

int main()
 {
    double a=0, b=0;
    char op='R', restart = 'Y';
    newcalc(&restart,&a,&op,&b);
    fflush(stdin);
    getchar();
return 0;
}
double switchfunk (double* x, char* opp, double* y)
{
    printf("\n ---CALCULATOR--- \n\n\n");
    switch ( *opp )
    {
        case '+':
                    printf("%lf + %lf = %lf\n", *x, *y, addition(*x, *y)); 
                    break;
        case '-':
                    printf("%lf - %lf = %lf\n", *x, *y, subtraction(*x, *y)); 
                    break;
        case '*':
                    printf("%lf * %lf = %lf\n", *x, *y, multiplication(*x, *y)); 
                    break;
        case '/':
                    printf("%lf / %lf = %lf\n", *x, *y, division(*x, *y));
                    break;
        default:printf("bad operator!");
    }

    return 0;
}
void newcalc(char* restart,double* x, char* opp, double* y)
{

    while ( *restart == 'Y' || *restart == 'y')
    {
        readcalc(x, opp, y);
        switchfunk(x, opp, y);
        printf("New Calc? (Y,N) \n");
        fflush(stdin);
        scanf("%c", restart);
        // if (restart != (char*)'Y'&&restart != (char*)'N')
        // {
            // printf("Bad input!");
        // }
    }
}

double readcalc(double* x,char* opp,double* y)
{
    printf("\n Type your calculation!(z.B.4+7)\n");
    scanf("%lf%c%lf",x,opp,y);
    return 0;
}

double addition(double a,double b)
{
    return a + b;
}
double subtraction(double a, double b)
{
    return a - b;
}
double multiplication(double a, double b)
{
    return a*b;
}
double division(double a, double b)
{
    return a / b;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2021-11-30
    • 2021-08-10
    • 1970-01-01
    • 2013-02-20
    相关资源
    最近更新 更多