Что не так с моим кодом? CS50 Pset2: читаемость - PullRequest
0 голосов
/ 06 августа 2020

1 - Я не знаю, что не так с моим кодом, это ## help ## читаемость CS50 pset2. 2- Проблема, похоже, в функции с плавающей запятой (струнной). 3- Я новичок, и это мой второй раз, когда я кодирую C, поэтому, если я пропустил что-то важное, сообщите мне, или если у вас есть какие-либо советы, которые улучшат мой код, спасибо!

   //Libraries
    #include <cs50.h>
    #include <ctype.h>
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    
    //Functions
    int count_letters(string letter);
    int count_words(string word);
    int count_sentences(string sentence);
    float grade(string grade);
    
    int main(void)
    {
        string par = get_string("text: ");
    }
    
    
    int count_letters(string letter)
    {
        int letters = 0;
        for (int i = 0, n = strlen(letter); i < n; i++)
            {
                 if (isalpha(letter[i]))
                      letters++;
            } 
        return letters;
    }
    
    
    int count_words(string word)
    {
        int words = 1;
        int spaces = 0;
        int nword;
        nword = strlen(word);
        for (int i = 0; i < nword; i++)
            {
                 if (isspace(word[i]))
                      spaces++;
                      words = spaces + 1;
            }
        return words;
    }
    
    
    int count_sentences(string sentence)
    {
        int sentences = 0;
        int nsentence;
        nsentence = strlen(sentence);
        for (int i = 0; i < nsentence; i++)
            {
                 if (sentence[i] == '.' || sentence[i] == '!' || sentence[i] == '?')
                      sentences++;
            }
        return sentences;
    }
    
    
    float grade(string grade)
    {
        //here comes my problem. variables like letters, words, and sentences are "undeclared identifier"
     float x = 0.0588 * (100 * letters / words) - 0.296 * (100 * sentences / words) - 15.8;
                 if (x < 16 && x >= 0)
                    {
                      printf("Grade %i\n", (int) round(x));
                    }
                 else if (x >= 16)
                    {
                      printf("Grade 16+\n");
                    }
                 else
                    {
                      printf("Before Grade 1");
                    }
    }               

1 Ответ

0 голосов
/ 06 августа 2020

Компилятор сообщает вам, в чем именно заключается проблема: вы не объявили letters, words или sentences в функции grade.

Объявления этих переменных в другие функции являются локальными для этих функций - они не видны изнутри функции grade.

Однако у вас есть пара более серьезных проблем. Во-первых, ни одна из ваших функций не вызывается откуда угодно - main считывает строку, а затем немедленно завершает работу, не делая ничего другого. Во-вторых, grade не может узнать, какие значения должны быть в letters, words или sentences.

Что вы вероятно хотите сделать вызывает ваши функции подсчета изнутри grade, например:

float grade( string s )
{
  int letters = count_letters( s );
  int words = count_words( s );
  int sentences = count_sentences( s );

  float x = ...;
  ...
}

, а затем вызывает grade из main как

int main( void )
{
  string par = get_string( "Text: " );
  grade( par );
}

В качестве альтернативы вы можете вызвать каждый из подсчет функций из main и передача результатов в виде аргументов в grade:

int main( void )
{
  string par = get_string( "Text: " );

  int letters = count_letters( par );
  int words = count_words( par );
  int sentences = count_sentences( par );

  grade( letters, words, sentences );
}

, и в этом случае объявление и определение grade должно быть

float grade( int, int, int ); // declaration

float grade( int letters, int words, int sentences ) // definition
{                                                    // since they are declared as arguments,
  float x = ...;                                     // there's no need to declare them in the body of the function
}

Теперь вот вопрос - собираетесь ли вы, чтобы кто-нибудь использовал значение x после выхода grade? Если это так, тогда вам нужно добавить

return x;

в конец grade.

Если нет, то измените тип возвращаемого значения функции с float на void в как декларация, так и определение:

void grade( string ); 

void grade( string s ) { ... } // definition
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...