Нужна помощь в определении функций в моем C-программировании - PullRequest
0 голосов
/ 30 октября 2009

Я изучаю функции 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;
}

Ответы [ 8 ]

10 голосов
/ 30 октября 2009

Это:

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

Вы переделываете аргументы своей функции как локальные переменные. Вам не нужно этого делать (и вы не можете этого сделать). Просто удалите последнюю строку из приведенного выше фрагмента.

Вы случайно пользуетесь какой-нибудь книгой на языке C, которая является пре-ANSI C (например, K & R 1st ed.)? Ошибка выглядит как смешанная декларация ANSI и старая K & 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;
}

Этот код, как написано, пытается ссылаться на переменные A, B, C и т. Д. То, что вы, вероятно, хотите, это символы - они будут записаны как 'A', 'B', 'C' и т. Д. - в одинарных кавычках.

3 голосов
/ 30 октября 2009
  1. lettergrade является аргументом, поэтому вы не должны использовать char lettergra; в теле функции.
  2. lettergrade = 'A'; не буквенное обозначение = A;
  3. Вы пропускаете скобки в выражениях if
  4. Ваша логика неверна, поскольку вы поменяли знаки «меньше» и «больше»: if (точки <90 && points> 100) должны быть if (точки> 89 && points <= 100) (при условии, что вы хотите 90-100 быть а) </li>
  5. Вы должны обработать граничные условия (используйте <= на верхней границе) </li>
  6. «точка» не определена
0 голосов
/ 30 октября 2009

Ваша функция должна возвращать символ и принимать int. Или он может принимать в качестве символа число, а не 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;" ... Компьютер обрабатывает символ как БАЙТ, который имеет числовое представление значения ascii в памяти. Чтобы рассматривать символ как значение ascii, вы заключаете его в одинарные кавычки. то есть «L» или «4» или «A». Если вы попытаетесь присвоить букву «char» для A, компилятор будет думать, что A является переменной.

Надеюсь, это полезно.

0 голосов
/ 30 октября 2009

Помимо других ответов, мне кажется, что аргумент функции 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 () как объявление; это не декларация там.

0 голосов
/ 30 октября 2009

Просто второстепенная точка, но «точки», к которым вы обращаетесь в своей функции, являются локальными для этой функции, а не версии в Main. Вам нужно передать это в функцию points_ для того, чтобы оно им воспользовалось.

0 голосов
/ 30 октября 2009

а) Если вы передали параметр char в качестве переданного параметра, вам не нужно повторно его объявлять. Удалите буквенное объявление в строке function_points 2.

b) Нет такого литерала, как А. Используйте вместо него 'A'.

0 голосов
/ 30 октября 2009

В дополнение к другим постам:

lettergrade = F;

неверный синтаксис. Это не должно компилироваться. Это где вы получаете ошибку - компиляция?

Правильный синтаксис:

lettergrade = 'F';
0 голосов
/ 30 октября 2009
//function definition
int function_points (char lettergrade)
{
    int points;
    char lettergrade;  -- You can not redeclare this lettergrade here.

Выбросьте это и попробуйте снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...