martes, 4 de enero de 2011

Kernighan_Ritchie_1.10 (Sustitución de Retrocesos, Tabuladores y Diagonales Invertidas)

_____________________________________________________________________________________
1.10 Escriba un programa que copie su entrada a la salida, reemplazando cada tabulación por \t, cada retroceso por \b y cada diagonal invertida por \\. Esto hace que las tabulaciones y los espacios sean visibles sin confusiones.
_____________________________________________________________________________________
SOLUCIÓN:
Este programa es simple. En los comentarios aparece el algoritmo.

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+                                                                         +
+  Este programa recibe una cadena y la imprime sustituyendo tabuladores  +
+ por \t, retrocesos por \b y las diagonales invertidas por  \            +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+                                                                         +
+                          ALGORITMO:                                     +
+                                                                         +
+  Se requiere una variable:                                              +
+     c (caracter leido)                                                  +
+                                                                         +
+  Lee un caracter (c)                                                    +
+                                                                         +
+  Mientras c sea distinta de EOF                                         +
+  {                                                                      +
+  si el caracter es tabulador                                            +
+     Imprime \t                                                          +
+  si el caracter es retroceso                                            +
+     Imprime \b                                                          +
+  si el caracter es diagonal invertida                                   +
+`    Imprime \                                                           +
+  si el caracter no es ninguno de los anteriores                         +
+     Imprime el caracter                                                 +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

#include <stdio.h>
  
/*/////////////////////////////////////////////////////////
// MAIN
//////////////////////////////////////////////////////////*/
 
int main()
   
{                    /* Abre main */
printf("\nEste programa toma una cadena como entrada y la manda como salida sustituyendo ");
printf("los tabuladores por \\t, los retrocesos por \\b y las diagonales invertidas por \\.\n");
printf("\nIntroduzca una cadena, EOF para terminar:\n");
 
int c;
int letra = 1; /* La variable letra se pone en 1 (si), sirve para indicar
 Si se trata o no de un caracter diferente a los 
 buscados. Primero se evalua cada uno de los casos
 y solo si en el curso de la evaluacion ( enunciados if)
 se cambia a 0, entonces no se imprime con putchar. */

while ( (c = getchar()) !=  EOF )
{   /* Abre while */

letra = 1;

if ( '\t' == c)
{
printf("\\t");
letra = 0;
}

if ( '\b' == c)
{
printf("\\b");
letra = 0;
}

if ( '\\' == c)
{
printf("\\");
letra = 0;
}

if ( 1 == letra )
{
putchar(c);
}

}      /* Cierra while*/
}     /* Cierra main */

________________________________________________________________________________
Esta entrada es parte de los problemas resueltos del libro El Lenguaje de Programación C de B. Kernighan y D. Ritchie.
Entrada Anterior
Entrada Siguiente

8 comentarios:

  1. Hola disculpa que te moleste de nuevo es solo una duda simple hice el programa y si imprime correctamente el tabulador (\t) y la diagonal invertida(\) pero el retroceso no se como hacer para ponerlo para que imprima, si le doy un espacio atrás (backspace)no imprime (\b), se pone de alguna manera en especial como el EOF(contrl + z)? El programa esta iwal al tuyo

    ResponderEliminar
  2. Una duda es necesario la variable letra para hacer la comparación al ultimo para el putchar? Porque igual si no se cumple ningún if solo imprimes el carácter y sigue comparando hasta que alguno coincida y lo imprime ya se \t, \\ o \b. Corri el programa como lo tienes aqui y no me da la lectura del \\ y pues el \b no se como escribirlo para que lo pueda leer para imprimirlo. Saludos

    ResponderEliminar
  3. Disculpa tu programa esta correcto el problema fue mi compu a veces como que se bloquea y no corre bien los programas borre el programa lo volví a escribir y ya funciono con excepción del \b. Todo lo demas esta perfecto

    ResponderEliminar
    Respuestas
    1. ¡Hola, Rafael! A mí tampoco me está imprimiendo \b, aunque puede ser que no estoy poniendo bien el retroceso. Creo que sólo se toma lo que está en la pantalla al momento de dar enter, y por alguna razón no aparece la tecla de retroceso.

      Eliminar
  4. ok entonces existira alguna forma de imprimir \b?

    ResponderEliminar
    Respuestas
    1. Imprimir sí se puede, revisa esta entrada. Lo que no sé es introducir el retroceso desde el teclado.

      Eliminar
  5. yo tampoco, ya investigue incluso con un maestro de c y java y no sabe.

    ResponderEliminar
    Respuestas
    1. Quizas puedan encontrar una solución con fflush en stdio.h
      printf("\b");
      fflush(stdout);

      Eliminar

Related Posts Plugin for WordPress, Blogger...