【问题标题】:Calculator using switch and functions in C在 C 中使用开关和函数的计算器
【发布时间】:2013-08-23 02:05:15
【问题描述】:

这是我们今天的练习,也是我们第一次在课堂上编写调用函数。这些是给我们的指示:

  1. 我必须制作一个 C 程序计算器,其中包含以下选项:0 - 退出、1 - 加、2 - 减、3 - 乘和 4 - 除。
  2. 一旦用户输入他们的选择,我会要求他们提供两个数字。
  3. 我需要为每个算术运算使用函数。
  4. 当我完成计算后,它应该会返回菜单。
  5. 程序仅在用户选择 0 时结束。

这是我已经编辑了很多的程序。

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

int add(int, int);
int sub(int, int);
int mul(int, int);
int div(int, int);

int main(){
int num1, num2, choice;

printf("[0] Exit\v[1] Add\v[2] Subtract\v[3] Multiply\v[4] Divide");
scanf("%d", &choice);

switch(choice){
    case 0:
        return 0;
        break;
    case 1:
        printf("Enter 1st number:\n");
        scanf("%d", &num1);
        printf("Enter 2nd number:\n");
        scanf("%d", &num2);
        printf("%d", add(num1,num2));
        break;
    case 2:
        printf("Enter 1st number:\n");
        scanf("%d", &num1);
        printf("Enter 2nd number:\n");
        scanf("%d", &num2);
        printf("%d ", sub(num1,num2));
        break;
    case 3:
        printf("Enter 1st number:\n");
        scanf("%d", &num1);
        printf("Enter 2nd number:\n");
        scanf("%d", &num2);
        printf("%d", mul(num1,num2));
        break;
    case 4:
        printf("Enter 1st number:\n");
        scanf("%d", &num1);
        printf("Enter 2nd number:\n");
        scanf("%d", &num2);
        printf("%d", div(num1,num2));
        break;
    default:
        printf("That is not a valid choice.");
        break;
}
    //Addition
int add(int x,int y){
    int z = x + y;
    return z;
}   
//Subtraction
int sub(int a,int b){
    int c = a - b;
    return  c;
}   
//Multiplication
int mul(int d,int e){
    int f = d * e;
    return f;
    }
//Division
int div(int g,int h){
    int i = g / h;
    return i;
}
}

目前,只有两个错误: [错误] 'div' 的类型冲突 和 以前的“div”声明在这里

【问题讨论】:

  • 这显然不会编译。所以显然它需要改进。如果您不了解其中一条编译器消息的用途以及您的代码错误的原因,请提出该问题。否则让代码编译然后运行它,看看它是否工作(它不会......但你可能会更好地了解原因)。
  • 我已经编辑过了,但我总是得到这个错误:[Error] 'div'的类型冲突
  • 不需要那些 add 等函数...直接使用操作符即可。并且不要重复 printf 和 scanf 来获取数字......在切换之前执行它们,或者将它们放入函数中。
  • 在 C 中你不能在另一个函数中定义一个函数
  • 初学者可以从这里获得帮助-> Program to create calculator using functions

标签: c function switch-statement calculator


【解决方案1】:

“我已经编辑过了,但我总是得到这个错误:[Error] 'div'的类型冲突”

=> 因为函数名 div() 已经在 stdlib.h 中定义了。

你应该用另一个名字重命名它。

例如:除法(int, int);

【讨论】:

  • 哦。谢谢你!
  • 或摆脱 stdlib:你从 stdlib 调用什么函数,这样你需要在你的代码中包含它?
  • 更好:只需使用/ 并摆脱该功能;没必要。
  • @Jim: 使用 functions 而不是操作数,整个 switch 结构可以很容易地删除,而不是一个指向函数的指针数组,这将 (a) 是可扩展的, (b) 避免大量共享代码,并且 (c) 可能会在下一课中。
  • 数组相比switch没有优势,也是可扩展的,不需要重复代码。
【解决方案2】:

编程的一个基本原则是 D.R.Y. = 不要重复自己。如果您在多个位置看到相同的代码以相同的方式重复,那么这意味着您可以将它分组到一个不错的函数中。您可以通过不在每个数学函数中分配变量来节省一些空间,只需返回数学公式即可。

另外,如果这是一个连续循环,您可能应该使用这样的循环

while(true) {
...
}

如果用户输入 0 则退出

