【问题标题】:Beginner Functions in CC中的初学者函数
【发布时间】:2017-02-14 20:05:47
【问题描述】:

我的程序计算用户提供的两个数字的和、差、商和乘积。在我的代码中,我在 main 函数中使用打印语句向用户提供此信息,但是,我试图找出一种方法来使用我可以简单调用的函数以便向用户打印该过程的所有结果。我是函数新手,因此将不胜感激。非常感谢。

//declare functions
int firstuserinput(void);
int seconduserinput(void);
int calcSum(int, int);
int calcProduct(int, int);
int calcDifference(int, int);
int calcQuotient(int, int);

#include <stdio.h>

int main()
{
    int sum, product, difference, quotient, num1, num2;
    num1=firstuserinput();
    num2=seconduserinput();

    sum = calcSum(num1, num2);
    product = calcProduct(num1, num2); 
    difference = calcDifference(num1, num2);
    quotient = calcQuotient(num1, num2);

    printf("\nThe sum of the two numbers: %d\n", sum );
    printf("The product of the two numbers: %d\n", product);
    printf("The difference of the two numbers: %d\n", difference);
    printf("The quotient of the two numbers: %d", quotient);    

}
//Input Functions
int firstuserinput()
{
    int num1; 
    printf("Please enter a number: ");
    scanf("%d", &num1);
    return num1;   
}

int seconduserinput()
{
    int num2;
    printf("Please enter another number: ");
    scanf("%d", &num2);
    return num2; 
}
//Process functions
int calcSum(int x, int y)
{
    return x+y;


}

int calcProduct(int x, int y)
{
    return x*y;


}

int calcDifference(int x, int y)
{
    return x-y;


}

int calcQuotient(int x, int y)
{
    return x/y; 


} 

【问题讨论】:

  • 您是说您想采用代码底部的printf 语句并创建一个执行此操作的函数吗?
  • 是的,而不是将 printf 语句放在 main 中,我想知道如何获取这些语句并将它们放入单个函数中。
  • 我希望你能看到没有必要firstuserinput() seconduserinput() 因为他们做的事情完全一样。这就是函数的美妙之处:泛化操作。您可以将它们都替换为类似的 intuserinput() 函数。但是,我不明白为什么需要一个函数来打印所有结果。当y == 0时也要小心return x/y;
  • 是的,我希望能够将所有输入放入一个函数中,但我不知道如何让该函数在 main 中工作?

标签: c function clang


【解决方案1】:

创建一个获取结果并打印出来的函数:

void printResults(int sum, int product, int difference, int quotient) {
    printf("\nThe sum of the two numbers: %d\n", sum );
    printf("The product of the two numbers: %d\n", product);
    printf("The difference of the two numbers: %d\n", difference);
    printf("The quotient of the two numbers: %d", quotient);
}

主要:

   ...
    printResults(sum, product, difference, quotient);
}

