MerlinMR Ответов: 3

Мой цикл for не работает. Кто-нибудь может мне помочь?


#include <stdio.h>
#include <string.h>
#include <math.h>

int main(void)
{
char text[100];
printf("Enter text:\n");
scanf("%s",&text[100]);

//Loop to count letters words and sentences

int letters = 0;
int words = 0;
int sentences = 0;
int n = strlen (text);
for (int i=0 ; i<n ;="" i++)
{
="" if="" 
="" ((text[i]="">= 'A' && text[i] <= 'Z') || (text[i] >= 'a' && text[i] <= 'z'))
  {
  letters++;
  }
  else if 
  ((i==0 && text[i]!= ' ') ||(i != n-1 && text[i]==' ' && text[i+1]!=' '))
  {
  words++;
  }
  else if 
    (text[i] == '.' || text[i] == '!' || text[i] == '?')
  {
  sentences++;
  }
}

printf("\nLetters: %i\nWords: %i\nSentences: %i\n", letters, words, sentences);

float L = (letters / (float) words) * 100;
printf("Average No. of letters: %f\n", L);
float S = (sentences / (float) words) * 100;
printf("Average No. of sentences: %f\n", S);
float grade = (0.0588 * L) - (0.296 * S) - 15.8;
printf ("G:%f\n",grade);
  if (grade <= 16 )
  {
  printf("Grade %i\n", (int)grade);
  }
  else if (grade > 16)
  {
  printf("Grade 16+\n");
  }
  else
  {
  printf("Before Grade 1\n");
  }

}


Что я уже пробовал:

Может ли кто-нибудь сказать, в чем проблема с этим кодом?
Я пробовал использовать цикл for и цикл while, но мой цикл не выполняется. В чем же причина ?
Мой цикл for не выполняется.

Rick York

Я рекомендую вам взглянуть на функции isalpha и isdigit. Они могут позаботиться о большей части вашей условной логики. Есть несколько других связанных функций, которые также могут помочь.

Вы понимаете, что есть и другие формы пунктуации, такие как запятые и двоеточия, верно?

Наконец, я настоятельно рекомендую вам научиться считывать данные из файлов. Это сэкономит вам много времени на вводе текста, так что вы можете потратить его на написание кода и его отладку. Я не могу этого достаточно подчеркнуть. Вы будете рады, что сделали это.

3 Ответов

Рейтинг:
27

OriginalGriff

Ну ... да. И это довольно очевидно, если вы подумаете об этом.

Вы объявляете массив для хранения строки, которую вводит пользователь (на вашем месте я бы сделал его больше - вполне нормально, что даже одно предложение превышает 100 символов, а это так):

char text[100];
Но потом вы читаете строку в конце ее:
scanf("%s",&text[100]);
test[100] - это элемент вне массива: индексы массива выполняются от 0 до N-1, где N-количество элементов в массиве.
Поэтому вы говорите системе, чтобы она считывала данные в "случайную память", а не в область, которую вы для этого выделили.
Когда вы входите в свой цикл, вы пытаетесь использовать исходное пространство массива и не находите в нем никаких полезных данных.

Измените его на этот:
scanf("%s",text);
И это должно помочь, потому что имя массива-это указатель на первый элемент.

Вы бы заметили это почти сразу, если бы использовали отладчик, чтобы посмотреть, что делает ваш код во время выполнения ...


Рейтинг:
2

MerlinMR

Я ее разгадал. Спасибо всем !!

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <ctype.h>


int main(void)

{

    char text[1000];
    char* fgets(char *text, int length, FILE * stream);
    puts("Enter text:");
    fgets(text,sizeof(text),stdin);

    int letters =  0, words = 0, sentences = 0, n = strlen(text);
    
//Loop to count letters words and sentences

    for (int i = 0 ; i < n ; i ++)
    {
        if (isalpha(text[i]))
        {
            letters++;
        }
        else if (text[i] == 32 && (text[i - 1] != 33 && text[i - 1] != 46 && text[i - 1] != 63))
        {
            words++;
        }
        else if (text[i] == '.' || text[i] == '!' || text[i] == '?')
        {
            sentences++;
            words++;
        }
    }

    printf("\nLetters: %i\nWords: %i\nSentences: %i\n", letters, words, sentences);

// Coleman-Liau index computation using the formula

    float L = (letters / (float) words) * 100;
    printf("Average No. of letters: %f\n", L);
    float S = (sentences / (float) words) * 100;
    printf("Average No. of sentences: %f\n", S);
    float index = round(0.0588 * L - 0.296 * S - 15.8);

// Finally outputs the result to the user

    if (index < 1)
    {
        printf("Before Grade 1\n");
    }
    else if (index >= 16)
    {
        printf("Grade 16+\n");
    }
    else
    {
        printf("Grade %i\n", (int) index);
    }
}


Рейтинг:
13

Patrice T

Попробуй

scanf("%s",&text);

Цитата:
Я пробовал использовать цикл for и цикл while, но мой цикл не выполняется. В чем же причина ?

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.