2016-04-27 6 views
1

Я пытаюсь считать символы, слова, строки абзацами на C от stdin.Подсчет символов, слов, строк абзацев в C

что-то не работает, и я не знаю почему.

#include <stdio.h> 

int main(int argc, char const *argv[]) 
{ 
    int pCount=0, parCount=0, cCount=0, lCount=0; 
    double prom=0; 
    char c; 
    int newln_cnt=0; 
    while ((c=getchar())!=EOF){ 
     cCount++; 
     switch (c) 
     { 
      case '\n': 
       newln_cnt++; 
       lCount++; 
       if (newln_cnt == 2) 
       { 
        parCount++; 
        newln_cnt = 0; 
       } 
       break; 
      case ' ': 
       pCount++; 
       break; 
     }    
    } 
    prom = (cCount/pCount); 
    printf("Total caracteres: %d \n", cCount); 
    printf("Cantidad palabras: %d \n", pCount); 
    printf("Cantidad líneas: %d \n", lCount); 
    printf("Cantidad párrafos: %d \n", parCount); 
    printf("Promedio longitud palabra: %f \n", prom); 
    return 0; 
} 

Это своего рода работа с персонажами (на нем показано меньше). но в остальном все плохо.

Вход:

Oid, mortales, el grito sagrado: 
"Libertad, libertad, libertad!" 

Oid el ruido de rotas cadenas, 
ved en trono a la noble igualdad. 

Ya su trono dignisimo abrieron 
las Provincias Unidas del Sud 

y los libres del mundo responden: 
"Al gran pueblo argentino, salud! 
Al gran pueblo argentino, salud!" 

Y los libres del mundo responden: 
"Al gran pueblo argentino, salud!" 

Sean eternos los laureles 
que supimos conseguir, 
que supimos conseguir. 

Coronados de gloria vivamos... 
o juremos con gloria morir!, 
o juremos con gloria morir!, 

o juremos con gloria morir! 

Ожидаемое Ouput:

Total caracteres: 558 
Cantidad palabras: 87 
Cantidad líneas: 25 
Cantidad párrafos: 8 
Promedio longitud palabra: 4.966 

мой Ouput:

Total caracteres: 557 
Cantidad palabras: 69 
Cantidad líneas: 24 
Cantidad párrafos: 12 
Promedio longitud palabra: 8.000 

Программа подсчитывает количество символов, слов, строк и абзацев (два nsecutive '\ n'). и длину слова среднего размера.

+1

'обугленного с;' 'должны быть ИНТ с;'. –

+2

Вы никогда не увеличиваете 'cCount'. 'pCount' - фактически количество пробелов, которое не совсем такое же, как количество слов. И представьте, что произойдет, если вы введете 3 строки без пробелов, что бы тогда было «pcount»? –

+0

В вашем вопросе есть определенный прогресс, но ваш ввод слишком длинный для отладки. –

ответ

2

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

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

int main(void){ 
    int pCount=0, parCount=0, cCount=0, lCount=0;//word, paragraph, character, line 
    int abCount = 0;//alphabet 
    double prom=0; 
    int c;//It should be int. 
    char pprev = '\n', prev = '\n'; 

    while ((c=getchar())!=EOF){ 
     ++cCount; 
     if(isalpha(c)) 
      ++abCount; 
     if(isspace(c)){ 
      if(c == '\n'){ 
       ++lCount; 
      } 
     } else if(isspace(prev)){//isspace(prev) && !isspace(c) : edge of top of word 
      ++pCount; 
      if(pprev == '\n' && prev == '\n'){//edge of top of paragraph 
       ++parCount; 
      } 
     } 
     pprev = prev; 
     prev = c; 
    } 
    if(prev != '\n'){//If the file is not terminated by newline 
     ++lCount; 
    } 

    prom = (double)abCount/pCount;//(cCount - spcCount - punctCount)/pCount 
    printf("Total caracteres: %d \n", cCount); 
    printf("Cantidad palabras: %d \n", pCount); 
    printf("Cantidad lineas: %d \n", lCount); 
    printf("Cantidad parrafos: %d \n", parCount); 
    printf("Promedio longitud palabra: %.3f \n", prom); 
    return 0; 
} 
+0

Строго говоря, это должен быть счетчик слова, чтобы удалить разделитель. – BLUEPIXY

-2

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

#include <stdio.h> 

int main(int argc, char const *argv[]) 
{ 
    double pCount=0, parCount=0, cCount=0, lCount=0; 
    double prom=0; 
    char c; 
    int newln_cnt=0; 
    while ((c=getchar())!=EOF){ 
     switch (c) 
     { 
      case '\n': 
       newln_cnt++; 
       lCount++; 
       if (newln_cnt == 2) 
       { 
        parCount++; 
        newln_cnt = 0; 
       } 
       break; 
      case ' ': 
       pCount++; 
       break; 
     }    
    } 
    prom = (cCount/pCount); 
    printf("Total caracteres: %f \n", cCount); 
    printf("Cantidad palabras: %f \n", pCount); 
    printf("Cantidad líneas: %f \n", lCount); 
    printf("Cantidad párrafos: %f \n", parCount); 
    printf("Promedio longitud palabra: %f \n", prom); 
    return 0; 
} 

Теперь, когда программа компилируется, то вы можете приспособиться к любому типы лучше для вас программы, у вас может даже быть свой собственный тип.

Известная программа, которая работает как ваша программа, является wc - количество слов и является частью стандартных библиотек Unix.

+2

Почему использование типов с плавающей запятой здесь лучше, чем целые? – dreamlax

+0

@dreamlax _ "Promedio longitud palabra" _ означает _average_ –

+1

@ Programmer400 _average word length_ –

0

Я вижу несколько проблем в коде: подсчитывать

  1. Пунктов: не задан newln_cnt 0, если прочитать символ отличается от \n. Это будет отсчитывать один абзац каждый раз, когда считываются два \n.

  2. Количество пробелов: вы считаете, что только ' ' символов, вы можете пропустить другие символы пробела, такие как \ t ou не разбивающееся пространство. рассмотрите возможность использования функции isspace().

  3. Средняя длина линии: вы делите два целых числа, чтобы получить поплавок, рассмотреть литье:

    prom = (float)cCount/(flao)pCount; 
    

Мой совет: начните с коротким текстом (3 слов в строке, 5 линии), и отладчик.

 Смежные вопросы

  • Нет связанных вопросов^_^