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

10 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
    Respuestas
    1. Es tremendamente tarde para responder, pero da igual; creo que no es posible que el carácter "\b" (es decir, de retroceso) se imprima al momento de eliminar un carácter al momento de estar escribiendo; lo que hice fue inicializar en 0 una variable de tipo int llamada "itr", esta misma la usé dentro el bucle while() de la siguiente manera:
      if(itr == 1){
      c = '\t';
      }else if(c == 2){
      c = '\b';
      }else(c == 3){
      c = '\\';
      }
      Y al final de bucle, está la siguiente línea:
      itr++;
      Como puedes observar, según el valor que tenga itr, la variable c obtendrá un nuevo valor diferente, y lo que nos interesa es que la terminal muestre \b cada vez que c obtenga este valor al inicio.

      Eliminar
  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
  6. El código esta muy bien planteado pero tiene un error.
    En la parte de la diagonal invertida (\) la variable letra ha de ser 1.

    Explicación:
    Falta una diagonal invertida para añadir pero que se soluciona añadiendo la escritura misma de la diagonal inversa (\) del getchar().
    Esta solución no substituye (\) por (\\).

    Mi solución es la siguiente (aunque he tenido dudas sobre el tema):
    #include

    main()

    {
    int c;

    while ((c=getchar())!=EOF)
    {
    if (c!='\t')
    {
    if (c!='\\')
    putchar(c);
    }
    if (c=='\t')
    printf("\\t");

    if (c=='\\')
    printf("\\""\\");

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

    Mi duda es la siguiente:
    En la sección del:
    if (c=='\\')
    printf("\\""\\"); <--- ¿Porque no es posible escribirlo asi: printf("\\\");?

    IMPORTANTE:
    Tanto este programa como el anterior especifican que "escribe un programa que copie su entrada a la salida". Esto me da a pensar el porque no nos funciona el \b (borrado) ya que no escribe según tecleamos (ENTRADA A LA SALIDA) sino que escribe según lo escrito. Creo que este error es un planteamiento del ejercicio y por eso no se puede substituir el borrado por \b.

    ResponderEliminar

Related Posts Plugin for WordPress, Blogger...