// Programación en C++ para Ingenieros, Ed. Thomson Paraninfo, 2006
// Capítulo 5: Subprogramas: Acciones y funciones


#include <iostream>

// Para poder usar las funciones de caracter
#include <ctype.h>

using namespace std;

char saltarSeparadores(char c);
bool esPalabra(char c);
void pasarPalabra(char &c, int& numLetras);


int main(void)
{

      cout << "Entra un texto acabado en '.'" << endl;

      // Leemos la primera letra
      char letra;
      cin.get(letra);

      // Saltamos los posibles separadores o simbolos de
      // puntuacion que pueda haber al inicio de
      // la frase (¿, ¡, espacios...)
      letra = saltarSeparadores(letra);

      // Inicializamos los contadores
      int numLetrasTot = 0, numPalabras = 0;

      // Bucle principal
      while (letra != '.')
      {
            int numLetras;

            // Si tenemos una palabra la pasamos toda
            // mientras contamos sus letras
            if (esPalabra(letra))
                  pasarPalabra(letra, numLetras);

            numPalabras++;
            numLetrasTot += numLetras;

            // Pasamos los separadores que pueda haber
            letra = saltarSeparadores(letra);
      }

      // Mostramos los resultados
      cout << "El total de palabras es: " << numPalabras << endl;
      if (numPalabras != 0)
            cout << "La media de letras por palabra es: "
                   << float(numLetrasTot)/numPalabras << endl;
      else
            cout << "La media de letras por palabra es: 0" << endl;


      return 0;
}


// Salta todos los simbolos de puntuacion y espacios en
// blanco hasta que llega a una letra o digito
// Devuelve el primer caracter no separador
char saltarSeparadores(char c)
{
      while (!isalpha(c) && c != '.')
            cin.get(c);

      return c;
}

// Devuelve cierto si es una letra o digito
bool esPalabra(char c)
{
      return (bool(isalnum(c)));
}

// Pasa toda la palabra y cuenta los caracteres que tiene
// Devuelve el primer caracter que no forma parte de ella
void pasarPalabra(char &c, int& numLetras)
{
      numLetras = 0;
      while (isalnum(c))
      {
            cin.get(c);
            numLetras++;
      }
}