2009-10-29 66 views
0

我正在学习C函数,并试图编写一个简单的脚本,根据用户输入的编号输出一个lettergrade。然而,我收到以下错误,我想不通,我欠缺的......需要帮助在我的C编程中定义函数

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; 
} 
+3

我只是想鼓励你在问题解决后接受答案。它向其他人表明,问题解决了您的满意度,并允许其他人在出现类似问题时看到答案。 – 2009-10-29 22:01:42

+0

好的没问题我会这样做:) – HollerTrain 2009-10-29 22:03:49

回答

10

此:

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

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

你是否偶然使用了一些C语言之前是ANSI C的书(例如K & R第一版)?像混合的ANSI和旧的K声明f就是这样,找一本更新的书。

而且,这样的:

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'等 - 用单引号。

+0

我以为我不得不声明这些变量,因为函数在int main之外? – HollerTrain 2009-10-29 21:58:57

+0

'lettergrade'是一个函数参数。你在编写'int function_points(char lettergrade)'时已经声明了它 - 你给它一个名字和一个类型。 – 2009-10-29 22:00:20

+0

当我删除这两个变量声明时,我得到一个错误,说我还没有声明我的变量。 102809.c:函数'function_points': 102809.c:46:错误:'点'未申报(首次在此函数中使用) 102809。c:46:error:(每个未声明的标识符只报告一次 102809.c:46:错误:对于它显示的每个函数) 102809.c:47:错误:'A'未声明(首次在此函数中使用) 102809.c:49:error:'lettergrade'之前的语法错误 – HollerTrain 2009-10-29 22:00:24

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

扔掉这个,然后再试一次。

0

除了其他职位:

lettergrade = F; 

是不正确的语法。这不应该编译。那是你在哪里接受错误 - 汇编?

正确的语法是:

lettergrade = 'F'; 
0

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

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

+0

哦,好的。所以,因为我在int main中声明char lettergrade,这是否意味着我不必在函数中重新声明? – HollerTrain 2009-10-29 22:05:49

+0

您将它声明为函数参数。 函数是一个封闭的实体,它只能看到来自外部的参数或全局变量(在包括主函数的函数之外声明的那些变量)。 – bua 2009-10-29 22:09:50

3
  1. lettergrade是一个参数,所以你不应该有chargradegrade;在函数体中。
  2. lettergrade ='A'; not lettergrade = A;
  3. 你缺少括号在你的if语句
  4. 你的逻辑不正确,因为你已经关掉你的小于和大于号:如果(点< 90个& &点> 100)应该是如果(点> 89 & &点< = 100)(假设你要90-100作为A)
  5. 您应该处理的边界条件(使用< =的上限)
  6. “点” 是不明确的
+0

啊是的伟大的一点! – HollerTrain 2009-10-29 22:09:12

0

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

0

在和其他的答案上面,它看起来我好像参数function_points()应该是“INT点”,而不是“字符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()的使用(调用)标记为声明;这不是一个声明。

0

你的函数应该返回一个字符并取int。或者,它可以在一个char为数字,不ASCII,即:

char pointsToLetterGrade(unsigned int points) 

{

炭的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点是函数发生在另外一个要注意的数据,关于“lettergrade = A;“......计算机将char视为一个BYTE,它在内存中有一个ascii值的数字表示形式。要将字符视为其ASCII值,可以用单引号将其包围。即'L'或'4'或'A'。如果你尝试给A赋“字母”,编译器会认为A是一个变量。

希望这是有帮助的。