需要帮助在我的C编程中定义函数

时间:2009-10-29 21:54:57

标签: c

我正在学习C函数并尝试编写一个简单的脚本,根据用户输入的数字输出lettergrade。然而,我收到以下错误,我无法弄清楚我缺少的地方......

102809.c: In function ‘function_points’:
102809.c:44: error: ‘lettergrade’ redeclared as different kind of symbol
102809.c:41: error: previous definition of ‘lettergrade’ was here
102809.c:47: error: ‘A’ undeclared (first use in this function)
102809.c:47: error: (Each undeclared identifier is reported only once
102809.c:47: error: for each function it appears in.)
102809.c:49: error: syntax error before ‘lettergrade’ 

如果你能提供指导,我将不胜感激。我将此脚本与简单的C函数脚本进行比较,它们看起来很相似:(

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

//prototype
int function_points (char);

int main (void)
{
    //use a do or while loop to continue asking for user input, asking user to input test score. 
    //0 = quit

    int points; //this is student's points, we call this via scanf
    int counter; //our counter variable to increase loop
    char lettergrade;
    counter = 0;

    do {
        printf("Enter the student's points:  (0 to quit): ");
        scanf("%d", &points);
        printf("%d points = %c grade \n", points, function_points(lettergrade)); //declare function
        counter++;
    } while (points != 0); 
    //counter --;


    printf("Press any key to continue...");

    getchar();
    getchar();
    return 0;
}

//function definition
int function_points (char lettergrade)
{
    int points;
    char lettergrade;

    if (points < 90 && points > 100) 
        lettergrade = A;
    else if (points < 80 && points > 89 
             lettergrade = B;
    else if (points < 70 && points > 79 
             lettergrade = C;
    else if (point < 60 && point > 69) 
             lettergrade = D;
    else 
    {
             lettergrade = F;
    }
    return lettergrade;
}

8 个答案:

答案 0 :(得分:10)

此:

int function_points (char lettergrade)
{
    int points;
    char lettergrade;

您将函数参数重新声明为局部变量。你不需要这样做(也不能那样做)。只需从上面的代码段中删除最后一行。

您是否偶然使用了一些预先ANSI C的C书(例如K&amp; R 1st ed。)?这个错误看起来像是一个混合的ANSI和旧的K&amp; R声明。如果是这种情况,请查找更新的书籍。

此外,这:

if (points < 90 && points > 100) 
    lettergrade = A;
else if (points < 80 && points > 89 
             lettergrade = B;
else if (points < 70 && points > 79 
             lettergrade = C;
else if (point < 60 && point > 69) 
             lettergrade = D;
else 
{
             lettergrade = F;
}

这段代码正如我所写的那样,正试图引用变量 ABC等等。您可能想要的是字符 - 那些将是写作'A''B''C'等 - 单引号。

答案 1 :(得分:3)

  1. lettergrade是一个参数,所以你不应该有char lettergrade;在功能体中。
  2. lettergrade ='A';不是lettergrade = A;
  3. 您在if语句中缺少括号
  4. 你的逻辑是不正确的,因为你已经切换了小于和大于符号:if(点&lt; 90&amp;&amp;&gt; 100)应该是if(点&gt; 89&amp;&amp; points&lt; = 100)(假设您希望90-100成为A)
  5. 您应该处理边界条件(使用&lt; =在上限上)
  6. “point”未定义

答案 2 :(得分:0)

//function definition
int function_points (char lettergrade)
{
    int points;
    char lettergrade;  -- You can not redeclare this lettergrade here.

把它扔出去再试一次。

答案 3 :(得分:0)

除了其他帖子:

lettergrade = F;

语法不正确。那不应该编译。那是你在哪里收到错误 - 编译?

正确的语法是:

lettergrade = 'F';

答案 4 :(得分:0)

a)如果你有一个char作为传递的参数,你不必再重新声明它。删除function_points第2行中的lettergrade声明。

b)没有像A这样的文字。反而使用'A'。

答案 5 :(得分:0)

只是一个小问题,但您在函数中访问的“点”是该函数的本地,而不是Main中的版本。你需要将它传递给points_function才能使用它。

答案 6 :(得分:0)

除了其他答案之外,它看起来好像是function_points()的参数应该是'int points'而不是'char lettergrade',所以你没有在函数中使用未初始化的变量:

int function_points(int points)
{
    char lettergrade;

    if (points < 90 && points > 100)
        lettergrade ='A';
    else if (points < 80 && points > 89)
        lettergrade = 'B';
    else if (points < 70 && points > 79)
        lettergrade = 'C';
    else if (point < 60 && point > 69) 
        lettergrade = 'D';
    else 
    {
        lettergrade = 'F';
    }
    return lettergrade;
}

当然,您必须在主函数之前更改声明。在某些条件之后,还有一些缺少密切的括号。

此外,在main()中,您将function_points()的use(调用)标记为声明;这不是宣言。

答案 7 :(得分:0)

你的函数应该返回一个char并接受一个int。或者它可以将char作为数字,而不是ascii,即:

char pointsToLetterGrade(unsigned int points)

{

char returnValue ='A';

// (or you can use a bunch of if branches like in your code snippet)
while (points < 90 && returnValue < 'F')
{
    ++returnValue;
    points += 10;
}

return returnValue;

}

在函数头中,char是返回类型,pointsToLetterGrade是函数名,unsigned int points是函数接收的数据。另外需要注意的是,关于“lettergrade = A;”...计算机将char视为BYTE,它在内存中具有ascii值的数字表示。要将字符视为其ascii值,请用单引号将其括起来。即'L'或'4'或'A'。如果您尝试将“char letter”分配给A,编译器将认为A是变量。

希望这有用。