2009-10-29 53 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是一個變量。

希望這是有幫助的。