В современном C коде практически единственный способ получить исключение с плавающей запятой - это сделать целое деление на ноль. Да, я имею в виду "целое число". С арифметикой с плавающей точкой c вы просто получаете бесконечность или, возможно, NaN, если дивиденд уже был NaN.
У вас есть:
int number;
int words = 0, i;
int sentences = 0, j;
float l = number / words * 100;
float s = sentences / words * 100;
int index = 0.0588 * l - 0.296 * s - 15.8;
int grade = round(index);
Вы не можете рассчитать l
или s
до тех пор, пока вы не подсчитаете количество букв (вы не делаете это правильно, когда попробуете, позже, но пока это отдельное обсуждение), а также количество слов и количество предложений. C не помнит, как сделать расчет позже; это происходит при инициализации l
и s
. А поскольку words
равно нулю, вы получаете исключение с плавающей запятой, потому что делите на ноль.
Выполните вычисление l
и s
после вычисления number
, words
, sentences
. И вам, вероятно, нужно выполнить операцию с плавающей запятой - поэтому вам нужно конвертировать words
(или number
и sentences
) в double
(или float
, если вы настаиваете, но используйте double
, если нет непреодолимая причина не делать этого.
Вам также необходимо исправить вычисления index
и grade
. В частности, присвоение index
усекает (не округляет) значение; функция round()
не используется, поскольку ввод является целым числом.
int number;
int words = 0, i;
int sentences = 0, j;
…count letters, words, sentences…
double l = number / (double)words * 100;
double s = sentences / (double)words * 100;
int grade = round(0.0588 * l - 0.296 * s - 15.8);
Обратите внимание, что strlen(text)
не дает количество букв. Он дает количество символов (строго в байтах), включая пробелы (перевод строки, пробелы), знаки препинания и цифры.
Я не убежден в подсчете слов и предложений, но это то, что вам нужно нужно пересмотреть самостоятельно. Частично это зависит от того, насколько хороши входные данные. Я думаю, что ваш код будет неправильно сосчитать странные последовательности ... но я могу ошибаться !! (Эта тройная точка и этот двойной восклицательный знак были неверно учтены?)