【讨论】:

    【解决方案3】:

    你有一个巨大的编码问题:

    int sum = 添加; //

    这没有任何意义——您将函数指针 (add) 分配给 int (sum)

    你只是想要(稍后在代码中):

    printf("%d\n", add(num1, num2);
    

    你让代码太复杂了——简单很好

    【讨论】:

    • 我也刚刚意识到这一点。我现在已经编辑了我的代码,但它仍然有错误。
    • 正是你想亲吻的原因(保持简单傻),这样你就可以专注于真正的问题。
    【解决方案4】:

    顺便说一句,您有语法错误。你的函数main() 看起来像:

    int main(void) {
       ...whatever...
       switch (choice) {
         ...whatever...
       }
    
    int add() {
             ...
    }
    
    ...whatever...
    
    } /* wrong place for closing '}' (this closes the "main() {" block */
    

    你的代码的结果是add()、sub()等函数都定义在main()的body里面,这是错误的。

    【讨论】:

      【解决方案5】:

      你的函数声明应该在主函数之外。所以关闭main函数,而不是定义add、sub、mul、div。它将解决错误。 使用循环一次又一次地做一些过程。 为避免代码冗余,您可以创建一个获取输入值并将其存储在内存地址中的函数。在任何你想要的地方调用这个函数,而不是重复代码。

      您可以在下面找到一个函数名称 getData,它从用户那里获取两个值并将其存储在传递给该函数的内存地址中。调用程序将传递必须存储这些值的内存地址。

      编写代码时的一些准则:

      1.) Write DRY(Dont Repeat Yourself) type code.
      2.) Use only required header files. stdio.h is enough to do basic programming in your case.
      

      简单的工作代码:

      #include<stdio.h>
      
      // Function Prototype
      int add(int, int);
      int sub(int, int);
      int mul(int, int);
      int div(int, int);
      void getData(int *, int *);
      
      // Main Function
      int main()
      {
          int num1, num2, choice;
          while(1)
          {
            printf("\n[0] Exit\n[1] Add\n[2] Subtract\n[3] Multiply\n[4] Divide\nEnter Your Choice:");
            scanf("%d", &choice);
            switch(choice)
            {
               case 0:
                 return 0;
               case 1:
                 getData(&num1, &num2); // get Input Values
                 printf("%d", add(num1,num2));
                 break;
               case 2:
                 getData(&num1, &num2); // get Input Values       
                 printf("%d ", sub(num1,num2));
                 break;
               case 3:
                 getData(&num1, &num2); // get Input Values       
                 printf("%d", mul(num1,num2));
                 break;
               case 4:
                 getData(&num1, &num2); // get Input Values
                 printf("%d", div(num1,num2));
                 break;
               default:
                 printf("That is not a valid choice.");
                 break;
            }
          }
      }
      
      // Get Memory Address of num1, num2 and store input values in those locations.
      void getData(int *num1_ptr, int *num2_ptr)
      {
      printf("Enter 1st number:\n");
          scanf("%d", num1_ptr);
      printf("Enter 2nd number:\n");
          scanf("%d", num2_ptr);
      }
      
      //Addition
      int add(int x,int y)
      {   return x+y;   }   
      
      //Subtraction
      int sub(int x,int y)
      {   return  x-y;  }   
      
      //Multiplication
      int mul(int x,int y)
      {   return x*y;   }
      
      //Division
      int div(int x,int y)
      {   return x/y;   }
      

      【讨论】:

        【解决方案6】:
        #include<stdio.h>
        #include<math.h>
        int add(int, int);
        int sub(int, int);
        int mul(int, int);
        float dib(float, float);
        
        int main(){
        int num1, num2, choice;
        
        printf("1:addiction\n2:substraction\n3:multiplication\n4:division\n0:exit\nplease enter your choice:");
        scanf("%d", &choice);
        
        switch(choice){
            case 0:
                return 0;
                break;
            case 1:
                printf("Enter 1st number:\n");
                scanf("%d", &num1);
                printf("Enter 2nd number:\n");
                scanf("%d", &num2);
                printf("%d", add(num1,num2));
                break;
            case 2:
                printf("Enter 1st number:\n");
                scanf("%d", &num1);
                printf("Enter 2nd number:\n");
                scanf("%d", &num2);
                printf("%d ", sub(num1,num2));
                break;
            case 3:
                printf("Enter 1st number:\n");
                scanf("%d", &num1);
                printf("Enter 2nd number:\n");
                scanf("%d", &num2);
                printf("%d", mul(num1,num2));
                break;
            case 4:
                printf("Enter 1st number:\n");
                scanf("%d", &num1);
                printf("Enter 2nd number:\n");
                scanf("%d", &num2);
                printf("%f", dib(num1,num2));
                break;
            default:
                printf("That is not a valid choice.");
                break;
        }
                }
        
            //Addition
        int add(int x,int y){
            int z = x + y;
            return z;
        }
        //Subtraction
        int sub(int a,int b){
            int c = a - b;
            return  c;
        }
        //Multiplication
        int mul(int d,int e){
            int f = d * e;
            return f;
            }
        //Division
        float dib(float g,float h){
            float i = g / h;
            return i;
        }
        

        【讨论】:

          猜你喜欢
          • 2013-02-20
          • 2021-12-14
          • 1970-01-01
          • 2021-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-29
          相关资源
          最近更新 更多