【讨论】:

    【解决方案2】:

    您可以将此功能扩展到其他运算符:

    void printResult(char operator, int result) {
    char *op;
    switch(operator)
    {
    case '+':
    op="Sum";
    break;
    case '-':
    op="difference";
    break;
    case '*':
    op="multiplication";
    break;
    case '/':
    op="division";
    break;
    }
    printf("The %s of the two numbers: %d",op, result);
    }
    

    【讨论】:

      【解决方案3】:

      我认为你能为自己做的最好的事情就是学习伪代码。例如,首先不要编写任何实际的应用程序代码。相反,坐下来写下程序的行为。您当前程序的一个示例是:

      • 接受输入第一个数字
      • 接受输入第二个数字
      • 计算总和
      • 计算产品
      • 计算差异
      • 计算
      • 打印结果

      现在,您要做的是隔离动词。由于函数根据定义是由代码执行的动作,而简单英语的动词是一个动作,所以用简单的英语写下您希望程序执行的操作并挑选出动词是识别函数候选者的好方法。在这种情况下,我们有接受输入、计算和打印。接下来,您希望尽可能地概括它们,隔离在不同版本的动作之间变化的部分,并将这些变化的部分变成变量,同时牢记您使用的语言的限制。

      例如,C(和大多数现代语言)只能返回一个值。创建一个同时执行所有操作的Calculate 函数远非不可能,但由于 C 不会从函数返回多个值,因此您必须定义一个包含四个整数的结构或将指针传递给整数而不是值,以便您可以更改实际数字而不仅仅是它们的副本。我将在此处详细说明功能版本。函数定义如下所示:Calculate(int lvalue, int rvalue, int *sum, int *product, int *difference, int *quotient)。要理解这一点,你需要知道,当你调用一个函数时,你传入的参数默认是传值。这意味着您将数据的副本发送到要操作的函数。当您使用 * 符号将 指针 传递给数据时,您将向函数发送内存中数据的 位置,从而允许您(除其他外)直接修改值而不是使用数据的副本。这意味着您可以通过在函数中执行*sum = lvalue + rvalue 之类的操作来为内存中的该位置分配一个值。这是一个更高级的选项,因为指针的强大功能和许多细微差别,但您应该认真考虑研究。你真正想学的越多,你就会发现越多。编程最令人兴奋的事情是学习永无止境。您可以随心所欲地潜水。

      也就是说,让我们看看剩下的——而且更简单的——动词。接受输入 - 具体来说,接受数字输入 - 可以通过两种方式完成。使用指针,您可以创建一个返回void 并接受int* 而不仅仅是int 的函数。在该函数中,您将读取用户输入(并希望检查它是否有错误并确保它实际上是一个数字)并一次性将其分配给int*。如果你能掌握指针,你会让你的生活更轻松,无论是在课堂上还是在课外。诸如确保指针指向一个值之类的事情浮现在脑海中。函数定义看起来像void AcceptInput(int *value),前两行看起来更像这样:

      AcceptInput(&num1);
      AcceptInput(&num2);
      

      AcceptInput 函数的更简单版本可能看起来更像您现在所拥有的。读取输入,检查以确保它是一个有效的数字,然后返回结果。因为您只返回一个值,所以应该选择更简单的代码,除非您有充分的理由选择其他代码。在几乎所有情况下,我都会亲自选择此选项。您的函数定义如下所示:int AcceptInput(); 并且您的第一行代码将发生细微的变化:

      num1 = AcceptInput();
      num2 = AcceptInput();
      

      顺便说一句,我还想借此机会指出其他一些事情。我个人会避免对变量使用无意义的名称。 num1到底是什么?这意味着什么?立即踢这种做法。始终将变量命名为仅通过查看它应该做什么或应该做什么就可以清楚地看到它。拥有一个包含无意义变量名的整个程序是一种很好的方式,可以让调试变得比必须的要困难得多,并且让那些在继承代码后必须维护代码的人感到沮丧。请注意,这是一个风格上的建议,但无论是在我的大学生活还是在我的职业生涯中,这都会让回顾旧代码变得不那么痛苦。

      最后一个动词是Print。我们在打印什么?结果。我本可以将不同类型的结果(商、差等)分开,但我们最终还是会出现在同一个地方:它们都在打印一种结果,我们会将它们简化为“打印结果” ” 无论如何。那么现在怎么办?好吧,让我们定义函数。它不会返回任何东西。它需要知道它正在打印的结果。所以定义看起来像void PrintResults(int sum, int product, int difference, int quotient);。注意这次没有*s;我们只需要价值观。我们没有改变任何东西,所以传递值的副本而不是内存位置就足够了。

      这个答案真的很长,其中一些可能有点混乱(我刚醒来),但我真诚地希望我的答案能教会你一些东西,并鼓励你提出更多问题,深入研究,更多地研究 C。 C 是大多数现代语言的祖先;对它(以及之后的 C++)有扎实的理解将为您提供快速掌握大多数其他语言所必需的构建块。编码愉快!

      【讨论】:

        【解决方案4】:
        #include <stdio.h>
        #define PI 3.14
        
        int main()
        {
            int  a,b,c,d;
            printf("The first integer is:");
            scanf("%d",&a);
            printf("The second integer is:");
            scanf("%d",&b);
            c=add(a,b);
            d=sub(a,b);
            printf("The sum of a and b is %d and the difference is %d",c,d);
        }
            int add (int a,int b)
        
            {
        
               return (a+b);
            }
            int sub (int a,int b)
        
            {
        
               return(a-b);
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-12
          • 1970-01-01
          相关资源
          最近更新 更多