martes, 4 de enero de 2011

Kernighan_Ritchie_1.12 (Recibir cadena e imprimir palabra por linea)

______________________________________________________________________________________________
1.12 Escriba un programa que imprima su entrada una palabra por línea.
______________________________________________________________________________________________
SOLUCIÓN: Este programa recibe la cadena y la imprime palabra por línea, para hacer esto se usa las funciones getchar() y putchar(). El único punto en el que puede haber confusión es con el uso de la variable 'anterior', que controla los saltos de línea: si ya se ha cambiado y no se imprimió nada, entonces no se debe de saltar más. Si hay dos o más espacios en blanco '', tabuladores '\t' o saltos de línea '\n' consecutivos, se considera como si se tratara de uno sólo. Es bueno ejecutar este programa con un archivo de texto como entrada para apreciar lo anterior.


/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*                                                                        * 
*                                                                        *
*   ESTE PROGRAMA RECIBE UNA CADENA DE CARACTERES Y LA IMPRIME PONIENDO  *
*   CADA PALABRA EN UNA LINEA DISTINTA                                   * 
*                                                                        *
* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
 

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 *                                                                                       +
 *                                    ALGORITMO:                                         +
 *  Pedir una cadena de caracteres al usuario                                            +
 *  Recibir la cadena caracter por caracter                                              +
 *  Si el caracter recibido es distinto a un espacio en blanco ' ', '\t' o salto de linea+
 *  '\n', imprimir el caracter                                                           +
 *  De lo contrario: si no has hecho un salto de linea, cambiar de linea                 +
 *  Si ya se ha hecho un salto de linea, entonces permanece en la linea actual           +
 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

# include <stdio.h>

/*////////////////////////////////////////////////////////
// main
/////////////////////////////////////////////////////////*/

int main()
{     // Abre main
int c;
int anterior = 'b'; /*Esta variable controla los saltos de linea
inicialmente se considera que ya se ha hecho un salto, y por lo tanto
hay que escribir en la linea actual */

printf("\nEste es un programa que recibe una cadena como entrada y da como salida la misma");
printf(" cadena escribiendo cada palabra en una linea distinta.\n");
printf("\nEOF para terminar.\n\n");
 
while ((c = getchar()) != EOF)
{       /* Abre while */

if ( ' ' != c && '\n' != c && '\t' != c)
{      /*Abre if*/
anterior = 'l';
putchar(c);
}      /*Cierra if*/
else
{   /* Abre else */
if ( 'l' == anterior ) /*Si no se ha cambiado de linea*/
{   /*Abre if*/
printf("\n");
anterior = 'b';        /*Indica que ya se ha cambiado de linea*/
}       /* Cierra if */
}
}         /* Cierra while */

}      /* Cierra main   */

_________________________________________________________________________________
Aquí un ejemplo de ejcución:
Entrada

Puedo escribir los versos más
tristes esta noche

Salida:

Este es un programa que recibe una cadena como entrada y da como salida la misma cadena escribiendo cada palabra en una linea distinta.

EOF para terminar.

Puedo
escribir
los
versos
más
tristes
esta
noche

__________________________________________________________________________________
Esta entrada forma parte de los problemas resueltos del libro EL Lenguaje de Programación C.
Entrada Anterior
Entrada Siguiente

1 comentario:

  1. Perfecto.
    El ejercicio lo realicé algo diferente pero viene siendo lo mismo.

    Tengo un par de dudas:
    Los operadores || OR y && AND no cumplen la función "que leeríamos", ya que si leemos exactamente la función.

    if ( ' ' != c && '\n' != c && '\t' != c)
    si (argumento AND argumento AND argumento)
    con AND deberían de estar todas las condiciones.
    A mi entender debería de cumplir un OR no un AND
    si (argumento OR argumento OR argumento)

    Otro asunto importante son los estados, ya que si no los incluimos y realizamos multiples espacios o tabuladores (para probar posibles errores en el programa) estos se escriben.

    ResponderEliminar

Related Posts Plugin for WordPress, Blogger...